#![doc(html_root_url = "https://docs.rs/mincore/0.1.1")]
use rustix::fs::{fstat, FileType};
use rustix::mm::{mmap, ProtFlags, MapFlags, munmap};
use rustix::io::{Result as RustixResult, Errno};
pub use rustix::param::page_size;
use libc::mincore;
use std::os::fd::AsFd;
use std::io::Error;
pub fn mincore_wrapper<Fd: AsFd>(fd: Fd) -> RustixResult<Vec<bool>> {
let file_stat = fstat(&fd)?;
if FileType::from_raw_mode(file_stat.st_mode) != FileType::RegularFile {
return Err(Errno::ACCESS);
}
let file_size = usize::try_from(file_stat.st_size).unwrap();
let page_size = page_size();
let vec_len = (file_size+page_size-1)/page_size;
let mut vec_out: Vec<u8> = Vec::with_capacity(vec_len);
unsafe {
let file_mmap = mmap(
std::ptr::null_mut(), file_size, ProtFlags::empty(), MapFlags::SHARED, fd, 0 )?;
if mincore(file_mmap, file_size, vec_out.as_mut_ptr()) != 0 {
return Err(Errno::from_io_error(&Error::last_os_error()).unwrap());
}
munmap(file_mmap, file_size)?;
vec_out.set_len(vec_len);
}
Ok(vec_out.into_iter().map(|x| x!=0).collect())
}