41 lines
1.0 KiB
Rust
41 lines
1.0 KiB
Rust
use std::{
|
|
fs::File,
|
|
io::{Read as _, Seek as _, SeekFrom},
|
|
};
|
|
|
|
use eyre::Context as _;
|
|
|
|
pub(crate) struct Netdev {
|
|
rx_bytes: File,
|
|
tx_bytes: File,
|
|
}
|
|
|
|
impl Netdev {
|
|
pub fn from_name(name: &str) -> eyre::Result<Self> {
|
|
let rx_bytes = Self::open_netdev(name, "rx_bytes")?;
|
|
let tx_bytes = Self::open_netdev(name, "tx_bytes")?;
|
|
|
|
Ok(Self { rx_bytes, tx_bytes })
|
|
}
|
|
|
|
fn open_netdev(dev: &str, stat: &str) -> eyre::Result<File> {
|
|
let path = format!("/sys/class/net/{dev}/statistics/{stat}");
|
|
File::open(&path).wrap_err(format!("Failed to open netdev '{dev}'"))
|
|
}
|
|
|
|
fn read_bytes(file: &mut File) -> eyre::Result<u64> {
|
|
file.seek(SeekFrom::Start(0))?;
|
|
let mut buf = String::new();
|
|
file.read_to_string(&mut buf)?;
|
|
Ok(buf.trim().parse().unwrap_or(0))
|
|
}
|
|
|
|
pub fn rx_bytes(&mut self) -> eyre::Result<u64> {
|
|
Self::read_bytes(&mut self.rx_bytes)
|
|
}
|
|
|
|
pub fn tx_bytes(&mut self) -> eyre::Result<u64> {
|
|
Self::read_bytes(&mut self.tx_bytes)
|
|
}
|
|
}
|