]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
ipc: deduplicate some unix-specific code
authorDavid Crawshaw <crawshaw@tailscale.com>
Sat, 2 May 2020 06:28:33 +0000 (16:28 +1000)
committerJason A. Donenfeld <Jason@zx2c4.com>
Sat, 2 May 2020 08:05:41 +0000 (02:05 -0600)
Cleans up and splits out UAPIOpen to its own file.

Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
[zx2c4: changed const to var for socketDirectory]
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
ipc/uapi_bsd.go
ipc/uapi_linux.go
ipc/uapi_unix.go [new file with mode: 0644]

index a74a7edaea930fd63aee023353c93f1ede80a042..d552a5effe56e32ea3ab4605091c349c35270edd 100644 (file)
@@ -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()
-}
index dce6a45785afec1855f6958c4c1456dae3d03cd9..70d4d0c0028fad49d787487f8a1b4fbf66211f49 100644 (file)
@@ -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 (file)
index 0000000..a59c390
--- /dev/null
@@ -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()
+}