xref: /DragonOS/kernel/src/process/syscall.rs (revision 0648a547da3461bd115f7566c6f2feca14eac6ff)
11496ba7bSLoGin use core::ffi::c_void;
2ab5c8ca4Slogin 
3703ce5a7SLoGin use alloc::{ffi::CString, string::ToString, sync::Arc, vec::Vec};
4703ce5a7SLoGin use log::error;
591e9d4abSLoGin use system_error::SystemError;
61496ba7bSLoGin 
7971462beSGnoCiYeH use super::{
8971462beSGnoCiYeH     abi::WaitOption,
9*0648a547SJomo     cred::{Kgid, Kuid},
10bf4a4899SLoGin     exit::kernel_wait4,
11971462beSGnoCiYeH     fork::{CloneFlags, KernelCloneArgs},
120d9b7d92SLoGin     resource::{RLimit64, RLimitID, RUsage, RUsageWho},
13bf4a4899SLoGin     KernelStack, Pid, ProcessManager,
14971462beSGnoCiYeH };
15ab5c8ca4Slogin use crate::{
16bf4a4899SLoGin     arch::{interrupt::TrapFrame, MMArch},
170d9b7d92SLoGin     filesystem::{
180d9b7d92SLoGin         procfs::procfs_register_pid,
190d9b7d92SLoGin         vfs::{file::FileDescriptorVec, MAX_PATHLEN},
200d9b7d92SLoGin     },
214fda81ceSLoGin     mm::{ucontext::UserStack, verify_area, MemoryManagementArch, VirtAddr},
221496ba7bSLoGin     process::ProcessControlBlock,
23971462beSGnoCiYeH     sched::completion::Completion,
241496ba7bSLoGin     syscall::{
25bf4a4899SLoGin         user_access::{check_and_clone_cstr, check_and_clone_cstr_array, UserBufferWriter},
2691e9d4abSLoGin         Syscall,
271496ba7bSLoGin     },
28ab5c8ca4Slogin };
29ab5c8ca4Slogin 
308c6f2184Ssspphh //参考资料:https://code.dragonos.org.cn/xref/linux-6.1.9/include/uapi/linux/utsname.h#17
318c6f2184Ssspphh #[repr(C)]
328c6f2184Ssspphh #[derive(Debug, Clone, Copy)]
338c6f2184Ssspphh pub struct PosixOldUtsName {
348c6f2184Ssspphh     pub sysname: [u8; 65],
358c6f2184Ssspphh     pub nodename: [u8; 65],
368c6f2184Ssspphh     pub release: [u8; 65],
378c6f2184Ssspphh     pub version: [u8; 65],
388c6f2184Ssspphh     pub machine: [u8; 65],
398c6f2184Ssspphh }
408c6f2184Ssspphh 
418c6f2184Ssspphh impl PosixOldUtsName {
new() -> Self428c6f2184Ssspphh     pub fn new() -> Self {
438c6f2184Ssspphh         const SYS_NAME: &[u8] = b"DragonOS";
448c6f2184Ssspphh         const NODENAME: &[u8] = b"DragonOS";
458c6f2184Ssspphh         const RELEASE: &[u8] = env!("CARGO_PKG_VERSION").as_bytes();
468c6f2184Ssspphh         const VERSION: &[u8] = env!("CARGO_PKG_VERSION").as_bytes();
478c6f2184Ssspphh 
488c6f2184Ssspphh         #[cfg(target_arch = "x86_64")]
498c6f2184Ssspphh         const MACHINE: &[u8] = b"x86_64";
508c6f2184Ssspphh 
518c6f2184Ssspphh         #[cfg(target_arch = "aarch64")]
528c6f2184Ssspphh         const MACHINE: &[u8] = b"aarch64";
538c6f2184Ssspphh 
548c6f2184Ssspphh         #[cfg(target_arch = "riscv64")]
558c6f2184Ssspphh         const MACHINE: &[u8] = b"riscv64";
568c6f2184Ssspphh 
578c6f2184Ssspphh         let mut r = Self {
588c6f2184Ssspphh             sysname: [0; 65],
598c6f2184Ssspphh             nodename: [0; 65],
608c6f2184Ssspphh             release: [0; 65],
618c6f2184Ssspphh             version: [0; 65],
628c6f2184Ssspphh             machine: [0; 65],
638c6f2184Ssspphh         };
648c6f2184Ssspphh 
658c6f2184Ssspphh         r.sysname[0..SYS_NAME.len()].copy_from_slice(SYS_NAME);
668c6f2184Ssspphh         r.nodename[0..NODENAME.len()].copy_from_slice(NODENAME);
678c6f2184Ssspphh         r.release[0..RELEASE.len()].copy_from_slice(RELEASE);
688c6f2184Ssspphh         r.version[0..VERSION.len()].copy_from_slice(VERSION);
698c6f2184Ssspphh         r.machine[0..MACHINE.len()].copy_from_slice(MACHINE);
708c6f2184Ssspphh 
718c6f2184Ssspphh         return r;
728c6f2184Ssspphh     }
738c6f2184Ssspphh }
748c6f2184Ssspphh 
75ab5c8ca4Slogin impl Syscall {
fork(frame: &TrapFrame) -> Result<usize, SystemError>76840045afSLoGin     pub fn fork(frame: &TrapFrame) -> Result<usize, SystemError> {
774ad52e57S裕依2439         ProcessManager::fork(frame, CloneFlags::empty()).map(|pid| pid.into())
78ab5c8ca4Slogin     }
79ab5c8ca4Slogin 
vfork(frame: &TrapFrame) -> Result<usize, SystemError>80840045afSLoGin     pub fn vfork(frame: &TrapFrame) -> Result<usize, SystemError> {
81bf4a4899SLoGin         // 由于Linux vfork需要保证子进程先运行(除非子进程调用execve或者exit),
82bf4a4899SLoGin         // 而我们目前没有实现这个特性,所以暂时使用fork代替vfork(linux文档表示这样也是也可以的)
83bf4a4899SLoGin         Self::fork(frame)
84bf4a4899SLoGin 
85bf4a4899SLoGin         // 下面是以前的实现,除非我们实现了子进程先运行的特性,否则不要使用,不然会导致父进程数据损坏
86bf4a4899SLoGin         // ProcessManager::fork(
87bf4a4899SLoGin         //     frame,
88bf4a4899SLoGin         //     CloneFlags::CLONE_VM | CloneFlags::CLONE_FS | CloneFlags::CLONE_SIGNAL,
89bf4a4899SLoGin         // )
90bf4a4899SLoGin         // .map(|pid| pid.into())
91ab5c8ca4Slogin     }
92ab5c8ca4Slogin 
execve( path: *const u8, argv: *const *const u8, envp: *const *const u8, frame: &mut TrapFrame, ) -> Result<(), SystemError>93ab5c8ca4Slogin     pub fn execve(
941496ba7bSLoGin         path: *const u8,
951496ba7bSLoGin         argv: *const *const u8,
961496ba7bSLoGin         envp: *const *const u8,
971496ba7bSLoGin         frame: &mut TrapFrame,
981496ba7bSLoGin     ) -> Result<(), SystemError> {
992eab6dd7S曾俊         // debug!(
1001496ba7bSLoGin         //     "execve path: {:?}, argv: {:?}, envp: {:?}\n",
1011496ba7bSLoGin         //     path,
1021496ba7bSLoGin         //     argv,
1031496ba7bSLoGin         //     envp
1041496ba7bSLoGin         // );
1052eab6dd7S曾俊         // debug!(
106971462beSGnoCiYeH         //     "before execve: strong count: {}",
107971462beSGnoCiYeH         //     Arc::strong_count(&ProcessManager::current_pcb())
108971462beSGnoCiYeH         // );
109971462beSGnoCiYeH 
1101496ba7bSLoGin         if path.is_null() {
1111496ba7bSLoGin             return Err(SystemError::EINVAL);
1121496ba7bSLoGin         }
1131496ba7bSLoGin 
1141496ba7bSLoGin         let x = || {
115703ce5a7SLoGin             let path: CString = check_and_clone_cstr(path, Some(MAX_PATHLEN))?;
116703ce5a7SLoGin             let argv: Vec<CString> = check_and_clone_cstr_array(argv)?;
117703ce5a7SLoGin             let envp: Vec<CString> = check_and_clone_cstr_array(envp)?;
1181496ba7bSLoGin             Ok((path, argv, envp))
1191496ba7bSLoGin         };
120703ce5a7SLoGin         let (path, argv, envp) = x().inspect_err(|e: &SystemError| {
121703ce5a7SLoGin             error!("Failed to execve: {:?}", e);
122703ce5a7SLoGin         })?;
123703ce5a7SLoGin 
124703ce5a7SLoGin         let path = path.into_string().map_err(|_| SystemError::EINVAL)?;
1251496ba7bSLoGin         ProcessManager::current_pcb()
1261496ba7bSLoGin             .basic_mut()
1271496ba7bSLoGin             .set_name(ProcessControlBlock::generate_name(&path, &argv));
1281496ba7bSLoGin 
129876cb89eSGnoCiYeH         Self::do_execve(path, argv, envp, frame)?;
130876cb89eSGnoCiYeH 
131876cb89eSGnoCiYeH         // 关闭设置了O_CLOEXEC的文件描述符
132876cb89eSGnoCiYeH         let fd_table = ProcessManager::current_pcb().fd_table();
133876cb89eSGnoCiYeH         fd_table.write().close_on_exec();
1342eab6dd7S曾俊         // debug!(
135971462beSGnoCiYeH         //     "after execve: strong count: {}",
136971462beSGnoCiYeH         //     Arc::strong_count(&ProcessManager::current_pcb())
137971462beSGnoCiYeH         // );
138876cb89eSGnoCiYeH 
139876cb89eSGnoCiYeH         return Ok(());
140ab5c8ca4Slogin     }
141ab5c8ca4Slogin 
wait4( pid: i64, wstatus: *mut i32, options: i32, rusage: *mut c_void, ) -> Result<usize, SystemError>142ab5c8ca4Slogin     pub fn wait4(
1431496ba7bSLoGin         pid: i64,
1441496ba7bSLoGin         wstatus: *mut i32,
1451496ba7bSLoGin         options: i32,
146ab5c8ca4Slogin         rusage: *mut c_void,
147ab5c8ca4Slogin     ) -> Result<usize, SystemError> {
148bf4a4899SLoGin         let options = WaitOption::from_bits(options as u32).ok_or(SystemError::EINVAL)?;
149bf4a4899SLoGin 
150bf4a4899SLoGin         let wstatus_buf = if wstatus.is_null() {
151bf4a4899SLoGin             None
152bf4a4899SLoGin         } else {
153bf4a4899SLoGin             Some(UserBufferWriter::new(
154bf4a4899SLoGin                 wstatus,
155bf4a4899SLoGin                 core::mem::size_of::<i32>(),
156bf4a4899SLoGin                 true,
157bf4a4899SLoGin             )?)
158b7b843beSGnoCiYeH         };
159b7b843beSGnoCiYeH 
160bf4a4899SLoGin         let mut tmp_rusage = if rusage.is_null() {
161bf4a4899SLoGin             None
162bf4a4899SLoGin         } else {
163bf4a4899SLoGin             Some(RUsage::default())
164bf4a4899SLoGin         };
1651496ba7bSLoGin 
166bf4a4899SLoGin         let r = kernel_wait4(pid, wstatus_buf, options, tmp_rusage.as_mut())?;
1671496ba7bSLoGin 
168bf4a4899SLoGin         if !rusage.is_null() {
169bf4a4899SLoGin             let mut rusage_buf = UserBufferWriter::new::<RUsage>(
170bf4a4899SLoGin                 rusage as *mut RUsage,
171bf4a4899SLoGin                 core::mem::size_of::<RUsage>(),
172bf4a4899SLoGin                 true,
173b7b843beSGnoCiYeH             )?;
174bf4a4899SLoGin             rusage_buf.copy_one_to_user(&tmp_rusage.unwrap(), 0)?;
1751496ba7bSLoGin         }
176bf4a4899SLoGin         return Ok(r);
177ab5c8ca4Slogin     }
178ab5c8ca4Slogin 
179ab5c8ca4Slogin     /// # 退出进程
180ab5c8ca4Slogin     ///
181ab5c8ca4Slogin     /// ## 参数
182ab5c8ca4Slogin     ///
183ab5c8ca4Slogin     /// - status: 退出状态
exit(status: usize) -> !184ab5c8ca4Slogin     pub fn exit(status: usize) -> ! {
1851496ba7bSLoGin         ProcessManager::exit(status);
186ab5c8ca4Slogin     }
187ab5c8ca4Slogin 
1881496ba7bSLoGin     /// @brief 获取当前进程的pid
getpid() -> Result<Pid, SystemError>1891496ba7bSLoGin     pub fn getpid() -> Result<Pid, SystemError> {
1901496ba7bSLoGin         let current_pcb = ProcessManager::current_pcb();
191393f6915SLoGin         return Ok(current_pcb.tgid());
1921496ba7bSLoGin     }
1931496ba7bSLoGin 
1941496ba7bSLoGin     /// @brief 获取指定进程的pgid
1951496ba7bSLoGin     ///
1961496ba7bSLoGin     /// @param pid 指定一个进程号
1971496ba7bSLoGin     ///
1981496ba7bSLoGin     /// @return 成功,指定进程的进程组id
1991496ba7bSLoGin     /// @return 错误,不存在该进程
getpgid(mut pid: Pid) -> Result<Pid, SystemError>2001496ba7bSLoGin     pub fn getpgid(mut pid: Pid) -> Result<Pid, SystemError> {
2011496ba7bSLoGin         if pid == Pid(0) {
2021496ba7bSLoGin             let current_pcb = ProcessManager::current_pcb();
2031496ba7bSLoGin             pid = current_pcb.pid();
2041496ba7bSLoGin         }
2051496ba7bSLoGin         let target_proc = ProcessManager::find(pid).ok_or(SystemError::ESRCH)?;
2061496ba7bSLoGin         return Ok(target_proc.basic().pgid());
2071496ba7bSLoGin     }
2081496ba7bSLoGin     /// @brief 获取当前进程的父进程id
2091496ba7bSLoGin 
2101496ba7bSLoGin     /// 若为initproc则ppid设置为0
getppid() -> Result<Pid, SystemError>2111496ba7bSLoGin     pub fn getppid() -> Result<Pid, SystemError> {
2121496ba7bSLoGin         let current_pcb = ProcessManager::current_pcb();
2131496ba7bSLoGin         return Ok(current_pcb.basic().ppid());
214ab5c8ca4Slogin     }
215971462beSGnoCiYeH 
clone( current_trapframe: &TrapFrame, clone_args: KernelCloneArgs, ) -> Result<usize, SystemError>216971462beSGnoCiYeH     pub fn clone(
217840045afSLoGin         current_trapframe: &TrapFrame,
218971462beSGnoCiYeH         clone_args: KernelCloneArgs,
219971462beSGnoCiYeH     ) -> Result<usize, SystemError> {
220971462beSGnoCiYeH         let flags = clone_args.flags;
221971462beSGnoCiYeH 
222971462beSGnoCiYeH         let vfork = Arc::new(Completion::new());
223971462beSGnoCiYeH 
224971462beSGnoCiYeH         if flags.contains(CloneFlags::CLONE_PIDFD)
225971462beSGnoCiYeH             && flags.contains(CloneFlags::CLONE_PARENT_SETTID)
226971462beSGnoCiYeH         {
227971462beSGnoCiYeH             return Err(SystemError::EINVAL);
228971462beSGnoCiYeH         }
229971462beSGnoCiYeH 
230971462beSGnoCiYeH         let current_pcb = ProcessManager::current_pcb();
231971462beSGnoCiYeH         let new_kstack = KernelStack::new()?;
232971462beSGnoCiYeH         let name = current_pcb.basic().name().to_string();
233971462beSGnoCiYeH         let pcb = ProcessControlBlock::new(name, new_kstack);
234971462beSGnoCiYeH         // 克隆pcb
235971462beSGnoCiYeH         ProcessManager::copy_process(&current_pcb, &pcb, clone_args, current_trapframe)?;
236971462beSGnoCiYeH         ProcessManager::add_pcb(pcb.clone());
237971462beSGnoCiYeH 
238971462beSGnoCiYeH         // 向procfs注册进程
239971462beSGnoCiYeH         procfs_register_pid(pcb.pid()).unwrap_or_else(|e| {
240971462beSGnoCiYeH             panic!(
241971462beSGnoCiYeH                 "fork: Failed to register pid to procfs, pid: [{:?}]. Error: {:?}",
242971462beSGnoCiYeH                 pcb.pid(),
243971462beSGnoCiYeH                 e
244971462beSGnoCiYeH             )
245971462beSGnoCiYeH         });
246971462beSGnoCiYeH 
247971462beSGnoCiYeH         if flags.contains(CloneFlags::CLONE_VFORK) {
24852bcb59eSGnoCiYeH             pcb.thread.write_irqsave().vfork_done = Some(vfork.clone());
249971462beSGnoCiYeH         }
250971462beSGnoCiYeH 
25152bcb59eSGnoCiYeH         if pcb.thread.read_irqsave().set_child_tid.is_some() {
25252bcb59eSGnoCiYeH             let addr = pcb.thread.read_irqsave().set_child_tid.unwrap();
253971462beSGnoCiYeH             let mut writer =
254971462beSGnoCiYeH                 UserBufferWriter::new(addr.as_ptr::<i32>(), core::mem::size_of::<i32>(), true)?;
255971462beSGnoCiYeH             writer.copy_one_to_user(&(pcb.pid().data() as i32), 0)?;
256971462beSGnoCiYeH         }
257971462beSGnoCiYeH 
258971462beSGnoCiYeH         ProcessManager::wakeup(&pcb).unwrap_or_else(|e| {
259971462beSGnoCiYeH             panic!(
260971462beSGnoCiYeH                 "fork: Failed to wakeup new process, pid: [{:?}]. Error: {:?}",
261971462beSGnoCiYeH                 pcb.pid(),
262971462beSGnoCiYeH                 e
263971462beSGnoCiYeH             )
264971462beSGnoCiYeH         });
265971462beSGnoCiYeH 
266971462beSGnoCiYeH         if flags.contains(CloneFlags::CLONE_VFORK) {
267971462beSGnoCiYeH             // 等待子进程结束或者exec;
268971462beSGnoCiYeH             vfork.wait_for_completion_interruptible()?;
269971462beSGnoCiYeH         }
270971462beSGnoCiYeH 
271971462beSGnoCiYeH         return Ok(pcb.pid().0);
272971462beSGnoCiYeH     }
273971462beSGnoCiYeH 
274971462beSGnoCiYeH     /// 设置线程地址
set_tid_address(ptr: usize) -> Result<usize, SystemError>275971462beSGnoCiYeH     pub fn set_tid_address(ptr: usize) -> Result<usize, SystemError> {
2764fda81ceSLoGin         verify_area(VirtAddr::new(ptr), core::mem::size_of::<i32>())
2774fda81ceSLoGin             .map_err(|_| SystemError::EFAULT)?;
278971462beSGnoCiYeH 
279971462beSGnoCiYeH         let pcb = ProcessManager::current_pcb();
28052bcb59eSGnoCiYeH         pcb.thread.write_irqsave().clear_child_tid = Some(VirtAddr::new(ptr));
281971462beSGnoCiYeH         Ok(pcb.pid.0)
282971462beSGnoCiYeH     }
283393f6915SLoGin 
gettid() -> Result<Pid, SystemError>284393f6915SLoGin     pub fn gettid() -> Result<Pid, SystemError> {
285393f6915SLoGin         let pcb = ProcessManager::current_pcb();
286393f6915SLoGin         Ok(pcb.pid)
287393f6915SLoGin     }
28802e249f3SLoGin 
getuid() -> Result<usize, SystemError>28902e249f3SLoGin     pub fn getuid() -> Result<usize, SystemError> {
290*0648a547SJomo         let pcb = ProcessManager::current_pcb();
291*0648a547SJomo         return Ok(pcb.cred.lock().uid.data());
29202e249f3SLoGin     }
29302e249f3SLoGin 
getgid() -> Result<usize, SystemError>29402e249f3SLoGin     pub fn getgid() -> Result<usize, SystemError> {
295*0648a547SJomo         let pcb = ProcessManager::current_pcb();
296*0648a547SJomo         return Ok(pcb.cred.lock().gid.data());
29702e249f3SLoGin     }
29802e249f3SLoGin 
geteuid() -> Result<usize, SystemError>29902e249f3SLoGin     pub fn geteuid() -> Result<usize, SystemError> {
300*0648a547SJomo         let pcb = ProcessManager::current_pcb();
301*0648a547SJomo         return Ok(pcb.cred.lock().euid.data());
30202e249f3SLoGin     }
30302e249f3SLoGin 
getegid() -> Result<usize, SystemError>30402e249f3SLoGin     pub fn getegid() -> Result<usize, SystemError> {
305*0648a547SJomo         let pcb = ProcessManager::current_pcb();
306*0648a547SJomo         return Ok(pcb.cred.lock().egid.data());
307*0648a547SJomo     }
308*0648a547SJomo 
setuid(uid: usize) -> Result<usize, SystemError>309*0648a547SJomo     pub fn setuid(uid: usize) -> Result<usize, SystemError> {
310*0648a547SJomo         let pcb = ProcessManager::current_pcb();
311*0648a547SJomo         let mut guard = pcb.cred.lock();
312*0648a547SJomo 
313*0648a547SJomo         if guard.uid.data() == 0 {
314*0648a547SJomo             guard.setuid(uid);
315*0648a547SJomo             guard.seteuid(uid);
316*0648a547SJomo             guard.setsuid(uid);
317*0648a547SJomo         } else if uid == guard.uid.data() || uid == guard.suid.data() {
318*0648a547SJomo             guard.seteuid(uid);
319*0648a547SJomo         } else {
320*0648a547SJomo             return Err(SystemError::EPERM);
321*0648a547SJomo         }
322*0648a547SJomo 
32302e249f3SLoGin         return Ok(0);
32402e249f3SLoGin     }
325be8cdf4bSLoGin 
setgid(gid: usize) -> Result<usize, SystemError>326*0648a547SJomo     pub fn setgid(gid: usize) -> Result<usize, SystemError> {
327*0648a547SJomo         let pcb = ProcessManager::current_pcb();
328*0648a547SJomo         let mut guard = pcb.cred.lock();
329*0648a547SJomo 
330*0648a547SJomo         if guard.egid.data() == 0 {
331*0648a547SJomo             guard.setgid(gid);
332*0648a547SJomo             guard.setegid(gid);
333*0648a547SJomo             guard.setsgid(gid);
334*0648a547SJomo             guard.setfsgid(gid);
335*0648a547SJomo         } else if guard.gid.data() == gid || guard.sgid.data() == gid {
336*0648a547SJomo             guard.setegid(gid);
337*0648a547SJomo             guard.setfsgid(gid);
338*0648a547SJomo         } else {
339*0648a547SJomo             return Err(SystemError::EPERM);
340*0648a547SJomo         }
341*0648a547SJomo 
342*0648a547SJomo         return Ok(0);
343*0648a547SJomo     }
344*0648a547SJomo 
seteuid(euid: usize) -> Result<usize, SystemError>345*0648a547SJomo     pub fn seteuid(euid: usize) -> Result<usize, SystemError> {
346*0648a547SJomo         let pcb = ProcessManager::current_pcb();
347*0648a547SJomo         let mut guard = pcb.cred.lock();
348*0648a547SJomo 
349*0648a547SJomo         if euid == usize::MAX || (euid == guard.euid.data() && euid == guard.fsuid.data()) {
350*0648a547SJomo             return Ok(0);
351*0648a547SJomo         }
352*0648a547SJomo 
353*0648a547SJomo         if euid != usize::MAX {
354*0648a547SJomo             guard.seteuid(euid);
355*0648a547SJomo         }
356*0648a547SJomo 
357*0648a547SJomo         let euid = guard.euid.data();
358*0648a547SJomo         guard.setfsuid(euid);
359*0648a547SJomo 
360*0648a547SJomo         return Ok(0);
361*0648a547SJomo     }
362*0648a547SJomo 
setegid(egid: usize) -> Result<usize, SystemError>363*0648a547SJomo     pub fn setegid(egid: usize) -> Result<usize, SystemError> {
364*0648a547SJomo         let pcb = ProcessManager::current_pcb();
365*0648a547SJomo         let mut guard = pcb.cred.lock();
366*0648a547SJomo 
367*0648a547SJomo         if egid == usize::MAX || (egid == guard.egid.data() && egid == guard.fsgid.data()) {
368*0648a547SJomo             return Ok(0);
369*0648a547SJomo         }
370*0648a547SJomo 
371*0648a547SJomo         if egid != usize::MAX {
372*0648a547SJomo             guard.setegid(egid);
373*0648a547SJomo         }
374*0648a547SJomo 
375*0648a547SJomo         let egid = guard.egid.data();
376*0648a547SJomo         guard.setfsgid(egid);
377*0648a547SJomo 
378*0648a547SJomo         return Ok(0);
379*0648a547SJomo     }
380*0648a547SJomo 
setfsuid(fsuid: usize) -> Result<usize, SystemError>381*0648a547SJomo     pub fn setfsuid(fsuid: usize) -> Result<usize, SystemError> {
382*0648a547SJomo         let fsuid = Kuid::new(fsuid);
383*0648a547SJomo 
384*0648a547SJomo         let pcb = ProcessManager::current_pcb();
385*0648a547SJomo         let mut guard = pcb.cred.lock();
386*0648a547SJomo         let old_fsuid = guard.fsuid;
387*0648a547SJomo 
388*0648a547SJomo         if fsuid == guard.uid || fsuid == guard.euid || fsuid == guard.suid {
389*0648a547SJomo             guard.setfsuid(fsuid.data());
390*0648a547SJomo         }
391*0648a547SJomo 
392*0648a547SJomo         Ok(old_fsuid.data())
393*0648a547SJomo     }
394*0648a547SJomo 
setfsgid(fsgid: usize) -> Result<usize, SystemError>395*0648a547SJomo     pub fn setfsgid(fsgid: usize) -> Result<usize, SystemError> {
396*0648a547SJomo         let fsgid = Kgid::new(fsgid);
397*0648a547SJomo 
398*0648a547SJomo         let pcb = ProcessManager::current_pcb();
399*0648a547SJomo         let mut guard = pcb.cred.lock();
400*0648a547SJomo         let old_fsgid = guard.fsgid;
401*0648a547SJomo 
402*0648a547SJomo         if fsgid == guard.gid || fsgid == guard.egid || fsgid == guard.sgid {
403*0648a547SJomo             guard.setfsgid(fsgid.data());
404*0648a547SJomo         }
405*0648a547SJomo 
406*0648a547SJomo         Ok(old_fsgid.data())
407*0648a547SJomo     }
408*0648a547SJomo 
get_rusage(who: i32, rusage: *mut RUsage) -> Result<usize, SystemError>409be8cdf4bSLoGin     pub fn get_rusage(who: i32, rusage: *mut RUsage) -> Result<usize, SystemError> {
410be8cdf4bSLoGin         let who = RUsageWho::try_from(who)?;
411be8cdf4bSLoGin         let mut writer = UserBufferWriter::new(rusage, core::mem::size_of::<RUsage>(), true)?;
412be8cdf4bSLoGin         let pcb = ProcessManager::current_pcb();
413be8cdf4bSLoGin         let rusage = pcb.get_rusage(who).ok_or(SystemError::EINVAL)?;
414be8cdf4bSLoGin 
415be8cdf4bSLoGin         let ubuf = writer.buffer::<RUsage>(0).unwrap();
416be8cdf4bSLoGin         ubuf.copy_from_slice(&[rusage]);
417be8cdf4bSLoGin 
418be8cdf4bSLoGin         return Ok(0);
419be8cdf4bSLoGin     }
4200d9b7d92SLoGin 
4210d9b7d92SLoGin     /// # 设置资源限制
4220d9b7d92SLoGin     ///
4230d9b7d92SLoGin     /// TODO: 目前暂时不支持设置资源限制,只提供读取默认值的功能
4240d9b7d92SLoGin     ///
4250d9b7d92SLoGin     /// ## 参数
4260d9b7d92SLoGin     ///
4270d9b7d92SLoGin     /// - pid: 进程号
4280d9b7d92SLoGin     /// - resource: 资源类型
4290d9b7d92SLoGin     /// - new_limit: 新的资源限制
4300d9b7d92SLoGin     /// - old_limit: 旧的资源限制
4310d9b7d92SLoGin     ///
4320d9b7d92SLoGin     /// ## 返回值
4330d9b7d92SLoGin     ///
4340d9b7d92SLoGin     /// - 成功,0
4350d9b7d92SLoGin     /// - 如果old_limit不为NULL,则返回旧的资源限制到old_limit
4360d9b7d92SLoGin     ///
prlimit64( _pid: Pid, resource: usize, _new_limit: *const RLimit64, old_limit: *mut RLimit64, ) -> Result<usize, SystemError>4370d9b7d92SLoGin     pub fn prlimit64(
4380d9b7d92SLoGin         _pid: Pid,
4390d9b7d92SLoGin         resource: usize,
440bf4a4899SLoGin         _new_limit: *const RLimit64,
4410d9b7d92SLoGin         old_limit: *mut RLimit64,
4420d9b7d92SLoGin     ) -> Result<usize, SystemError> {
4430d9b7d92SLoGin         let resource = RLimitID::try_from(resource)?;
4440d9b7d92SLoGin         let mut writer = None;
4450d9b7d92SLoGin 
4460d9b7d92SLoGin         if !old_limit.is_null() {
4470d9b7d92SLoGin             writer = Some(UserBufferWriter::new(
4480d9b7d92SLoGin                 old_limit,
4490d9b7d92SLoGin                 core::mem::size_of::<RLimit64>(),
4500d9b7d92SLoGin                 true,
4510d9b7d92SLoGin             )?);
4520d9b7d92SLoGin         }
4530d9b7d92SLoGin 
4540d9b7d92SLoGin         match resource {
4550d9b7d92SLoGin             RLimitID::Stack => {
4560d9b7d92SLoGin                 if let Some(mut writer) = writer {
4570d9b7d92SLoGin                     let mut rlimit = writer.buffer::<RLimit64>(0).unwrap()[0];
4580d9b7d92SLoGin                     rlimit.rlim_cur = UserStack::DEFAULT_USER_STACK_SIZE as u64;
4590d9b7d92SLoGin                     rlimit.rlim_max = UserStack::DEFAULT_USER_STACK_SIZE as u64;
4600d9b7d92SLoGin                 }
4610d9b7d92SLoGin                 return Ok(0);
4620d9b7d92SLoGin             }
4630d9b7d92SLoGin 
4640d9b7d92SLoGin             RLimitID::Nofile => {
4650d9b7d92SLoGin                 if let Some(mut writer) = writer {
4660d9b7d92SLoGin                     let mut rlimit = writer.buffer::<RLimit64>(0).unwrap()[0];
4670d9b7d92SLoGin                     rlimit.rlim_cur = FileDescriptorVec::PROCESS_MAX_FD as u64;
4680d9b7d92SLoGin                     rlimit.rlim_max = FileDescriptorVec::PROCESS_MAX_FD as u64;
4690d9b7d92SLoGin                 }
4700d9b7d92SLoGin                 return Ok(0);
4710d9b7d92SLoGin             }
4720d9b7d92SLoGin 
4730d9b7d92SLoGin             RLimitID::As | RLimitID::Rss => {
4740d9b7d92SLoGin                 if let Some(mut writer) = writer {
4750d9b7d92SLoGin                     let mut rlimit = writer.buffer::<RLimit64>(0).unwrap()[0];
4760d9b7d92SLoGin                     rlimit.rlim_cur = MMArch::USER_END_VADDR.data() as u64;
4770d9b7d92SLoGin                     rlimit.rlim_max = MMArch::USER_END_VADDR.data() as u64;
4780d9b7d92SLoGin                 }
4790d9b7d92SLoGin                 return Ok(0);
4800d9b7d92SLoGin             }
4810d9b7d92SLoGin 
4820d9b7d92SLoGin             _ => {
4830d9b7d92SLoGin                 return Err(SystemError::ENOSYS);
4840d9b7d92SLoGin             }
4850d9b7d92SLoGin         }
4860d9b7d92SLoGin     }
4878c6f2184Ssspphh 
uname(name: *mut PosixOldUtsName) -> Result<usize, SystemError>4888c6f2184Ssspphh     pub fn uname(name: *mut PosixOldUtsName) -> Result<usize, SystemError> {
4898c6f2184Ssspphh         let mut writer =
4908c6f2184Ssspphh             UserBufferWriter::new(name, core::mem::size_of::<PosixOldUtsName>(), true)?;
4918c6f2184Ssspphh         writer.copy_one_to_user(&PosixOldUtsName::new(), 0)?;
4928c6f2184Ssspphh 
4938c6f2184Ssspphh         return Ok(0);
4948c6f2184Ssspphh     }
495ab5c8ca4Slogin }
496