nix/examples/getifaddrs.rs
Alan Somers bcbf0e7dbe
impl Display for InterfaceFlags (#2206)
And add a full example for getifaddrs.
2023-11-26 00:09:31 +00:00

58 lines
1.8 KiB
Rust

//! Print all interfaces and interface addresses on the system, in a format
//! similar to ifconfig(8).
#![cfg(feature = "net")]
#[cfg(any(bsd, linux_android, target_os = "illumos"))]
fn main() {
use nix::ifaddrs::getifaddrs;
use nix::sys::socket::{SockaddrLike, SockaddrStorage};
let addrs = getifaddrs().unwrap();
let mut ifname = None;
for addr in addrs {
if ifname.as_ref() != Some(&addr.interface_name) {
if ifname.is_some() {
println!();
}
ifname = Some(addr.interface_name.clone());
println!(
"{}: flags={:x}<{}>",
addr.interface_name,
addr.flags.bits(),
addr.flags
);
}
if let Some(dl) = addr.address.as_ref().unwrap().as_link_addr() {
if dl.addr().is_none() {
continue;
}
}
let family = addr
.address
.as_ref()
.and_then(SockaddrStorage::family)
.map(|af| format!("{:?}", af))
.unwrap_or("".to_owned());
match (
&addr.address,
&addr.netmask,
&addr.broadcast,
&addr.destination,
) {
(Some(a), Some(nm), Some(b), None) => {
println!("\t{} {} netmask {} broadcast {}", family, a, nm, b)
}
(Some(a), Some(nm), None, None) => {
println!("\t{} {} netmask {}", family, a, nm)
}
(Some(a), None, None, None) => println!("\t{} {}", family, a),
(Some(a), None, None, Some(d)) => {
println!("\t{} {} -> {}", family, a, d)
}
x => todo!("{:?}", x),
}
}
}
#[cfg(not(any(bsd, linux_android, target_os = "illumos")))]
fn main() {}