/// Tunnel device file descriptor.
private var tunnelFileDescriptor: Int32? {
- var buf = [CChar](repeating: 0, count: Int(IFNAMSIZ))
+ var ctlInfo = ctl_info()
+ withUnsafeMutablePointer(to: &ctlInfo.ctl_name) {
+ $0.withMemoryRebound(to: CChar.self, capacity: MemoryLayout.size(ofValue: $0.pointee)) {
+ _ = strcpy($0, "com.apple.net.utun_control")
+ }
+ }
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") {
+ var addr = sockaddr_ctl()
+ var ret: Int32 = -1
+ var len = socklen_t(MemoryLayout.size(ofValue: addr))
+ withUnsafeMutablePointer(to: &addr) {
+ $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
+ ret = getpeername(fd, $0, &len)
+ }
+ }
+ if ret != 0 || addr.sc_family != AF_SYSTEM {
+ continue
+ }
+ if ctlInfo.ctl_id == 0 {
+ ret = ioctl(fd, CTLIOCGINFO, &ctlInfo)
+ if ret != 0 {
+ continue
+ }
+ }
+ if addr.sc_id == ctlInfo.ctl_id {
return fd
}
}