use windows::Win32::NetworkManagement::IpHelper::{
GAA_FLAG_SKIP_ANYCAST, GAA_FLAG_SKIP_MULTICAST, IP_ADAPTER_ADDRESSES_LH,
};
+use windows::Win32::NetworkManagement::Ndis::IfOperStatusDown;
use windows::Win32::Networking::WinSock::{
AF_INET, AF_INET6, AF_UNSPEC, SOCKADDR, SOCKADDR_IN, SOCKADDR_IN6,
};
-use crate::{Error, IfIndex, Interface};
+use crate::{Error, Interface, List};
-pub fn list_interfaces() -> Result<HashMap<IfIndex, Interface>, Error> {
+pub(crate) fn list_interfaces() -> Result<List, Error> {
let mut ifs = HashMap::new();
// Microsoft recommends a 15 KB initial buffer
let start_size = 15 * 1024;
}
ERROR_INVALID_PARAMETER => return Err(Error::Internal),
ERROR_NOT_ENOUGH_MEMORY => return Err(Error::Internal),
- ERROR_NO_DATA => return Ok(HashMap::new()), // there aren't any
+ ERROR_NO_DATA => return Ok(List(HashMap::new())), // there aren't any
_ => return Err(Error::Internal), // TODO: Use FormatMessage to get a string
}
}
let mut adapter_ptr = &buf[0] as *const _ as *const IP_ADAPTER_ADDRESSES_LH;
while !adapter_ptr.is_null() {
let adapter = &*adapter_ptr as &IP_ADAPTER_ADDRESSES_LH;
+ if adapter.OperStatus == IfOperStatusDown {
+ adapter_ptr = adapter.Next;
+ continue;
+ }
let mut hw_addr = String::with_capacity(adapter.PhysicalAddressLength as usize * 3);
for i in 0..adapter.PhysicalAddressLength as usize {
if i != 0 {
}
}
- Ok(ifs)
-}
-
-#[cfg(test)]
-mod test {
- use super::list_interfaces;
-
- #[test]
- fn list() {
- let ifaces = list_interfaces().unwrap();
- println!("{:?}", ifaces);
- }
+ Ok(List(ifs))
}