cfg_if::cfg_if! {
if #[cfg(feature = "mmap")]{
#[path = "mmap.rs"]
pub(crate) mod mmap_impl;
pub use mmap_impl::MmapImpl;
}else {
#[path = "no_mmap.rs"]
pub(crate) mod no_mmap_impl;
pub use no_mmap_impl::MmapImpl;
}
}
use crate::Result;
use bitflags::bitflags;
use core::{
ffi::{c_int, c_void},
ptr::NonNull,
};
bitflags! {
#[derive(Clone, Copy)]
pub struct ProtFlags: c_int {
const PROT_NONE = 0;
const PROT_READ = 1;
const PROT_WRITE = 2;
const PROT_EXEC = 4;
}
}
bitflags! {
#[derive(Clone, Copy)]
pub struct MapFlags: c_int {
const MAP_PRIVATE = 2;
const MAP_FIXED = 16;
const MAP_ANONYMOUS = 32;
}
}
pub trait Mmap {
unsafe fn mmap(
addr: Option<usize>,
len: usize,
prot: ProtFlags,
flags: MapFlags,
offset: usize,
fd: Option<i32>,
need_copy: &mut bool,
) -> Result<NonNull<c_void>>;
unsafe fn mmap_anonymous(
addr: usize,
len: usize,
prot: ProtFlags,
flags: MapFlags,
) -> Result<NonNull<c_void>>;
unsafe fn munmap(addr: NonNull<c_void>, len: usize) -> Result<()>;
unsafe fn mprotect(addr: NonNull<c_void>, len: usize, prot: ProtFlags) -> Result<()>;
}