linkspeed/src/sysfs.rs

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