From 5eeefb8c80e5580641d295724f8d2190bd54979c Mon Sep 17 00:00:00 2001 From: Chenzx <109664121+schulice@users.noreply.github.com> Date: Fri, 8 Mar 2024 16:01:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0SYS=5FRMDIR=20(#566)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 实现rmdir系统调用,整理do_remove_dir逻辑 --- kernel/src/filesystem/vfs/core.rs | 17 ++++++----------- kernel/src/filesystem/vfs/syscall.rs | 9 +++++++++ kernel/src/syscall/mod.rs | 6 ++++++ kernel/src/syscall/syscall_num.h | 2 ++ 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/kernel/src/filesystem/vfs/core.rs b/kernel/src/filesystem/vfs/core.rs index 7a505067..d4b702e6 100644 --- a/kernel/src/filesystem/vfs/core.rs +++ b/kernel/src/filesystem/vfs/core.rs @@ -220,19 +220,13 @@ pub fn do_remove_dir(dirfd: i32, path: &str) -> Result { let pcb = ProcessManager::current_pcb(); let (inode_begin, remain_path) = user_path_at(&pcb, dirfd, path)?; + let (filename, parent_path) = rsplit_path(&remain_path); - let inode: Result, SystemError> = - inode_begin.lookup_follow_symlink(remain_path.as_str(), VFS_MAX_FOLLOW_SYMLINK_TIMES); - - if inode.is_err() { - let errno = inode.unwrap_err(); - // 文件不存在 - if errno == SystemError::ENOENT { - return Err(SystemError::ENOENT); - } + // 最后一项文件项为.时返回EINVAL + if filename == "." { + return Err(SystemError::EINVAL); } - let (filename, parent_path) = rsplit_path(&remain_path); // 查找父目录 let parent_inode: Arc = inode_begin .lookup_follow_symlink(parent_path.unwrap_or("/"), VFS_MAX_FOLLOW_SYMLINK_TIMES)?; @@ -241,7 +235,8 @@ pub fn do_remove_dir(dirfd: i32, path: &str) -> Result { return Err(SystemError::ENOTDIR); } - let target_inode: Arc = parent_inode.find(filename)?; + // 在目标点为symlink时也返回ENOTDIR + let target_inode = parent_inode.find(filename)?; if target_inode.metadata()?.file_type != FileType::Dir { return Err(SystemError::ENOTDIR); } diff --git a/kernel/src/filesystem/vfs/syscall.rs b/kernel/src/filesystem/vfs/syscall.rs index e2ff1192..67986e6a 100644 --- a/kernel/src/filesystem/vfs/syscall.rs +++ b/kernel/src/filesystem/vfs/syscall.rs @@ -574,6 +574,15 @@ impl Syscall { } } + pub fn rmdir(pathname: *const u8) -> Result { + let pathname: String = check_and_clone_cstr(pathname, Some(MAX_PATHLEN))?; + if pathname.len() >= MAX_PATHLEN { + return Err(SystemError::ENAMETOOLONG); + } + let pathname = pathname.as_str().trim(); + return do_remove_dir(AtFlags::AT_FDCWD.bits(), pathname).map(|v| v as usize); + } + pub fn unlink(pathname: *const u8) -> Result { if pathname.is_null() { return Err(SystemError::EFAULT); diff --git a/kernel/src/syscall/mod.rs b/kernel/src/syscall/mod.rs index 132768a2..1e9bcfbc 100644 --- a/kernel/src/syscall/mod.rs +++ b/kernel/src/syscall/mod.rs @@ -408,6 +408,12 @@ impl Syscall { } } + #[cfg(target_arch = "x86_64")] + SYS_RMDIR => { + let pathname = args[0] as *const u8; + Self::rmdir(pathname) + } + #[cfg(target_arch = "x86_64")] SYS_UNLINK => { let pathname = args[0] as *const u8; diff --git a/kernel/src/syscall/syscall_num.h b/kernel/src/syscall/syscall_num.h index 8130fa8a..9b546243 100644 --- a/kernel/src/syscall/syscall_num.h +++ b/kernel/src/syscall/syscall_num.h @@ -65,6 +65,8 @@ #define SYS_MKDIR 83 +#define SYS_RMDIR 84 + #define SYS_GETTIMEOFDAY 96 #define SYS_ARCH_PRCTL 158