mirror of
https://github.com/jiangcuo/nix.git
synced 2025-08-17 03:44:49 +00:00
58 lines
1.8 KiB
Rust
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() {}
|