From 6f9dc2a9b89d240efc4075e8e3a4aef22e25f16e Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sat, 19 Apr 2025 21:28:31 +0300 Subject: [PATCH] Kernel/LibC: Implement `fchdir`, cleanup `chdir` and `getcwd` --- kernel/include/kernel/Process.h | 5 +-- kernel/kernel/Process.cpp | 34 +++++++++++++------ .../libraries/LibC/include/sys/syscall.h | 5 +-- userspace/libraries/LibC/unistd.cpp | 9 +++-- 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index ee2b1adc..837810af 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -72,8 +72,9 @@ namespace Kernel BAN::ErrorOr sys_nanosleep(const timespec* rqtp, timespec* rmtp); BAN::ErrorOr sys_setitimer(int which, const itimerval* value, itimerval* ovalue); - BAN::ErrorOr sys_setpwd(const char* path); - BAN::ErrorOr sys_getpwd(char* buffer, size_t size); + BAN::ErrorOr sys_getcwd(char* buffer, size_t size); + BAN::ErrorOr sys_chdir(const char* path); + BAN::ErrorOr sys_fchdir(int fildes); BAN::ErrorOr sys_setuid(uid_t); BAN::ErrorOr sys_setgid(gid_t); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 270e7a99..c95fb26c 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -1648,17 +1648,7 @@ namespace Kernel return TRY(m_open_file_descriptors.read_dir_entries(fd, list, list_len)); } - BAN::ErrorOr Process::sys_setpwd(const char* path) - { - LockGuard _(m_process_lock); - - auto file = TRY(find_file(AT_FDCWD, path, O_SEARCH)); - m_working_directory = BAN::move(file); - - return 0; - } - - BAN::ErrorOr Process::sys_getpwd(char* buffer, size_t size) + BAN::ErrorOr Process::sys_getcwd(char* buffer, size_t size) { LockGuard _(m_process_lock); @@ -1673,6 +1663,28 @@ namespace Kernel return (long)buffer; } + BAN::ErrorOr Process::sys_chdir(const char* path) + { + LockGuard _(m_process_lock); + + TRY(validate_string_access(path)); + + auto file = TRY(find_file(AT_FDCWD, path, O_SEARCH)); + m_working_directory = BAN::move(file); + + return 0; + } + + BAN::ErrorOr Process::sys_fchdir(int fildes) + { + LockGuard _(m_process_lock); + + auto file = TRY(m_open_file_descriptors.file_of(fildes)); + m_working_directory = BAN::move(file); + + return 0; + } + BAN::ErrorOr Process::sys_mmap(const sys_mmap_t* args) { { diff --git a/userspace/libraries/LibC/include/sys/syscall.h b/userspace/libraries/LibC/include/sys/syscall.h index e99792c9..517b45da 100644 --- a/userspace/libraries/LibC/include/sys/syscall.h +++ b/userspace/libraries/LibC/include/sys/syscall.h @@ -32,8 +32,9 @@ __BEGIN_DECLS O(SYS_GET_GID, getgid) \ O(SYS_GET_EUID, geteuid) \ O(SYS_GET_EGID, getegid) \ - O(SYS_GET_PWD, getpwd) \ - O(SYS_SET_PWD, setpwd) \ + O(SYS_GETCWD, getcwd) \ + O(SYS_CHDIR, chdir) \ + O(SYS_FCHDIR, fchdir) \ O(SYS_CLOCK_GETTIME, clock_gettime) \ O(SYS_PIPE, pipe) \ O(SYS_DUP2, dup2) \ diff --git a/userspace/libraries/LibC/unistd.cpp b/userspace/libraries/LibC/unistd.cpp index f51ac762..98559f18 100644 --- a/userspace/libraries/LibC/unistd.cpp +++ b/userspace/libraries/LibC/unistd.cpp @@ -426,7 +426,7 @@ char* getcwd(char* buf, size_t size) return nullptr; } - if (syscall(SYS_GET_PWD, buf, size) == 0) + if (syscall(SYS_GETCWD, buf, size) == 0) return nullptr; return buf; @@ -434,7 +434,12 @@ char* getcwd(char* buf, size_t size) int chdir(const char* path) { - return syscall(SYS_SET_PWD, path); + return syscall(SYS_CHDIR, path); +} + +int fchdir(int fildes) +{ + return syscall(SYS_FCHDIR, fildes); } int chown(const char* path, uid_t owner, gid_t group)