diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index f6e74782db..e3d6f21870 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -227,6 +227,11 @@ int Process::sys$gethostname(char* buffer, size_t size) Process* Process::fork(RegisterDump& regs) { auto* child = new Process(String(m_name), m_uid, m_gid, m_pid, m_ring, m_cwd.copyRef(), m_executable.copyRef(), m_tty, this); + if (!child) + return nullptr; + + memcpy(child->m_signal_action_data, m_signal_action_data, sizeof(m_signal_action_data)); + child->m_signal_mask = m_signal_mask; #ifdef FORK_DEBUG dbgprintf("fork: child=%p\n", child); #endif @@ -365,6 +370,9 @@ int Process::do_exec(const String& path, Vector&& arguments, Vectorsys$sigreturn(); ASSERT_NOT_REACHED(); return 0; + case Syscall::SC_sigprocmask: + return current->sys$sigprocmask((int)arg1, (const Unix::sigset_t*)arg2, (Unix::sigset_t*)arg3); default: kprintf("<%u> int0x80: Unknown function %x requested {%x, %x, %x}\n", current->pid(), function, arg1, arg2, arg3); break; diff --git a/Kernel/Syscall.h b/Kernel/Syscall.h index 81fe796732..3cd39912aa 100644 --- a/Kernel/Syscall.h +++ b/Kernel/Syscall.h @@ -54,6 +54,8 @@ __ENUMERATE_SYSCALL(getgroups) \ __ENUMERATE_SYSCALL(setgroups) \ __ENUMERATE_SYSCALL(sigreturn) \ + __ENUMERATE_SYSCALL(sigprocmask) \ + __ENUMERATE_SYSCALL(sigpending) \ #define DO_SYSCALL_A0(function) Syscall::invoke((dword)(function)) diff --git a/LibC/signal.cpp b/LibC/signal.cpp index b348128308..32a08e32dc 100644 --- a/LibC/signal.cpp +++ b/LibC/signal.cpp @@ -71,6 +71,18 @@ int sigismember(const sigset_t* set, int sig) return 0; } +int sigprocmask(int how, const sigset_t* set, sigset_t* old_set) +{ + int rc = Syscall::invoke(Syscall::SC_sigprocmask, (dword)how, (dword)set, (dword)old_set); + __RETURN_WITH_ERRNO(rc, rc, -1); +} + +int sigpending(sigset_t* set) +{ + int rc = Syscall::invoke(Syscall::SC_sigpending, (dword)set); + __RETURN_WITH_ERRNO(rc, rc, -1); +} + const char* sys_siglist[NSIG] = { #undef __SIGNAL #define __SIGNAL(a, b) b, @@ -78,5 +90,4 @@ const char* sys_siglist[NSIG] = { #undef __SIGNAL }; - } diff --git a/LibC/signal.h b/LibC/signal.h index 0cc5e5a142..99e3283446 100644 --- a/LibC/signal.h +++ b/LibC/signal.h @@ -29,6 +29,8 @@ int sigfillset(sigset_t*); int sigaddset(sigset_t*, int sig); int sigdelset(sigset_t*, int sig); int sigismember(const sigset_t*, int sig); +int sigprocmask(int how, const sigset_t* set, sigset_t* old_set); +int sigpending(sigset_t*); #define NSIG 32 extern const char* sys_siglist[NSIG]; diff --git a/LibC/sys/cdefs.h b/LibC/sys/cdefs.h index 4c5f129ff8..05dc28aa56 100644 --- a/LibC/sys/cdefs.h +++ b/LibC/sys/cdefs.h @@ -17,5 +17,7 @@ #undef __P #define __P(a) a +#ifdef __cplusplus extern "C" int main(int, char**); +#endif