summaryrefslogtreecommitdiff
path: root/src/signal
diff options
context:
space:
mode:
Diffstat (limited to 'src/signal')
-rw-r--r--src/signal/sigaction.c15
-rw-r--r--src/signal/signal.c6
2 files changed, 13 insertions, 8 deletions
diff --git a/src/signal/sigaction.c b/src/signal/sigaction.c
index 1e9db8cb..d4721538 100644
--- a/src/signal/sigaction.c
+++ b/src/signal/sigaction.c
@@ -1,4 +1,3 @@
-
#include <stddef.h>
#include <signal.h>
#include "_syscall.h"
@@ -29,11 +28,17 @@ int sigaction(int sig, const struct sigaction * restrict act, struct sigaction *
}
#endif
- a.flags = act->sa_flags;
+ /* SA_RESTORER seems to be required for sigaction to *actually* work on Linux */
+ a.flags = act->sa_flags | SA_RESTORER;
a.mask = act->sa_mask;
- ret = __syscall(scno, sig, &a, &o, sizeof(act->sa_mask), 0, 0);
- if (ret != -1 && oact != NULL) {
+ ret = __syscall(scno, sig, &a, oact ? &o : NULL, /* 8 */ sizeof(act->sa_mask), 0, 0);
+ if (ret < 0) {
+ errno = -ret;
+ return -1;
+ }
+
+ if (oact != NULL) {
oact->sa_handler = o.fn.handler;
#ifdef SA_SIGINFO
if (o.flags & SA_SIGINFO) {
@@ -45,7 +50,7 @@ int sigaction(int sig, const struct sigaction * restrict act, struct sigaction *
oact->sa_mask = o.mask;
}
- return ret;
+ return 0;
}
/*
diff --git a/src/signal/signal.c b/src/signal/signal.c
index f55e2e57..923fdb6d 100644
--- a/src/signal/signal.c
+++ b/src/signal/signal.c
@@ -5,7 +5,7 @@
/** set a signal handler **/
-#if 0
+#if 1
#include "_forced/sigaction.h"
#else
@@ -36,11 +36,11 @@ void (*signal(int sig, void (*func)(int)))(int)
void (*prev)(int) = ___signal.handlers[sig];
___signal.handlers[sig] = func;
- struct linux_sigaction act = { 0 };
+ struct sigaction act = { 0 };
act.sa_handler = __signal_handler;
act.sa_flags = SA_RESTART | SA_RESTORER;
- int ret = sigaction(sig, &act, NULL, 8);
+ int ret = sigaction(sig, &act, NULL);
if (ret != 0) {
errno = -ret;
return SIG_ERR;