From 35300d1c5f108eb9dff4999413a3f8b77211cc24 Mon Sep 17 00:00:00 2001 From: Andrej Mihajlov Date: Fri, 19 Jun 2020 12:37:34 +0200 Subject: [PATCH] Refactor interface name query Signed-off-by: Andrej Mihajlov Signed-off-by: Jason A. Donenfeld --- .../PacketTunnelProvider.swift | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift index fc93630..2f7062f 100644 --- a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift +++ b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift @@ -62,14 +62,10 @@ class PacketTunnelProvider: NEPacketTunnelProvider { startTunnelCompletionHandler(PacketTunnelProviderError.couldNotDetermineFileDescriptor) return } - var ifnameSize = socklen_t(IFNAMSIZ) - let ifnamePtr = UnsafeMutablePointer.allocate(capacity: Int(ifnameSize)) - ifnamePtr.initialize(repeating: 0, count: Int(ifnameSize)) - if getsockopt(fileDescriptor, 2 /* SYSPROTO_CONTROL */, 2 /* UTUN_OPT_IFNAME */, ifnamePtr, &ifnameSize) == 0 { - self.ifname = String(cString: ifnamePtr) - } - ifnamePtr.deallocate() + + self.ifname = Self.getInterfaceName(fileDescriptor: fileDescriptor) wg_log(.info, message: "Tunnel interface is \(self.ifname ?? "unknown")") + let handle = self.packetTunnelSettingsGenerator!.uapiConfiguration() .withCString { return wgTurnOn($0, fileDescriptor) } if handle < 0 { @@ -122,6 +118,28 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } } + private class func getInterfaceName(fileDescriptor: Int32) -> String? { + var ifnameBytes = [CChar](repeating: 0, count: Int(IF_NAMESIZE)) + + return ifnameBytes.withUnsafeMutableBufferPointer { bufferPointer -> String? in + guard let baseAddress = bufferPointer.baseAddress else { return nil } + + var ifnameSize = socklen_t(bufferPointer.count) + let result = getsockopt( + fileDescriptor, + 2 /* SYSPROTO_CONTROL */, + 2 /* UTUN_OPT_IFNAME */, + baseAddress, &ifnameSize + ) + + if result == 0 { + return String(cString: baseAddress) + } else { + return nil + } + } + } + private func configureLogger() { Logger.configureGlobal(tagged: "NET", withFilePath: FileManager.logFileURL?.path) wgSetLogger { level, msgC in