From b75970958e8b97fc2f2ecf982634a33bb9dbb31a Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sun, 1 Jun 2025 05:06:47 +0300 Subject: [PATCH] Kernel/LibC: Implement unlinkat --- kernel/include/kernel/Process.h | 2 +- kernel/kernel/Process.cpp | 11 +++++++++-- userspace/libraries/LibC/include/sys/syscall.h | 2 +- userspace/libraries/LibC/unistd.cpp | 9 +++++++-- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index cb83f003..44999608 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -107,7 +107,7 @@ namespace Kernel BAN::ErrorOr sys_access(const char* path, int amode); BAN::ErrorOr sys_create_dir(const char*, mode_t); BAN::ErrorOr sys_hardlinkat(int fd1, const char* path1, int fd2, const char* path2, int flag); - BAN::ErrorOr sys_unlink(const char*); + BAN::ErrorOr sys_unlinkat(int fd, const char* path, int flag); BAN::ErrorOr sys_readlinkat(int fd, const char* path, char* buffer, size_t bufsize); BAN::ErrorOr sys_symlinkat(const char* path1, int fd, const char* path2); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 7df76edd..54d9810b 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -1158,12 +1158,19 @@ namespace Kernel return 0; } - BAN::ErrorOr Process::sys_unlink(const char* path) + BAN::ErrorOr Process::sys_unlinkat(int fd, const char* path, int flag) { + if (flag && flag != AT_REMOVEDIR) + return BAN::Error::from_errno(EINVAL); + LockGuard _(m_process_lock); TRY(validate_string_access(path)); - auto [parent, file_name] = TRY(find_parent_file(AT_FDCWD, path, O_WRONLY)); + auto [parent, file_name] = TRY(find_parent_file(fd, path, O_WRONLY)); + + if (TRY(parent.inode->find_inode(file_name))->mode().ifdir() != (flag == AT_REMOVEDIR)) + return BAN::Error::from_errno(flag ? EPERM : ENOTDIR); + TRY(parent.inode->unlink(file_name)); return 0; diff --git a/userspace/libraries/LibC/include/sys/syscall.h b/userspace/libraries/LibC/include/sys/syscall.h index c8cf2e93..7a15417c 100644 --- a/userspace/libraries/LibC/include/sys/syscall.h +++ b/userspace/libraries/LibC/include/sys/syscall.h @@ -56,7 +56,7 @@ __BEGIN_DECLS O(SYS_POWEROFF, poweroff) \ O(SYS_FCHMODAT, fchmodat) \ O(SYS_CREATE_DIR, create_dir) \ - O(SYS_UNLINK, unlink) \ + O(SYS_UNLINKAT, unlinkat) \ O(SYS_READLINKAT, readlinkat) \ O(SYS_MSYNC, msync) \ O(SYS_PREAD, pread) \ diff --git a/userspace/libraries/LibC/unistd.cpp b/userspace/libraries/LibC/unistd.cpp index 6560b78b..48f21720 100644 --- a/userspace/libraries/LibC/unistd.cpp +++ b/userspace/libraries/LibC/unistd.cpp @@ -518,12 +518,17 @@ int fdatasync(int fildes) int unlink(const char* path) { - return syscall(SYS_UNLINK, path); + return unlinkat(AT_FDCWD, path, 0); +} + +int unlinkat(int fd, const char* path, int flag) +{ + return syscall(SYS_UNLINKAT, fd, path, flag); } int rmdir(const char* path) { - return syscall(SYS_UNLINK, path); + return unlinkat(AT_FDCWD, path, AT_REMOVEDIR); } char* optarg = nullptr;