From bbece243dd9bb6956f75ebfbde5223e50f29aa2d Mon Sep 17 00:00:00 2001 From: Owen Date: Mon, 8 Dec 2025 12:17:11 -0500 Subject: [PATCH] Make ipc cross platform --- clients/clients.go | 6 +++--- device/tun_unix.go | 44 +++++++++++++++++++++++++++++++++++++++++++ device/tun_windows.go | 25 ++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 device/tun_unix.go create mode 100644 device/tun_windows.go diff --git a/clients/clients.go b/clients/clients.go index d5fb5f3..ed35567 100644 --- a/clients/clients.go +++ b/clients/clients.go @@ -14,6 +14,7 @@ import ( "time" "github.com/fosrl/newt/bind" + newtDevice "github.com/fosrl/newt/device" "github.com/fosrl/newt/holepunch" "github.com/fosrl/newt/logger" "github.com/fosrl/newt/netstack2" @@ -22,7 +23,6 @@ import ( "github.com/fosrl/newt/websocket" "github.com/fosrl/newt/wgtester" "golang.zx2c4.com/wireguard/device" - "golang.zx2c4.com/wireguard/ipc" "golang.zx2c4.com/wireguard/tun" "golang.zx2c4.com/wireguard/tun/netstack" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" @@ -526,13 +526,13 @@ func (s *WireGuardService) ensureWireguardInterface(wgconfig WgConfig) error { )) fileUAPI, err := func() (*os.File, error) { - return ipc.UAPIOpen(interfaceName) + return newtDevice.UapiOpen(interfaceName) }() if err != nil { logger.Error("UAPI listen error: %v", err) } - uapiListener, err := ipc.UAPIListen(interfaceName, fileUAPI) + uapiListener, err := newtDevice.UapiListen(interfaceName, fileUAPI) if err != nil { logger.Error("Failed to listen on uapi socket: %v", err) os.Exit(1) diff --git a/device/tun_unix.go b/device/tun_unix.go new file mode 100644 index 0000000..c9bab60 --- /dev/null +++ b/device/tun_unix.go @@ -0,0 +1,44 @@ +//go:build !windows + +package device + +import ( + "net" + "os" + + "github.com/fosrl/newt/logger" + "golang.org/x/sys/unix" + "golang.zx2c4.com/wireguard/ipc" + "golang.zx2c4.com/wireguard/tun" +) + +func CreateTUNFromFD(tunFd uint32, mtuInt int) (tun.Device, error) { + dupTunFd, err := unix.Dup(int(tunFd)) + if err != nil { + logger.Error("Unable to dup tun fd: %v", err) + return nil, err + } + + err = unix.SetNonblock(dupTunFd, true) + if err != nil { + unix.Close(dupTunFd) + return nil, err + } + + file := os.NewFile(uintptr(dupTunFd), "/dev/tun") + device, err := tun.CreateTUNFromFile(file, mtuInt) + if err != nil { + file.Close() + return nil, err + } + + return device, nil +} + +func UapiOpen(interfaceName string) (*os.File, error) { + return ipc.UAPIOpen(interfaceName) +} + +func UapiListen(interfaceName string, fileUAPI *os.File) (net.Listener, error) { + return ipc.UAPIListen(interfaceName, fileUAPI) +} diff --git a/device/tun_windows.go b/device/tun_windows.go new file mode 100644 index 0000000..edcd6f6 --- /dev/null +++ b/device/tun_windows.go @@ -0,0 +1,25 @@ +//go:build windows + +package device + +import ( + "errors" + "net" + "os" + + "golang.zx2c4.com/wireguard/ipc" + "golang.zx2c4.com/wireguard/tun" +) + +func CreateTUNFromFD(tunFd uint32, mtuInt int) (tun.Device, error) { + return nil, errors.New("CreateTUNFromFile not supported on Windows") +} + +func UapiOpen(interfaceName string) (*os.File, error) { + return nil, nil +} + +func UapiListen(interfaceName string, fileUAPI *os.File) (net.Listener, error) { + // On Windows, UAPIListen only takes one parameter + return ipc.UAPIListen(interfaceName) +}