wireguard-go-bridge: use C string instead of gostring_t

Signed-off-by: Andrej Mihajlov <and@mullvad.net>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Andrej Mihajlov 2020-02-07 12:31:42 +01:00 committed by Jason A. Donenfeld
parent edde27a0a0
commit 30406dec6d
3 changed files with 10 additions and 18 deletions

View File

@ -70,7 +70,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
} }
ifnamePtr.deallocate() ifnamePtr.deallocate()
wg_log(.info, message: "Tunnel interface is \(self.ifname ?? "unknown")") 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 { if handle < 0 {
wg_log(.error, message: "Starting tunnel failed with wgTurnOn returning \(handle)") wg_log(.error, message: "Starting tunnel failed with wgTurnOn returning \(handle)")
errorNotifier.notify(PacketTunnelProviderError.couldNotStartBackend) errorNotifier.notify(PacketTunnelProviderError.couldNotStartBackend)
@ -146,18 +147,10 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
#if os(iOS) #if os(iOS)
if let packetTunnelSettingsGenerator = packetTunnelSettingsGenerator { if let packetTunnelSettingsGenerator = packetTunnelSettingsGenerator {
_ = packetTunnelSettingsGenerator.endpointUapiConfiguration().withGoString { return wgSetConfig(handle, $0) } _ = packetTunnelSettingsGenerator.endpointUapiConfiguration()
.withCString { return wgSetConfig(handle, $0) }
} }
#endif #endif
wgBumpSockets(handle) wgBumpSockets(handle)
} }
} }
extension String {
func withGoString<R>(_ call: (gostring_t) -> R) -> R {
func helper(_ pointer: UnsafePointer<Int8>?, _ call: (gostring_t) -> R) -> R {
return call(gostring_t(p: pointer, n: utf8.count))
}
return helper(self, call)
}
}

View File

@ -84,7 +84,7 @@ func wgSetLogger(loggerFn uintptr) {
} }
//export wgTurnOn //export wgTurnOn
func wgTurnOn(settings string, tunFd int32) int32 { func wgTurnOn(settings *C.char, tunFd int32) int32 {
logger := &device.Logger{ logger := &device.Logger{
Debug: log.New(&CLogger{level: 0}, "", 0), Debug: log.New(&CLogger{level: 0}, "", 0),
Info: log.New(&CLogger{level: 1}, "", 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") logger.Info.Println("Attaching to interface")
device := device.NewDevice(tun, logger) 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 { if setError != nil {
logger.Error.Println(setError) logger.Error.Println(setError)
return -1 return -1
@ -137,12 +137,12 @@ func wgTurnOff(tunnelHandle int32) {
} }
//export wgSetConfig //export wgSetConfig
func wgSetConfig(tunnelHandle int32, settings string) int64 { func wgSetConfig(tunnelHandle int32, settings *C.char) int64 {
device, ok := tunnelHandles[tunnelHandle] device, ok := tunnelHandles[tunnelHandle]
if !ok { if !ok {
return 0 return 0
} }
err := device.IpcSetOperation(bufio.NewReader(strings.NewReader(settings))) err := device.IpcSetOperation(bufio.NewReader(strings.NewReader(C.GoString(settings))))
if err != nil { if err != nil {
device.Error.Println(err) device.Error.Println(err)
return err.ErrorCode() return err.ErrorCode()

View File

@ -10,13 +10,12 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
typedef struct { const char *p; size_t n; } gostring_t;
typedef void(*logger_fn_t)(int level, const char *msg); typedef void(*logger_fn_t)(int level, const char *msg);
extern void wgEnableRoaming(bool enabled); extern void wgEnableRoaming(bool enabled);
extern void wgSetLogger(logger_fn_t logger_fn); 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 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 char *wgGetConfig(int handle);
extern void wgBumpSockets(int handle); extern void wgBumpSockets(int handle);
extern const char *wgVersion(); extern const char *wgVersion();