ifcfg/
lib.rs

1#[cfg(unix)]
2#[macro_use]
3extern crate bitflags;
4#[cfg(unix)]
5#[macro_use]
6extern crate lazy_static;
7
8use std::{
9    fmt,
10    net,
11    io,
12};
13use serde::Serialize;
14use serde_json;
15
16#[cfg(unix)]
17mod unix;
18#[cfg(windows)]
19mod windows;
20
21#[derive(Debug)]
22pub enum IfCfgError {
23    #[cfg(unix)]
24    InterfacesError(unix::InterfacesError),
25    IOError(io::Error),
26    SerdeJsonError(serde_json::error::Error),
27    Generic(&'static str),
28}
29
30impl fmt::Display for IfCfgError {
31    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
32        match &self {
33            #[cfg(unix)]
34            IfCfgError::InterfacesError(err) => write!(f, "InterfacesError({})", err),
35            IfCfgError::IOError(err) => write!(f, "IOError({})", err),
36            IfCfgError::SerdeJsonError(err) => write!(f, "SerdeJsonError({})", err),
37            IfCfgError::Generic(err) => write!(f, "Generic({})", err),
38        }
39    }
40}
41
42impl From<io::Error> for IfCfgError {
43    fn from(err: io::Error) -> IfCfgError {
44        IfCfgError::IOError(err)
45    }
46}
47
48impl From<serde_json::error::Error> for IfCfgError {
49    fn from(err: serde_json::error::Error) -> IfCfgError {
50        IfCfgError::SerdeJsonError(err)
51    }
52}
53
54pub type Result<T> = std::result::Result<T, IfCfgError>;
55
56#[derive(Debug, Clone, Copy, Serialize)]
57pub enum AddressFamily {
58    IPv4,
59    IPv6,
60    Link,
61    Packet,
62    Unknown(i32),
63}
64
65#[derive(Debug, Clone, Copy, Serialize)]
66pub enum Hops {
67    Broadcast(net::SocketAddr),
68    Destination(net::SocketAddr),
69}
70
71#[derive(Debug, Clone, Copy, Serialize)]
72pub struct InterfaceAddress {
73    pub address_family: AddressFamily,
74    pub address: Option<net::SocketAddr>,
75    pub mask: Option<net::SocketAddr>,
76    pub hop: Option<Hops>,
77}
78
79#[derive(Debug, Serialize)]
80pub struct IfCfg {
81    pub name: String,
82    pub mac: String,
83    pub addresses: Vec<InterfaceAddress>,
84    pub description: String,
85}
86
87impl IfCfg {
88    pub fn get() -> Result<Vec<IfCfg>> {
89        //! Gets the Interfaces from a computer
90        //!
91        //! ## Example
92        //! ```rust
93        //! use ifcfg::{IfCfg, Result};
94        //!
95        //! fn main() -> Result<()> {
96        //!     let adapters = IfCfg::get().expect("could not get interfaces");
97        //!     println!("{}", serde_json::to_string(&adapters)?);
98        //!     Ok(())
99        //! }
100        //! ```
101        let mut results = Vec::<IfCfg>::new();
102
103        #[cfg(unix)]
104        {
105            let interfaces = unix::Interface::get_all()?;
106            for interface in interfaces.iter() {
107                results.push(interface.into());
108            }
109        }
110        #[cfg(windows)]
111        {
112            let adapters = windows::Adapters::new()?;
113            for adapter in adapters.iter() {
114                results.push(adapter.into());
115            }
116        }
117        Ok(results)
118    }
119}
120
121#[cfg(test)]
122mod tests {
123    use super::*;
124
125    #[test]
126    fn test_get_adapters () {
127        let x = IfCfg::get();
128        assert!(x.is_ok());
129    }
130}