diff --git a/src/config.go b/src/config.go index ad4ac97..509da58 100644 --- a/src/config.go +++ b/src/config.go @@ -9,28 +9,19 @@ import ( "strconv" "strings" "sync/atomic" - "syscall" "time" ) -const ( - ipcErrorIO = syscall.EIO - ipcErrorNoPeer = syscall.EPROTO - ipcErrorNoKeyValue = syscall.EPROTO - ipcErrorInvalidKey = syscall.EPROTO - ipcErrorInvalidValue = syscall.EPROTO -) - type IPCError struct { - Code syscall.Errno + Code int64 } func (s *IPCError) Error() string { return fmt.Sprintf("IPC error: %d", s.Code) } -func (s *IPCError) ErrorCode() uintptr { - return uintptr(s.Code) +func (s *IPCError) ErrorCode() int64 { + return s.Code } func ipcGetOperation(device *Device, socket *bufio.ReadWriter) *IPCError { diff --git a/src/main.go b/src/main.go index 4bece16..0857999 100644 --- a/src/main.go +++ b/src/main.go @@ -1,11 +1,17 @@ package main import ( + "fmt" "log" "os" "runtime" ) +func printUsage() { + fmt.Printf("usage:\n") + fmt.Printf("%s [-f/--foreground] INTERFACE-NAME\n", os.Args[0]) +} + func main() { // parse arguments @@ -13,6 +19,7 @@ func main() { var foreground bool var interfaceName string if len(os.Args) < 2 || len(os.Args) > 3 { + printUsage() return } @@ -21,6 +28,7 @@ func main() { case "-f", "--foreground": foreground = true if len(os.Args) != 3 { + printUsage() return } interfaceName = os.Args[2] @@ -28,6 +36,7 @@ func main() { default: foreground = false if len(os.Args) != 2 { + printUsage() return } interfaceName = os.Args[1] diff --git a/src/tun_linux.go b/src/tun_linux.go index a200bd8..261d142 100644 --- a/src/tun_linux.go +++ b/src/tun_linux.go @@ -1,17 +1,17 @@ package main +/* Implementation of the TUN device interface for linux + */ + import ( "encoding/binary" "errors" + "golang.org/x/sys/unix" "os" "strings" - "syscall" "unsafe" ) -/* Implementation of the TUN device interface for linux - */ - const CloneDevicePath = "/dev/net/tun" type NativeTun struct { @@ -27,9 +27,9 @@ func (tun *NativeTun) setMTU(n int) error { // open datagram socket - fd, err := syscall.Socket( - syscall.AF_INET, - syscall.SOCK_DGRAM, + fd, err := unix.Socket( + unix.AF_INET, + unix.SOCK_DGRAM, 0, ) @@ -37,17 +37,17 @@ func (tun *NativeTun) setMTU(n int) error { return err } - defer syscall.Close(fd) + defer unix.Close(fd) // do ioctl call var ifr [64]byte copy(ifr[:], tun.name) binary.LittleEndian.PutUint32(ifr[16:20], uint32(n)) - _, _, errno := syscall.Syscall( - syscall.SYS_IOCTL, + _, _, errno := unix.Syscall( + unix.SYS_IOCTL, uintptr(fd), - uintptr(syscall.SIOCSIFMTU), + uintptr(unix.SIOCSIFMTU), uintptr(unsafe.Pointer(&ifr[0])), ) @@ -62,9 +62,9 @@ func (tun *NativeTun) MTU() (int, error) { // open datagram socket - fd, err := syscall.Socket( - syscall.AF_INET, - syscall.SOCK_DGRAM, + fd, err := unix.Socket( + unix.AF_INET, + unix.SOCK_DGRAM, 0, ) @@ -72,16 +72,16 @@ func (tun *NativeTun) MTU() (int, error) { return 0, err } - defer syscall.Close(fd) + defer unix.Close(fd) // do ioctl call var ifr [64]byte copy(ifr[:], tun.name) - _, _, errno := syscall.Syscall( - syscall.SYS_IOCTL, + _, _, errno := unix.Syscall( + unix.SYS_IOCTL, uintptr(fd), - uintptr(syscall.SIOCGIFMTU), + uintptr(unix.SIOCGIFMTU), uintptr(unsafe.Pointer(&ifr[0])), ) if errno != 0 { @@ -117,18 +117,18 @@ func CreateTUN(name string) (TUNDevice, error) { // create new device var ifr [64]byte - var flags uint16 = syscall.IFF_TUN | syscall.IFF_NO_PI + var flags uint16 = unix.IFF_TUN | unix.IFF_NO_PI nameBytes := []byte(name) - if len(nameBytes) >= syscall.IFNAMSIZ { + if len(nameBytes) >= unix.IFNAMSIZ { return nil, errors.New("Name size too long") } copy(ifr[:], nameBytes) binary.LittleEndian.PutUint16(ifr[16:], flags) - _, _, errno := syscall.Syscall( - syscall.SYS_IOCTL, + _, _, errno := unix.Syscall( + unix.SYS_IOCTL, uintptr(fd.Fd()), - uintptr(syscall.TUNSETIFF), + uintptr(unix.TUNSETIFF), uintptr(unsafe.Pointer(&ifr[0])), ) if errno != 0 { diff --git a/src/uapi_linux.go b/src/uapi_linux.go index ee6ee0b..1055dca 100644 --- a/src/uapi_linux.go +++ b/src/uapi_linux.go @@ -2,11 +2,20 @@ package main import ( "fmt" + "golang.org/x/sys/unix" "net" "os" "time" ) +const ( + ipcErrorIO = int64(unix.EIO) + ipcErrorNoPeer = int64(unix.EPROTO) + ipcErrorNoKeyValue = int64(unix.EPROTO) + ipcErrorInvalidKey = int64(unix.EPROTO) + ipcErrorInvalidValue = int64(unix.EPROTO) +) + /* TODO: * This code can be improved by using fsnotify once: * https://github.com/fsnotify/fsnotify/pull/205