diff --git a/kernel/src/filesystem/vfs/syscall.rs b/kernel/src/filesystem/vfs/syscall.rs index 795469bd..f9ca9528 100644 --- a/kernel/src/filesystem/vfs/syscall.rs +++ b/kernel/src/filesystem/vfs/syscall.rs @@ -740,6 +740,22 @@ impl Syscall { } } + pub fn fchdir(fd: i32) -> Result { + let pcb = ProcessManager::current_pcb(); + let file = pcb + .fd_table() + .read() + .get_file_by_fd(fd) + .ok_or(SystemError::EBADF)?; + let inode = file.inode(); + if inode.metadata()?.file_type != FileType::Dir { + return Err(SystemError::ENOTDIR); + } + let path = inode.absolute_path()?; + pcb.basic_mut().set_cwd(path); + return Ok(0); + } + /// @brief 获取当前进程的工作目录路径 /// /// @param buf 指向缓冲区的指针 diff --git a/kernel/src/syscall/mod.rs b/kernel/src/syscall/mod.rs index f9f7db29..c904cd90 100644 --- a/kernel/src/syscall/mod.rs +++ b/kernel/src/syscall/mod.rs @@ -238,6 +238,10 @@ impl Syscall { let r = args[0] as *const u8; Self::chdir(r) } + SYS_FCHDIR => { + let fd = args[0] as i32; + Self::fchdir(fd) + } #[allow(unreachable_patterns)] SYS_GETDENTS64 | SYS_GETDENTS => {