diff options
Diffstat (limited to 'ipc/uapi_linux.go')
-rw-r--r-- | ipc/uapi_linux.go | 81 |
1 files changed, 5 insertions, 76 deletions
diff --git a/ipc/uapi_linux.go b/ipc/uapi_linux.go index a3c95ca..1562a18 100644 --- a/ipc/uapi_linux.go +++ b/ipc/uapi_linux.go @@ -1,31 +1,18 @@ /* SPDX-License-Identifier: MIT * - * Copyright (C) 2017-2019 WireGuard LLC. All Rights Reserved. + * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved. */ package ipc import ( - "errors" - "fmt" "net" "os" - "path" "golang.org/x/sys/unix" "golang.zx2c4.com/wireguard/rwcancel" ) -var socketDirectory = "/var/run/wireguard" - -const ( - IpcErrorIO = -int64(unix.EIO) - IpcErrorProtocol = -int64(unix.EPROTO) - IpcErrorInvalid = -int64(unix.EINVAL) - IpcErrorPortInUse = -int64(unix.EADDRINUSE) - socketName = "%s.sock" -) - type UAPIListener struct { listener net.Listener // unix socket listener connNew chan net.Conn @@ -64,7 +51,6 @@ func (l *UAPIListener) Addr() net.Addr { } func UAPIListen(name string, file *os.File) (net.Listener, error) { - // wrap file in listener listener, err := net.FileListener(file) @@ -84,10 +70,7 @@ func UAPIListen(name string, file *os.File) (net.Listener, error) { // watch for deletion of socket - socketPath := path.Join( - socketDirectory, - fmt.Sprintf(socketName, name), - ) + socketPath := sockPath(name) uapi.inotifyFd, err = unix.InotifyInit() if err != nil { @@ -113,14 +96,15 @@ func UAPIListen(name string, file *os.File) (net.Listener, error) { } go func(l *UAPIListener) { - var buff [0]byte + var buf [0]byte for { + defer uapi.inotifyRWCancel.Close() // start with lstat to avoid race condition if _, err := os.Lstat(socketPath); os.IsNotExist(err) { l.connErr <- err return } - _, err := uapi.inotifyRWCancel.Read(buff[:]) + _, err := uapi.inotifyRWCancel.Read(buf[:]) if err != nil { l.connErr <- err return @@ -143,58 +127,3 @@ func UAPIListen(name string, file *os.File) (net.Listener, error) { return uapi, nil } - -func UAPIOpen(name string) (*os.File, error) { - - // check if path exist - - err := os.MkdirAll(socketDirectory, 0755) - if err != nil && !os.IsExist(err) { - return nil, err - } - - // open UNIX socket - - socketPath := path.Join( - socketDirectory, - fmt.Sprintf(socketName, name), - ) - - addr, err := net.ResolveUnixAddr("unix", socketPath) - if err != nil { - return nil, err - } - - oldUmask := unix.Umask(0077) - listener, err := func() (*net.UnixListener, error) { - - // initial connection attempt - - listener, err := net.ListenUnix("unix", addr) - if err == nil { - return listener, nil - } - - // check if socket already active - - _, err = net.Dial("unix", socketPath) - if err == nil { - return nil, errors.New("unix socket in use") - } - - // cleanup & attempt again - - err = os.Remove(socketPath) - if err != nil { - return nil, err - } - return net.ListenUnix("unix", addr) - }() - unix.Umask(oldUmask) - - if err != nil { - return nil, err - } - - return listener.File() -} |