diff --git a/src/kernel/emulation/linux/CMakeLists.txt b/src/kernel/emulation/linux/CMakeLists.txt index 8efd41e4a..896fc93a6 100644 --- a/src/kernel/emulation/linux/CMakeLists.txt +++ b/src/kernel/emulation/linux/CMakeLists.txt @@ -147,6 +147,7 @@ set(emulation_sources signal/sigprocmask.c signal/sig_restorer.S signal/sigsuspend.c + signal/sigpending.c signal/sigexc.c signal/sigwait.c misc/ptrace.c diff --git a/src/kernel/emulation/linux/signal/sigpending.c b/src/kernel/emulation/linux/signal/sigpending.c new file mode 100644 index 000000000..0f9bcd38c --- /dev/null +++ b/src/kernel/emulation/linux/signal/sigpending.c @@ -0,0 +1,22 @@ +#include "sigpending.h" +#include "../base.h" +#include "../errno.h" +#include "duct_signals.h" +#include +#include + +long sys_sigpending(sigset_t set) +{ + linux_sigset_t set_linux; + int ret; + + sigset_bsd_to_linux(&set, &set_linux); + + ret = LINUX_SYSCALL(__NR_rt_sigpending, &set_linux, 8); + + if (ret < 0) + ret = errno_linux_to_bsd(ret); + + return ret; +} + diff --git a/src/kernel/emulation/linux/signal/sigpending.h b/src/kernel/emulation/linux/signal/sigpending.h new file mode 100644 index 000000000..733a55667 --- /dev/null +++ b/src/kernel/emulation/linux/signal/sigpending.h @@ -0,0 +1,8 @@ +#ifndef LINUX_SIGPENDING_H +#define LINUX_SIGPENDING_H +#include "duct_signals.h" + +long sys_sigpending(sigset_t set); + +#endif + diff --git a/src/kernel/emulation/linux/syscalls.c b/src/kernel/emulation/linux/syscalls.c index 8f727163f..3f08323dc 100644 --- a/src/kernel/emulation/linux/syscalls.c +++ b/src/kernel/emulation/linux/syscalls.c @@ -94,6 +94,7 @@ #include "signal/sigreturn.h" #include "signal/sigprocmask.h" #include "signal/sigsuspend.h" +#include "signal/sigpending.h" #include "signal/sigwait.h" #include "process/vfork.h" #include "process/wait4.h" @@ -244,6 +245,7 @@ void* __bsd_syscall_table[600] = { [48] = sys_sigprocmask, [49] = sys_getlogin, [50] = sys_setlogin, + [52] = sys_sigpending, [53] = sys_sigaltstack, [54] = sys_ioctl, [55] = sys_reboot,