use core::mem::MaybeUninit;
use moa_uapi::{
error::{ERR_FAULT, ERR_NOT_FOUND, ERR_PERM},
rlimit::{RlimitInfo, Rlimits},
space::SpaceId,
sysnr::{SYSNR_RLIMIT_QUERY, SYSNR_RLIMIT_SET},
};
pub type Result<T> = core::result::Result<T, RlimitError>;
define_syscall_error! {
pub enum RlimitError {
Perm = ERR_PERM,
NotFound = ERR_NOT_FOUND,
Fault = ERR_FAULT,
}
}
pub fn rlimit_set(spaceid: SpaceId, limits: &Rlimits) -> Result<()> {
let ret = unsafe {
super::arch::syscall2(SYSNR_RLIMIT_SET, spaceid.raw(), limits as *const Rlimits as usize)
};
if ret < 0 { Err(RlimitError::from_raw(ret)) } else { Ok(()) }
}
pub fn rlimit_query(spaceid: SpaceId) -> Result<RlimitInfo> {
let mut info = MaybeUninit::<RlimitInfo>::uninit();
let ret = unsafe {
super::arch::syscall2(SYSNR_RLIMIT_QUERY, spaceid.raw(), info.as_mut_ptr() as usize)
};
if ret < 0 { Err(RlimitError::from_raw(ret)) } else { Ok(unsafe { info.assume_init() }) }
}