From dcd345f6d3d47ff92e8acb32c9c7c499ed69778a Mon Sep 17 00:00:00 2001 From: LoGin Date: Thu, 17 Oct 2024 11:38:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0SYS=5FMKDIRAT?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E8=B0=83=E7=94=A8=20(#986)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将内核原本实现的do_mkdir_at暴露出来,实现SYS_MKDIRAT Signed-off-by: longjin --- kernel/src/filesystem/vfs/core.rs | 3 ++- kernel/src/filesystem/vfs/syscall.rs | 8 ++++++++ kernel/src/syscall/mod.rs | 7 +++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/kernel/src/filesystem/vfs/core.rs b/kernel/src/filesystem/vfs/core.rs index f52470f6..e519417b 100644 --- a/kernel/src/filesystem/vfs/core.rs +++ b/kernel/src/filesystem/vfs/core.rs @@ -172,7 +172,8 @@ pub fn do_mkdir_at( user_path_at(&ProcessManager::current_pcb(), dirfd, path.trim())?; let (name, parent) = rsplit_path(&path); if let Some(parent) = parent { - current_inode = current_inode.lookup(parent)?; + current_inode = + current_inode.lookup_follow_symlink(parent, VFS_MAX_FOLLOW_SYMLINK_TIMES)?; } // debug!("mkdir at {:?}", current_inode.metadata()?.inode_id); return current_inode.mkdir(name, ModeType::from_bits_truncate(mode.bits())); diff --git a/kernel/src/filesystem/vfs/syscall.rs b/kernel/src/filesystem/vfs/syscall.rs index 53e674f4..545d05f0 100644 --- a/kernel/src/filesystem/vfs/syscall.rs +++ b/kernel/src/filesystem/vfs/syscall.rs @@ -807,6 +807,14 @@ impl Syscall { return Ok(0); } + pub fn mkdir_at(dirfd: i32, path: *const u8, mode: usize) -> Result { + let path = check_and_clone_cstr(path, Some(MAX_PATHLEN))? + .into_string() + .map_err(|_| SystemError::EINVAL)?; + do_mkdir_at(dirfd, &path, FileMode::from_bits_truncate(mode as u32))?; + return Ok(0); + } + /// **创建硬连接的系统调用** /// /// ## 参数 diff --git a/kernel/src/syscall/mod.rs b/kernel/src/syscall/mod.rs index 7addb0c4..3502f6ff 100644 --- a/kernel/src/syscall/mod.rs +++ b/kernel/src/syscall/mod.rs @@ -295,6 +295,13 @@ impl Syscall { Self::mkdir(path, mode) } + SYS_MKDIRAT => { + let dirfd = args[0] as i32; + let path = args[1] as *const u8; + let mode = args[2]; + Self::mkdir_at(dirfd, path, mode) + } + SYS_NANOSLEEP => { let req = args[0] as *const PosixTimeSpec; let rem = args[1] as *mut PosixTimeSpec;