Kernel/LibC: Implement `fchdir`, cleanup `chdir` and `getcwd`

This commit is contained in:
Bananymous 2025-04-19 21:28:31 +03:00
parent 7edfae8583
commit 6f9dc2a9b8
4 changed files with 36 additions and 17 deletions

View File

@ -72,8 +72,9 @@ namespace Kernel
BAN::ErrorOr<long> sys_nanosleep(const timespec* rqtp, timespec* rmtp); BAN::ErrorOr<long> sys_nanosleep(const timespec* rqtp, timespec* rmtp);
BAN::ErrorOr<long> sys_setitimer(int which, const itimerval* value, itimerval* ovalue); BAN::ErrorOr<long> sys_setitimer(int which, const itimerval* value, itimerval* ovalue);
BAN::ErrorOr<long> sys_setpwd(const char* path); BAN::ErrorOr<long> sys_getcwd(char* buffer, size_t size);
BAN::ErrorOr<long> sys_getpwd(char* buffer, size_t size); BAN::ErrorOr<long> sys_chdir(const char* path);
BAN::ErrorOr<long> sys_fchdir(int fildes);
BAN::ErrorOr<long> sys_setuid(uid_t); BAN::ErrorOr<long> sys_setuid(uid_t);
BAN::ErrorOr<long> sys_setgid(gid_t); BAN::ErrorOr<long> sys_setgid(gid_t);

View File

@ -1648,17 +1648,7 @@ namespace Kernel
return TRY(m_open_file_descriptors.read_dir_entries(fd, list, list_len)); return TRY(m_open_file_descriptors.read_dir_entries(fd, list, list_len));
} }
BAN::ErrorOr<long> Process::sys_setpwd(const char* path) BAN::ErrorOr<long> Process::sys_getcwd(char* buffer, size_t size)
{
LockGuard _(m_process_lock);
auto file = TRY(find_file(AT_FDCWD, path, O_SEARCH));
m_working_directory = BAN::move(file);
return 0;
}
BAN::ErrorOr<long> Process::sys_getpwd(char* buffer, size_t size)
{ {
LockGuard _(m_process_lock); LockGuard _(m_process_lock);
@ -1673,6 +1663,28 @@ namespace Kernel
return (long)buffer; return (long)buffer;
} }
BAN::ErrorOr<long> 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<long> 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<long> Process::sys_mmap(const sys_mmap_t* args) BAN::ErrorOr<long> Process::sys_mmap(const sys_mmap_t* args)
{ {
{ {

View File

@ -32,8 +32,9 @@ __BEGIN_DECLS
O(SYS_GET_GID, getgid) \ O(SYS_GET_GID, getgid) \
O(SYS_GET_EUID, geteuid) \ O(SYS_GET_EUID, geteuid) \
O(SYS_GET_EGID, getegid) \ O(SYS_GET_EGID, getegid) \
O(SYS_GET_PWD, getpwd) \ O(SYS_GETCWD, getcwd) \
O(SYS_SET_PWD, setpwd) \ O(SYS_CHDIR, chdir) \
O(SYS_FCHDIR, fchdir) \
O(SYS_CLOCK_GETTIME, clock_gettime) \ O(SYS_CLOCK_GETTIME, clock_gettime) \
O(SYS_PIPE, pipe) \ O(SYS_PIPE, pipe) \
O(SYS_DUP2, dup2) \ O(SYS_DUP2, dup2) \

View File

@ -426,7 +426,7 @@ char* getcwd(char* buf, size_t size)
return nullptr; return nullptr;
} }
if (syscall(SYS_GET_PWD, buf, size) == 0) if (syscall(SYS_GETCWD, buf, size) == 0)
return nullptr; return nullptr;
return buf; return buf;
@ -434,7 +434,12 @@ char* getcwd(char* buf, size_t size)
int chdir(const char* path) 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) int chown(const char* path, uid_t owner, gid_t group)