diff --git a/src/kernel/emulation/linux/CMakeLists.txt b/src/kernel/emulation/linux/CMakeLists.txt index 859eef3c1..4719f0e95 100644 --- a/src/kernel/emulation/linux/CMakeLists.txt +++ b/src/kernel/emulation/linux/CMakeLists.txt @@ -46,6 +46,8 @@ set(emulation_sources unistd/readlink.c unistd/symlink.c unistd/umask.c + unistd/chroot.c + process/vfork.c signal/duct_signals.c signal/kill.c signal/sigaltstack.c diff --git a/src/kernel/emulation/linux/process/vfork.c b/src/kernel/emulation/linux/process/vfork.c new file mode 100644 index 000000000..766a8ddb7 --- /dev/null +++ b/src/kernel/emulation/linux/process/vfork.c @@ -0,0 +1,21 @@ +#include "vfork.h" +#include "../base.h" +#include "../errno.h" +#include "../signal/duct_signals.h" +#include + +long sys_vfork(void) +{ + int ret; + +#ifdef SYS_fork + ret = LINUX_SYSCALL(__NR_fork); +#else + ret = LINUX_SYSCALL(__NR_clone, LINUX_SIGCHLD, 0); +#endif + if (ret < 0) + ret = errno_linux_to_bsd(ret); + + return ret; +} + diff --git a/src/kernel/emulation/linux/process/vfork.h b/src/kernel/emulation/linux/process/vfork.h new file mode 100644 index 000000000..c5fe250a1 --- /dev/null +++ b/src/kernel/emulation/linux/process/vfork.h @@ -0,0 +1,7 @@ +#ifndef LINUX_VFORK_H +#define LINUX_VFORK_H + +long sys_vfork(void); + +#endif + diff --git a/src/kernel/emulation/linux/syscalls.c b/src/kernel/emulation/linux/syscalls.c index 24a591408..748e22e5b 100644 --- a/src/kernel/emulation/linux/syscalls.c +++ b/src/kernel/emulation/linux/syscalls.c @@ -33,10 +33,12 @@ #include "unistd/getegid.h" #include "unistd/symlink.h" #include "unistd/umask.h" +#include "unistd/chroot.h" #include "signal/kill.h" #include "signal/sigaltstack.h" #include "signal/sigaction.h" #include "signal/sigreturn.h" +#include "process/vfork.h" #include "misc/ioctl.h" #include "misc/getrlimit.h" #include "misc/thread_selfid.h" @@ -57,6 +59,7 @@ #include "time/gettimeofday.h" #include "time/utimes.h" #include "time/futimes.h" +#include "process/vfork.h" #include "wqueue/bsdthread_register.h" void* __bsd_syscall_table[512] = { @@ -82,6 +85,8 @@ void* __bsd_syscall_table[512] = { [57] = sys_symlink, [58] = sys_readlink, [60] = sys_umask, + [61] = sys_chroot, + [66] = sys_vfork, [73] = sys_munmap, [74] = sys_mprotect, [78] = sys_mincore, diff --git a/src/kernel/emulation/linux/unistd/chroot.c b/src/kernel/emulation/linux/unistd/chroot.c new file mode 100644 index 000000000..68d2e7c41 --- /dev/null +++ b/src/kernel/emulation/linux/unistd/chroot.c @@ -0,0 +1,18 @@ +#include "chroot.h" +#include "../base.h" +#include "../errno.h" +#include + +long sys_chroot(const char* path) +{ + int ret; + + // TODO: case translation + + ret = LINUX_SYSCALL(__NR_chroot, path); + if (ret < 0) + ret = errno_linux_to_bsd(ret); + + return ret; +} + diff --git a/src/kernel/emulation/linux/unistd/chroot.h b/src/kernel/emulation/linux/unistd/chroot.h new file mode 100644 index 000000000..c8ff27deb --- /dev/null +++ b/src/kernel/emulation/linux/unistd/chroot.h @@ -0,0 +1,7 @@ +#ifndef LINUX_CHROOT_H +#define LINUX_CHROOT_H + +long sys_chroot(const char* path); + +#endif +