From 47f8a3d89ad0d1478246bf62140eb4fbfe83ac72 Mon Sep 17 00:00:00 2001
From: Mathias Hall-Andersen <mathias@hall-andersen.dk>
Date: Thu, 20 Jul 2017 15:06:24 +0200
Subject: [PATCH] Moved remaining platform dependent UAPI code

---
 src/config.go     | 15 +++------------
 src/main.go       |  9 +++++++++
 src/tun_linux.go  | 46 +++++++++++++++++++++++-----------------------
 src/uapi_linux.go |  9 +++++++++
 4 files changed, 44 insertions(+), 35 deletions(-)

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