diff --git a/src/kernel/emulation/linux/CMakeLists.txt b/src/kernel/emulation/linux/CMakeLists.txt index 839e3c90f..72ff00ecb 100644 --- a/src/kernel/emulation/linux/CMakeLists.txt +++ b/src/kernel/emulation/linux/CMakeLists.txt @@ -49,6 +49,7 @@ set(emulation_sources unistd/unlink.c unistd/chdir.c unistd/mknod.c + unistd/chmod.c unistd/umask.c unistd/chroot.c process/vfork.c diff --git a/src/kernel/emulation/linux/syscalls.c b/src/kernel/emulation/linux/syscalls.c index 99347a797..625281dc2 100644 --- a/src/kernel/emulation/linux/syscalls.c +++ b/src/kernel/emulation/linux/syscalls.c @@ -38,6 +38,7 @@ #include "unistd/unlink.h" #include "unistd/chdir.h" #include "unistd/mknod.h" +#include "unistd/chmod.h" #include "signal/kill.h" #include "signal/sigaltstack.h" #include "signal/sigaction.h" @@ -79,6 +80,7 @@ void* __bsd_syscall_table[512] = { [12] = sys_chdir, [13] = sys_fchdir, [14] = sys_mknod, + [15] = sys_chmod, [18] = sys_getfsstat, [20] = sys_getpid, [23] = sys_setuid, diff --git a/src/kernel/emulation/linux/unistd/chmod.c b/src/kernel/emulation/linux/unistd/chmod.c new file mode 100644 index 000000000..62c9d5f6e --- /dev/null +++ b/src/kernel/emulation/linux/unistd/chmod.c @@ -0,0 +1,18 @@ +#include "chmod.h" +#include "../base.h" +#include "../errno.h" +#include + +long sys_chmod(const char* path, int mode) +{ + int ret; + + // TODO: case translation + + ret = LINUX_SYSCALL(__NR_chmod, path, mode); + if (ret < 0) + ret = errno_linux_to_bsd(ret); + + return ret; +} + diff --git a/src/kernel/emulation/linux/unistd/chmod.h b/src/kernel/emulation/linux/unistd/chmod.h new file mode 100644 index 000000000..b9e1de994 --- /dev/null +++ b/src/kernel/emulation/linux/unistd/chmod.h @@ -0,0 +1,7 @@ +#ifndef LINUX_CHMOD_H +#define LINUX_CHMOD_H + +long sys_chmod(const char* path, int mode); + +#endif +