arceos_posix_api/imp/
resources.rs

1use crate::ctypes;
2use axerrno::LinuxError;
3use core::ffi::c_int;
4
5/// Get resource limitations
6///
7/// TODO: support more resource types
8pub unsafe fn sys_getrlimit(resource: c_int, rlimits: *mut ctypes::rlimit) -> c_int {
9    debug!("sys_getrlimit <= {} {:#x}", resource, rlimits as usize);
10    syscall_body!(sys_getrlimit, {
11        match resource as u32 {
12            ctypes::RLIMIT_DATA => {}
13            ctypes::RLIMIT_STACK => {}
14            ctypes::RLIMIT_NOFILE => {}
15            _ => return Err(LinuxError::EINVAL),
16        }
17        if rlimits.is_null() {
18            return Ok(0);
19        }
20        match resource as u32 {
21            ctypes::RLIMIT_STACK => unsafe {
22                (*rlimits).rlim_cur = axconfig::TASK_STACK_SIZE as _;
23                (*rlimits).rlim_max = axconfig::TASK_STACK_SIZE as _;
24            },
25            #[cfg(feature = "fd")]
26            ctypes::RLIMIT_NOFILE => unsafe {
27                (*rlimits).rlim_cur = super::fd_ops::AX_FILE_LIMIT as _;
28                (*rlimits).rlim_max = super::fd_ops::AX_FILE_LIMIT as _;
29            },
30            _ => {}
31        }
32        Ok(0)
33    })
34}
35
36/// Set resource limitations
37///
38/// TODO: support more resource types
39pub unsafe fn sys_setrlimit(resource: c_int, rlimits: *mut crate::ctypes::rlimit) -> c_int {
40    debug!("sys_setrlimit <= {} {:#x}", resource, rlimits as usize);
41    syscall_body!(sys_setrlimit, {
42        match resource as u32 {
43            crate::ctypes::RLIMIT_DATA => {}
44            crate::ctypes::RLIMIT_STACK => {}
45            crate::ctypes::RLIMIT_NOFILE => {}
46            _ => return Err(LinuxError::EINVAL),
47        }
48        // Currently do not support set resources
49        Ok(0)
50    })
51}