EtherGuard-VPN/tun
Jason A. Donenfeld 366cbd11a4 tun: use netpoll instead of rwcancel
The new sysconn function of Go 1.12 makes this possible:

package main

import "log"
import "os"
import "unsafe"
import "time"
import "syscall"
import "sync"
import "golang.org/x/sys/unix"

func main() {
	fd, err := os.OpenFile("/dev/net/tun", os.O_RDWR, 0)
	if err != nil {
		log.Fatal(err)
	}

	var ifr [unix.IFNAMSIZ + 64]byte
	copy(ifr[:], []byte("cheese"))
	*(*uint16)(unsafe.Pointer(&ifr[unix.IFNAMSIZ])) = unix.IFF_TUN

	var errno syscall.Errno
	s, _ := fd.SyscallConn()
	s.Control(func(fd uintptr) {
		_, _, errno = unix.Syscall(
			unix.SYS_IOCTL,
			fd,
			uintptr(unix.TUNSETIFF),
			uintptr(unsafe.Pointer(&ifr[0])),
		)
	})
	if errno != 0 {
		log.Fatal(errno)
	}

	b := [4]byte{}
	wait := sync.WaitGroup{}
	wait.Add(1)
	go func() {
		_, err := fd.Read(b[:])
		log.Print("Read errored: ", err)
		wait.Done()
	}()
	time.Sleep(time.Second)
	log.Print("Closing")
	err = fd.Close()
	if err != nil {
		log.Print("Close errored: " , err)
	}
	wait.Wait()
	log.Print("Exiting")
}
2019-02-27 01:52:55 +01:00
..
wintun Change package path 2019-02-18 05:11:39 +01:00
tun_darwin.go tun: use netpoll instead of rwcancel 2019-02-27 01:52:55 +01:00
tun_freebsd.go tun: use netpoll instead of rwcancel 2019-02-27 01:52:55 +01:00
tun_linux.go tun: use netpoll instead of rwcancel 2019-02-27 01:52:55 +01:00
tun_openbsd.go tun: use netpoll instead of rwcancel 2019-02-27 01:52:55 +01:00
tun_windows.go wintun: Read/write packet size from/to exchange buffer directly 2019-02-22 16:16:14 +01:00
tun.go tun: use netpoll instead of rwcancel 2019-02-27 01:52:55 +01:00