From c41846b9b95645357be10bf30b89791e4319bf16 Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Thu, 13 Aug 2020 19:46:45 -0400 Subject: implement as syscall with Linux translation --- src/signal/sigaction.c | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/signal/sigaction.c b/src/signal/sigaction.c index addde011..c9fddd21 100644 --- a/src/signal/sigaction.c +++ b/src/signal/sigaction.c @@ -1,10 +1,47 @@ +#include "stddef.h" #include "sys/types.h" #include +#include "_syscall.h" int sigaction(int sig, const struct sigaction * restrict act, struct sigaction * restrict oact) { - (void)sig; (void)act; (void)oact; - return 0; + struct linux_action { + union { + void (*handler)(int); + void (*action)(int, struct sigaction *, void *); + } fn; + unsigned long flags; + void (*restorer)(void); + sigset_t mask; + }; + + SYSCALL_NUMBER(scno, sigaction, -1); + struct linux_action a = { 0 }, o = { 0 }; + int ret = -1; + + a.fn.handler = act->sa_handler; + #ifdef SA_SIGINFO + if (act->sa_flags & SA_SIGINFO) { + a.fn.action = act->sa_sigaction; + #endif + + a.flags = act->sa_flags; + a.mask = act->sa_mask; + + ret = __syscall(scno, sig, &a, &o, sizeof(act->sa_mask), 0, 0); + if (ret != -1 && oact != NULL) { + oact->sa_handler = o.fn.handler; + #ifdef SA_SIGINFO + if (o.flags & SA_SIGINFO) { + oact->sa_sigaction = o.fn.action; + } + #endif + + oact->sa_flags = o.flags; + oact->sa_mask = o.mask; + } + + return ret; } /* -- cgit v1.2.1