getaddrs provides a safe interface for the system's network interface data. The `InterfaceAddrs` struct provides access to the system's network interface data. You can either iterate over it or consume it and convert it into an `InterfaceMap` (a `HashMap>`) for more convenient access by interface name. ## Examples You can access the basic information of the system in a few lines. The following program prints all the known addresses. ``` use getaddrs::InterfaceAddrs; let addrs = InterfaceAddrs::query_system() .expect("System has no network interfaces."); for addr in addrs { println!("{}: {:?}", addr.name, addr.address); } ``` The InterfaceFlags struct provides access to info about the state of an interface. This program prints the addresses of only interfaces which are up. ``` use getaddrs::{InterfaceAddrs, if_flags}; let addrs = InterfaceAddrs::query_system() .expect("System has no network interfaces."); for addr in addrs { if addr.flags.contains(if_flags::IFF_UP) { println!("{}: {:?}", addr.name, addr.address); } } ``` You can convert the InterfaceAddrs struct into a HashMap easily. InterfaceMap is an alias for HashMap> for easier reference. ``` use getaddrs::{InterfaceAddrs, InterfaceAddr, InterfaceMap}; use std::collections::HashMap; let interfaces: InterfaceMap = InterfaceAddrs::query_system() .expect("System has no network interfaces.") .into(); // Convert to a hash map // Print all the addresses of the loopback interface if let Some(addrs) = interfaces.get("lo") { println!("Loopback addresses:"); for addr in addrs { println!("\t{:?}", addr); } } ```