From ff2a295257eabe54dc6f80172e07f7b4c5262b63 Mon Sep 17 00:00:00 2001 From: Lubos Dolezel Date: Sun, 1 Nov 2015 23:30:22 +0100 Subject: [PATCH] Add sys_waitid() implementation --- src/kernel/emulation/linux/CMakeLists.txt | 1 + src/kernel/emulation/linux/process/waitid.c | 27 +++++++++++++++++++++ src/kernel/emulation/linux/process/waitid.h | 14 +++++++++++ src/kernel/emulation/linux/syscalls.c | 2 ++ 4 files changed, 44 insertions(+) create mode 100644 src/kernel/emulation/linux/process/waitid.c create mode 100644 src/kernel/emulation/linux/process/waitid.h diff --git a/src/kernel/emulation/linux/CMakeLists.txt b/src/kernel/emulation/linux/CMakeLists.txt index aa0ec52dd..a79ceb17a 100644 --- a/src/kernel/emulation/linux/CMakeLists.txt +++ b/src/kernel/emulation/linux/CMakeLists.txt @@ -56,6 +56,7 @@ set(emulation_sources process/vfork.c process/fork.c process/wait4.c + process/waitid.c signal/duct_signals.c signal/kill.c signal/sigaltstack.c diff --git a/src/kernel/emulation/linux/process/waitid.c b/src/kernel/emulation/linux/process/waitid.c new file mode 100644 index 000000000..3e5316339 --- /dev/null +++ b/src/kernel/emulation/linux/process/waitid.c @@ -0,0 +1,27 @@ +#include "waitid.h" +#include "../base.h" +#include "../errno.h" +#include "../signal/duct_signals.h" +#include "wait4.h" +#include +#include + +long sys_waitid(int idtype, int id, struct simple_siginfo* si, int options) +{ + int ret, linux_options; + + linux_options = waitopts_bsd_to_linux(options); + + ret = LINUX_SYSCALL(__NR_waitid, idtype, id, si, linux_options); + if (ret < 0) + return errno_linux_to_bsd(ret); + + if (si != NULL) + { + si->si_signo = signum_linux_to_bsd(si->si_signo); + si->si_errno = errno_linux_to_bsd(si->si_errno); + } + + return ret; +} + diff --git a/src/kernel/emulation/linux/process/waitid.h b/src/kernel/emulation/linux/process/waitid.h new file mode 100644 index 000000000..e4c5b3080 --- /dev/null +++ b/src/kernel/emulation/linux/process/waitid.h @@ -0,0 +1,14 @@ +#ifndef LINUX_WAITID_H +#define LINUX_WAITID_H + +struct simple_siginfo +{ + int si_signo; + int si_errno; + int si_code; +}; + +long sys_waitid(int idtype, int id, struct simple_siginfo* si, int options); + +#endif + diff --git a/src/kernel/emulation/linux/syscalls.c b/src/kernel/emulation/linux/syscalls.c index c35d8326f..b558fdf01 100644 --- a/src/kernel/emulation/linux/syscalls.c +++ b/src/kernel/emulation/linux/syscalls.c @@ -46,6 +46,7 @@ #include "signal/sigreturn.h" #include "process/vfork.h" #include "process/wait4.h" +#include "process/waitid.h" #include "misc/ioctl.h" #include "misc/getrlimit.h" #include "misc/thread_selfid.h" @@ -139,6 +140,7 @@ void* __bsd_syscall_table[512] = { [154] = sys_pwrite, [157] = sys_statfs, [158] = sys_fstatfs, + [173] = sys_waitid, [181] = sys_setgid, [182] = sys_setegid, [183] = sys_seteuid, -- 2.51.2