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 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}