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(¤t_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