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 { 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 { 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 { 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 { Self::read_bytes(&mut self.rx_bytes) } pub fn tx_bytes(&mut self) -> eyre::Result { Self::read_bytes(&mut self.tx_bytes) } }