use libc::statvfs;
use serde::{Deserialize, Serialize};
use std::ffi::CString;
use std::io::Error;
mod sys;
pub use sys::*;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Disks {
pub name: String,
pub mount_point: String,
pub total_space: u64,
pub avail_space: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct IoBlock {
pub device_name: String,
pub read_count: u64,
pub read_bytes: u64,
pub write_count: u64,
pub write_bytes: u64,
pub busy_time: u64,
}
#[allow(clippy::unnecessary_cast)]
pub fn disk_usage<P>(path: P) -> Result<(u64, u64), Error>
where
P: AsRef<[u8]>,
{
let mut statvfs = std::mem::MaybeUninit::<statvfs>::uninit();
if unsafe { libc::statvfs(CString::new(path.as_ref())?.as_ptr(), statvfs.as_mut_ptr()) } == -1 {
return Err(Error::last_os_error());
}
let statvfs = unsafe { statvfs.assume_init() };
let total = statvfs.f_blocks as u64 * statvfs.f_frsize as u64;
let free = statvfs.f_bavail as u64 * statvfs.f_frsize as u64;
Ok((total, free))
}
pub(crate) fn is_physical_filesys(filesystem: &str) -> bool {
matches!(
filesystem,
"ext2"
| "ext3"
| "ext4"
| "vfat"
| "ntfs"
| "zfs"
| "hfs"
| "reiserfs"
| "reiser4"
| "exfat"
| "f2fs"
| "hfsplus"
| "jfs"
| "btrfs"
| "minix"
| "nilfs"
| "xfs"
| "apfs"
| "fuseblk"
)
}