]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
Kit: Adapter: iterate through all FDs to find UTUN
authorJason A. Donenfeld <Jason@zx2c4.com>
Wed, 16 Jun 2021 13:56:21 +0000 (15:56 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Wed, 16 Jun 2021 13:56:21 +0000 (15:56 +0200)
This is a bit of a kludge, until I find something better. We simply
iterate through all FDs, and call getsockopt on each one until we find
the utun FD. This works, and completes rather quickly (fd is usually 6
or 7). Rather than maintain the old path for older kernels, just use
this for all versions, to get more coverage. Other techniques involve
undocumented APIs; this one has the advantage of using nothing
undocumented.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Sources/WireGuardKit/WireGuardAdapter.swift

index 0ed9b3b61d33d4f2cc26a773a4a9370da68e9442..b18769e4cd815fe715f466b7ef37828c8d1415f9 100644 (file)
@@ -57,7 +57,14 @@ public class WireGuardAdapter {
 
     /// Tunnel device file descriptor.
     private var tunnelFileDescriptor: Int32? {
-        return self.packetTunnelProvider?.packetFlow.value(forKeyPath: "socket.fileDescriptor") as? Int32
+        var buf = [CChar](repeating: 0, count: Int(IFNAMSIZ))
+        for fd: Int32 in 0...1024 {
+            var len = socklen_t(buf.count)
+            if getsockopt(fd, SYSPROTO_CONTROL, 2, &buf, &len) == 0 && String(cString: buf).hasPrefix("utun") {
+                return fd
+            }
+        }
+        return nil
     }
 
     /// Returns a WireGuard version.