use crate::memory::Swap;
use std::io::Error;
pub fn get_swap() -> Result<Swap, Error> {
let mut name: [i32; 2] = [libc::CTL_VM, libc::VM_SWAPUSAGE];
let mut swap_info = std::mem::MaybeUninit::<libc::xsw_usage>::uninit();
let mut length = std::mem::size_of::<libc::xsw_usage>();
if unsafe {
libc::sysctl(
name.as_mut_ptr(),
2,
swap_info.as_mut_ptr() as *mut libc::c_void,
&mut length,
std::ptr::null_mut(),
0,
)
} != 0
{
return Err(Error::last_os_error());
}
let swap_info = unsafe { swap_info.assume_init() };
Ok(Swap {
total: swap_info.xsu_total / (1024 * 1024),
free: swap_info.xsu_avail / (1024 * 1024),
used: swap_info.xsu_used / (1024 * 1024),
})
}
pub fn has_swap() -> Result<bool, Error> {
let mut name: [i32; 2] = [libc::CTL_VM, 124];
let mut value = std::mem::MaybeUninit::<i32>::uninit();
let mut length = std::mem::size_of::<i32>();
if unsafe {
libc::sysctl(
name.as_mut_ptr(),
2,
value.as_mut_ptr() as *mut libc::c_void,
&mut length,
std::ptr::null_mut(),
0,
)
} != 0
{
return Err(Error::last_os_error());
}
let value = unsafe { value.assume_init() };
Ok(value == 4)
}