From bc77de2acaebe8589193e621933aa42783926aad Mon Sep 17 00:00:00 2001 From: David Crawshaw Date: Sat, 2 May 2020 16:28:33 +1000 Subject: [PATCH] ipc: deduplicate some unix-specific code Cleans up and splits out UAPIOpen to its own file. Signed-off-by: David Crawshaw [zx2c4: changed const to var for socketDirectory] Signed-off-by: Jason A. Donenfeld --- ipc/uapi_bsd.go | 71 +--------------------------------------------- ipc/uapi_linux.go | 72 +---------------------------------------------- ipc/uapi_unix.go | 63 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 141 deletions(-) create mode 100644 ipc/uapi_unix.go diff --git a/ipc/uapi_bsd.go b/ipc/uapi_bsd.go index a74a7ed..d552a5e 100644 --- a/ipc/uapi_bsd.go +++ b/ipc/uapi_bsd.go @@ -9,25 +9,13 @@ package ipc import ( "errors" - "fmt" "net" "os" - "path" "unsafe" "golang.org/x/sys/unix" ) -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 @@ -84,10 +72,7 @@ func UAPIListen(name string, file *os.File) (net.Listener, error) { unixListener.SetUnlinkOnClose(true) } - socketPath := path.Join( - socketDirectory, - fmt.Sprintf(socketName, name), - ) + socketPath := sockPath(name) // watch for deletion of socket @@ -146,57 +131,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 - - if err := os.MkdirAll(socketDirectory, 0755); err != nil { - 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() -} diff --git a/ipc/uapi_linux.go b/ipc/uapi_linux.go index dce6a45..70d4d0c 100644 --- a/ipc/uapi_linux.go +++ b/ipc/uapi_linux.go @@ -6,26 +6,13 @@ 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 @@ -84,10 +71,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 { @@ -143,57 +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 - - if err := os.MkdirAll(socketDirectory, 0755); err != nil { - 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() -} diff --git a/ipc/uapi_unix.go b/ipc/uapi_unix.go new file mode 100644 index 0000000..a59c390 --- /dev/null +++ b/ipc/uapi_unix.go @@ -0,0 +1,63 @@ +// +build linux darwin freebsd openbsd + +/* SPDX-License-Identifier: MIT + * + * Copyright (C) 2017-2019 WireGuard LLC. All Rights Reserved. + */ + +package ipc + +import ( + "errors" + "fmt" + "net" + "os" + + "golang.org/x/sys/unix" +) + +const ( + IpcErrorIO = -int64(unix.EIO) + IpcErrorProtocol = -int64(unix.EPROTO) + IpcErrorInvalid = -int64(unix.EINVAL) + IpcErrorPortInUse = -int64(unix.EADDRINUSE) +) + +var socketDirectory = "/var/run/wireguard" + +func sockPath(iface string) string { + return fmt.Sprintf("%s/%s.sock", socketDirectory, iface) +} + +func UAPIOpen(name string) (*os.File, error) { + if err := os.MkdirAll(socketDirectory, 0755); err != nil { + return nil, err + } + + socketPath := sockPath(name) + addr, err := net.ResolveUnixAddr("unix", socketPath) + if err != nil { + return nil, err + } + + oldUmask := unix.Umask(0077) + defer unix.Umask(oldUmask) + + listener, err := net.ListenUnix("unix", addr) + if err == nil { + return listener.File() + } + + // Test socket, if not in use cleanup and try again. + if _, err := net.Dial("unix", socketPath); err == nil { + return nil, errors.New("unix socket in use") + } + if err := os.Remove(socketPath); err != nil { + return nil, err + } + listener, err = net.ListenUnix("unix", addr) + if err != nil { + return nil, err + } + return listener.File() +}