use std::{io, net::Ipv4Addr};
pub fn ifname_to_v4_iface(name: &str) -> io::Result<Option<Ipv4Addr>> {
let idx = super::name_to_idx::ifname_to_index(name)?;
let iface = super::interface_by_index(idx)?;
match iface {
Some(iface) => {
let addrs = iface.ipv4_addrs_by_filter(|ip| !ip.is_link_local())?;
Ok(addrs.into_iter().next().map(|net| net.addr()))
}
None => Ok(None),
}
}
pub fn ifname_to_v6_iface(name: &str) -> io::Result<Option<u32>> {
super::name_to_idx::ifname_to_index(name).map(|idx| (idx != 0).then_some(idx))
}
pub fn ifname_to_iface(name: &str) -> io::Result<(Option<Ipv4Addr>, Option<u32>)> {
let idx = super::name_to_idx::ifname_to_index(name)?;
let v6_iface = (idx != 0).then_some(idx);
let iface = super::interface_by_index(idx)?;
match iface {
Some(iface) => {
let addrs = iface.ipv4_addrs_by_filter(|ip| !ip.is_link_local())?;
let v4_iface = addrs.into_iter().next().map(|net| net.addr());
Ok((v4_iface, v6_iface))
}
None => Ok((None, v6_iface)),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[cfg(not(any(target_os = "netbsd", target_os = "dragonfly")))]
#[test]
fn ifname_to_v4_iface_first_interface() {
let ift = crate::interfaces().unwrap();
let first = ift.iter().next().unwrap();
let _ = ifname_to_v4_iface(first.name()).unwrap();
}
#[cfg(not(target_os = "dragonfly"))]
#[test]
fn ifname_to_v6_iface_round_trips() {
let ift = crate::interfaces().unwrap();
let first = ift.iter().next().unwrap();
let v6 = ifname_to_v6_iface(first.name()).unwrap();
assert_eq!(v6, Some(first.index()));
}
#[cfg(not(any(target_os = "netbsd", target_os = "dragonfly")))]
#[test]
fn ifname_to_iface_round_trips() {
let ift = crate::interfaces().unwrap();
let first = ift.iter().next().unwrap();
let (_, v6) = ifname_to_iface(first.name()).unwrap();
assert_eq!(v6, Some(first.index()));
}
#[test]
fn ifname_to_v4_iface_unknown_name_errors() {
assert!(ifname_to_v4_iface("nonexistent_iface_xyz_12345").is_err());
}
#[test]
fn ifname_to_v6_iface_unknown_name_errors() {
assert!(ifname_to_v6_iface("nonexistent_iface_xyz_12345").is_err());
}
#[test]
fn ifname_to_iface_unknown_name_errors() {
assert!(ifname_to_iface("nonexistent_iface_xyz_12345").is_err());
}
}