diff --git a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift index f8d87d7..fc93630 100644 --- a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift +++ b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift @@ -70,7 +70,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } ifnamePtr.deallocate() wg_log(.info, message: "Tunnel interface is \(self.ifname ?? "unknown")") - let handle = self.packetTunnelSettingsGenerator!.uapiConfiguration().withGoString { return wgTurnOn($0, fileDescriptor) } + let handle = self.packetTunnelSettingsGenerator!.uapiConfiguration() + .withCString { return wgTurnOn($0, fileDescriptor) } if handle < 0 { wg_log(.error, message: "Starting tunnel failed with wgTurnOn returning \(handle)") errorNotifier.notify(PacketTunnelProviderError.couldNotStartBackend) @@ -146,18 +147,10 @@ class PacketTunnelProvider: NEPacketTunnelProvider { #if os(iOS) if let packetTunnelSettingsGenerator = packetTunnelSettingsGenerator { - _ = packetTunnelSettingsGenerator.endpointUapiConfiguration().withGoString { return wgSetConfig(handle, $0) } + _ = packetTunnelSettingsGenerator.endpointUapiConfiguration() + .withCString { return wgSetConfig(handle, $0) } } #endif wgBumpSockets(handle) } } - -extension String { - func withGoString(_ call: (gostring_t) -> R) -> R { - func helper(_ pointer: UnsafePointer?, _ call: (gostring_t) -> R) -> R { - return call(gostring_t(p: pointer, n: utf8.count)) - } - return helper(self, call) - } -} diff --git a/wireguard-go-bridge/api-ios.go b/wireguard-go-bridge/api-ios.go index 55e1b0d..93dd323 100644 --- a/wireguard-go-bridge/api-ios.go +++ b/wireguard-go-bridge/api-ios.go @@ -84,7 +84,7 @@ func wgSetLogger(loggerFn uintptr) { } //export wgTurnOn -func wgTurnOn(settings string, tunFd int32) int32 { +func wgTurnOn(settings *C.char, tunFd int32) int32 { logger := &device.Logger{ Debug: log.New(&CLogger{level: 0}, "", 0), Info: log.New(&CLogger{level: 1}, "", 0), @@ -104,7 +104,7 @@ func wgTurnOn(settings string, tunFd int32) int32 { logger.Info.Println("Attaching to interface") device := device.NewDevice(tun, logger) - setError := device.IpcSetOperation(bufio.NewReader(strings.NewReader(settings))) + setError := device.IpcSetOperation(bufio.NewReader(strings.NewReader(C.GoString(settings)))) if setError != nil { logger.Error.Println(setError) return -1 @@ -137,12 +137,12 @@ func wgTurnOff(tunnelHandle int32) { } //export wgSetConfig -func wgSetConfig(tunnelHandle int32, settings string) int64 { +func wgSetConfig(tunnelHandle int32, settings *C.char) int64 { device, ok := tunnelHandles[tunnelHandle] if !ok { return 0 } - err := device.IpcSetOperation(bufio.NewReader(strings.NewReader(settings))) + err := device.IpcSetOperation(bufio.NewReader(strings.NewReader(C.GoString(settings)))) if err != nil { device.Error.Println(err) return err.ErrorCode() diff --git a/wireguard-go-bridge/wireguard.h b/wireguard-go-bridge/wireguard.h index e8e451b..5c30ee9 100644 --- a/wireguard-go-bridge/wireguard.h +++ b/wireguard-go-bridge/wireguard.h @@ -10,13 +10,12 @@ #include #include -typedef struct { const char *p; size_t n; } gostring_t; typedef void(*logger_fn_t)(int level, const char *msg); extern void wgEnableRoaming(bool enabled); extern void wgSetLogger(logger_fn_t logger_fn); -extern int wgTurnOn(gostring_t settings, int32_t tun_fd); +extern int wgTurnOn(const char *settings, int32_t tun_fd); extern void wgTurnOff(int handle); -extern int64_t wgSetConfig(int handle, gostring_t settings); +extern int64_t wgSetConfig(int handle, const char *settings); extern char *wgGetConfig(int handle); extern void wgBumpSockets(int handle); extern const char *wgVersion();