Files
openclaw/apps/shared/OpenClawKit/Sources/OpenClawKit/NetworkInterfaceIPv4.swift
2026-03-02 11:32:20 +00:00

44 lines
1.6 KiB
Swift

import Darwin
import Foundation
public enum NetworkInterfaceIPv4 {
public struct AddressEntry: Sendable {
public let name: String
public let ip: String
}
public static func addresses() -> [AddressEntry] {
var addrList: UnsafeMutablePointer<ifaddrs>?
guard getifaddrs(&addrList) == 0, let first = addrList else { return [] }
defer { freeifaddrs(addrList) }
var entries: [AddressEntry] = []
for ptr in sequence(first: first, next: { $0.pointee.ifa_next }) {
let flags = Int32(ptr.pointee.ifa_flags)
let isUp = (flags & IFF_UP) != 0
let isLoopback = (flags & IFF_LOOPBACK) != 0
let family = ptr.pointee.ifa_addr.pointee.sa_family
if !isUp || isLoopback || family != UInt8(AF_INET) { continue }
var addr = ptr.pointee.ifa_addr.pointee
var buffer = [CChar](repeating: 0, count: Int(NI_MAXHOST))
let result = getnameinfo(
&addr,
socklen_t(ptr.pointee.ifa_addr.pointee.sa_len),
&buffer,
socklen_t(buffer.count),
nil,
0,
NI_NUMERICHOST)
guard result == 0 else { continue }
let len = buffer.prefix { $0 != 0 }
let bytes = len.map { UInt8(bitPattern: $0) }
guard let ip = String(bytes: bytes, encoding: .utf8) else { continue }
let name = String(cString: ptr.pointee.ifa_name)
entries.append(AddressEntry(name: name, ip: ip))
}
return entries
}
}