From 086d32186ad4bddbed8bacc7f99705c8e62a1f9d Mon Sep 17 00:00:00 2001 From: Mathias Hall-Andersen Date: Wed, 19 Jul 2017 13:12:25 +0200 Subject: Reviewed and added OSX patch The patch was provided by: Naveen Nathan The following modifications to the patch was made: - Added copyright notice - Fixed file descriptor leak in .MTU() method - Migrated to the new(er) golang.org/x/sys/unix package - Removed non-functioning Daemonize method --- src/uapi_darwin.go | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/uapi_darwin.go (limited to 'src/uapi_darwin.go') diff --git a/src/uapi_darwin.go b/src/uapi_darwin.go new file mode 100644 index 0000000..ee6ee0b --- /dev/null +++ b/src/uapi_darwin.go @@ -0,0 +1,83 @@ +package main + +import ( + "fmt" + "net" + "os" + "time" +) + +/* TODO: + * This code can be improved by using fsnotify once: + * https://github.com/fsnotify/fsnotify/pull/205 + * Is merged + */ + +type UAPIListener struct { + listener net.Listener // unix socket listener + connNew chan net.Conn + connErr chan error +} + +func (l *UAPIListener) Accept() (net.Conn, error) { + for { + select { + case conn := <-l.connNew: + return conn, nil + + case err := <-l.connErr: + return nil, err + } + } +} + +func (l *UAPIListener) Close() error { + return l.listener.Close() +} + +func (l *UAPIListener) Addr() net.Addr { + return nil +} + +func NewUAPIListener(name string) (net.Listener, error) { + + // open UNIX socket + + socketPath := fmt.Sprintf("/var/run/wireguard/%s.sock", name) + listener, err := net.Listen("unix", socketPath) + if err != nil { + return nil, err + } + + uapi := &UAPIListener{ + listener: listener, + connNew: make(chan net.Conn, 1), + connErr: make(chan error, 1), + } + + // watch for deletion of socket + + go func(l *UAPIListener) { + for ; ; time.Sleep(time.Second) { + if _, err := os.Stat(socketPath); os.IsNotExist(err) { + l.connErr <- err + return + } + } + }(uapi) + + // watch for new connections + + go func(l *UAPIListener) { + for { + conn, err := l.listener.Accept() + if err != nil { + l.connErr <- err + break + } + l.connNew <- conn + } + }(uapi) + + return uapi, nil +} -- cgit v1.2.3-59-g8ed1b