mod error;
pub use error::Error;
pub use ipnet;
use ipnet::IpNet;
use std::collections::HashSet;
pub mod sys;
#[derive(Debug)]
pub struct Interface(sys::InterfaceHandle);
impl Interface {
pub fn add_address(&self, network: IpNet) -> Result<(), Error> {
self.0.add_address(network)
}
pub fn remove_address(&self, network: IpNet) -> Result<(), Error> {
self.0.remove_address(network)
}
pub fn addresses(&self) -> Result<Vec<IpNet>, Error> {
self.0.addresses()
}
pub fn mtu(&self) -> Result<u32, Error> {
self.0.mtu()
}
pub fn set_mtu(&self, mtu: u32) -> Result<(), Error> {
self.0.set_mtu(mtu)
}
#[cfg(windows)]
pub fn set_mtu_v4(&self, mtu: u32) -> Result<(), Error> {
self.0.set_mtu_v4(mtu)
}
#[cfg(windows)]
pub fn set_mtu_v6(&self, mtu: u32) -> Result<(), Error> {
self.0.set_mtu_v6(mtu)
}
#[cfg(windows)]
pub fn mtu_v4(&self) -> Result<u32, Error> {
self.0.mtu_v4()
}
#[cfg(windows)]
pub fn mtu_v6(&self) -> Result<u32, Error> {
self.0.mtu_v6()
}
pub fn name(&self) -> Result<String, Error> {
self.0.name()
}
pub fn index(&self) -> Result<u32, Error> {
self.0.index()
}
pub fn hwaddress(&self) -> Result<[u8; 6], Error> {
self.0.hwaddress()
}
pub unsafe fn from_index_unchecked(index: u32) -> Self {
Self(sys::InterfaceHandle { index })
}
pub fn try_from_index(index: u32) -> Result<Self, Error> {
sys::InterfaceHandle::try_from_index(index)
}
pub fn try_from_name(name: &str) -> Result<Self, Error> {
sys::InterfaceHandle::try_from_name(name)
}
}
pub fn list_interfaces() -> Result<Vec<Interface>, Error> {
sys::list_interfaces()
}
pub fn list_addresses() -> Result<Vec<IpNet>, Error> {
let interfaces = list_interfaces()?;
let addresses = interfaces
.iter()
.flat_map(|iface| iface.addresses())
.flatten();
Ok(HashSet::<IpNet>::from_iter(addresses)
.iter()
.cloned()
.collect())
}