module netio import os #include struct C.if_nameindex { if_index u32 if_name &char } fn C.if_nametoindex(&char) u32 fn C.if_indextoname(u32, &char) &char fn C.if_nameindex() &C.if_nameindex fn C.if_freenameindex(voidptr) // name_to_index translates the network interface name to index. pub fn name_to_index(name string) !u32 { index := C.if_nametoindex(&char(name.str)) if index == 0 { return error('${@FN}: no index for `${name}`') } return index } // index_to_name translates the network interface index to name e.g. 'eth0'. pub fn index_to_name(index u32) !string { name := []u8{len: C.IF_NAMESIZE} ifname := C.if_indextoname(index, name.data) if isnil(ifname) { return os.last_error() } return unsafe { cstring_to_vstring(ifname) } } pub struct NetworkInterface { index u32 name string } // interfaces returns an array with names and indexes of all network interfaces in system. pub fn interfaces() ![]NetworkInterface { ifaces := C.if_nameindex() if isnil(ifaces) { return os.last_error() } defer { C.if_freenameindex(ifaces) } mut result := []NetworkInterface{} mut i := 0 for { iface := unsafe { ifaces[i] } i++ if iface.if_index == 0 && isnil(iface.if_name) { break } result << NetworkInterface{ index: iface.if_index name: unsafe { cstring_to_vstring(iface.if_name) } } } return result }