use crate::errno::Errno;
use crate::Result;
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(any(target_env = "musl", target_env = "uclibc", target_env = "ohos")))]
FDPIC_FUNCPTRS;
MMAP_PAGE_ZERO;
READ_IMPLIES_EXEC;
SHORT_INODE;
STICKY_TIMEOUTS;
#[cfg(not(any(target_env = "musl", target_env = "uclibc", target_env = "ohos")))]
UNAME26;
WHOLE_SECONDS;
}
}
#[cfg_attr(any(qemu, target_arch = "aarch64"), doc = " ```no_run")]
#[cfg_attr(not(any(qemu, target_arch = "aarch64")), doc = " ```")]
pub fn get() -> Result<Persona> {
let res = unsafe { libc::personality(0xFFFFFFFF) };
Errno::result(res).map(Persona::from_bits_truncate)
}
#[cfg_attr(any(qemu, target_arch = "aarch64"), doc = " ```no_run")]
#[cfg_attr(not(any(qemu, target_arch = "aarch64")), doc = " ```")]
pub fn set(persona: Persona) -> Result<Persona> {
let res = unsafe { libc::personality(persona.bits() as c_ulong) };
Errno::result(res).map(Persona::from_bits_truncate)
}