use crate::Result;
use crate::errno::Errno;
use libc::{self, c_int, c_ulong};
libc_bitflags! {
pub struct Persona: c_int {
ADDR_COMPAT_LAYOUT;
ADDR_NO_RANDOMIZE;
ADDR_LIMIT_32BIT;
ADDR_LIMIT_3GB;
#[cfg(not(target_env = "musl"))]
FDPIC_FUNCPTRS;
MMAP_PAGE_ZERO;
READ_IMPLIES_EXEC;
SHORT_INODE;
STICKY_TIMEOUTS;
#[cfg(not(target_env = "musl"))]
UNAME26;
WHOLE_SECONDS;
}
}
pub fn get() -> Result<Persona> {
let res = unsafe {
libc::personality(0xFFFFFFFF)
};
Errno::result(res).map(|r| Persona::from_bits_truncate(r))
}
pub fn set(persona: Persona) -> Result<Persona> {
let res = unsafe {
libc::personality(persona.bits() as c_ulong)
};
Errno::result(res).map(|r| Persona::from_bits_truncate(r))
}