diff --git a/src/kernel/emulation/linux/CMakeLists.txt b/src/kernel/emulation/linux/CMakeLists.txt index 80432d02a..765030a65 100644 --- a/src/kernel/emulation/linux/CMakeLists.txt +++ b/src/kernel/emulation/linux/CMakeLists.txt @@ -56,6 +56,7 @@ set(emulation_sources unistd/chroot.c unistd/getgid.c unistd/getppid.c + unistd/rename.c process/vfork.c process/fork.c process/wait4.c diff --git a/src/kernel/emulation/linux/syscalls.c b/src/kernel/emulation/linux/syscalls.c index a912cec03..cf3578083 100644 --- a/src/kernel/emulation/linux/syscalls.c +++ b/src/kernel/emulation/linux/syscalls.c @@ -42,6 +42,7 @@ #include "unistd/chown.h" #include "unistd/getgid.h" #include "unistd/getppid.h" +#include "unistd/rename.h" #include "signal/kill.h" #include "signal/sigaltstack.h" #include "signal/sigaction.h" @@ -154,6 +155,7 @@ void* __bsd_syscall_table[512] = { [121] = sys_writev, [123] = sys_fchown, [124] = sys_fchmod, + [128] = sys_rename, [132] = sys_mkfifo, [134] = sys_shutdown, [136] = sys_mkdir, diff --git a/src/kernel/emulation/linux/unistd/rename.c b/src/kernel/emulation/linux/unistd/rename.c new file mode 100644 index 000000000..442ead716 --- /dev/null +++ b/src/kernel/emulation/linux/unistd/rename.c @@ -0,0 +1,19 @@ +#include "rename.h" +#include "../base.h" +#include "../errno.h" +#include + +long sys_rename(const char* oldpath, const char* newpath) +{ + int ret; + + // TODO: handle case conversion + + ret = LINUX_SYSCALL(__NR_rename, oldpath, newpath); + + if (ret < 0) + return errno_linux_to_bsd(ret); + + return 0; +} + diff --git a/src/kernel/emulation/linux/unistd/rename.h b/src/kernel/emulation/linux/unistd/rename.h new file mode 100644 index 000000000..15efe00f9 --- /dev/null +++ b/src/kernel/emulation/linux/unistd/rename.h @@ -0,0 +1,7 @@ +#ifndef LINUX_RENAME_H +#define LINUX_RENAME_H + +long sys_rename(const char* oldpath, const char* newpath); + +#endif +