1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 06:37:35 +00:00

Kernel: Implement fchdir syscall

The fchdir() function is equivalent to chdir() except that the
directory that is to be the new current working directory is
specified by a file descriptor.
This commit is contained in:
Mauri de Souza Nunes 2019-09-11 20:18:25 -03:00 committed by Andreas Kling
parent 26e81ad574
commit 7d85fc00e4
6 changed files with 24 additions and 0 deletions

View file

@ -1202,6 +1202,19 @@ int Process::sys$chdir(const char* path)
return 0;
}
int Process::sys$fchdir(int fd)
{
auto* description = file_description(fd);
if (!description)
return -EBADF;
if (!description->is_directory())
return -ENOTDIR;
m_cwd = description->custody();
return 0;
}
int Process::sys$getcwd(char* buffer, ssize_t size)
{
if (size < 0)

View file

@ -152,6 +152,7 @@ public:
ssize_t sys$get_dir_entries(int fd, void*, ssize_t);
int sys$getcwd(char*, ssize_t);
int sys$chdir(const char*);
int sys$fchdir(int fd);
int sys$sleep(unsigned seconds);
int sys$usleep(useconds_t usec);
int sys$gettimeofday(timeval*);

View file

@ -136,6 +136,8 @@ static u32 handle(RegisterDump& regs, u32 function, u32 arg1, u32 arg2, u32 arg3
break;
case Syscall::SC_chdir:
return current->process().sys$chdir((const char*)arg1);
case Syscall::SC_fchdir:
return current->process().sys$fchdir((int)arg1);
case Syscall::SC_uname:
return current->process().sys$uname((utsname*)arg1);
case Syscall::SC_set_mmap_name:

View file

@ -32,6 +32,7 @@ struct timeval;
__ENUMERATE_SYSCALL(gettimeofday) \
__ENUMERATE_SYSCALL(gethostname) \
__ENUMERATE_SYSCALL(chdir) \
__ENUMERATE_SYSCALL(fchdir) \
__ENUMERATE_SYSCALL(uname) \
__ENUMERATE_SYSCALL(set_mmap_name) \
__ENUMERATE_SYSCALL(readlink) \