]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
Refactor interface name query
authorAndrej Mihajlov <and@mullvad.net>
Fri, 19 Jun 2020 10:37:34 +0000 (12:37 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Thu, 25 Jun 2020 23:50:03 +0000 (17:50 -0600)
Signed-off-by: Andrej Mihajlov <and@mullvad.net>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift

index fc93630abcced0861f4b4f75e51603f81fd14469..2f7062fea14aae07e7865939cafbb883654d4c26 100644 (file)
@@ -62,14 +62,10 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
                     startTunnelCompletionHandler(PacketTunnelProviderError.couldNotDetermineFileDescriptor)
                     return
                 }
-                var ifnameSize = socklen_t(IFNAMSIZ)
-                let ifnamePtr = UnsafeMutablePointer<CChar>.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