diff options
| author | Jakob Kaivo <jkk@ung.org> | 2024-05-29 16:07:14 -0400 |
|---|---|---|
| committer | Jakob Kaivo <jkk@ung.org> | 2024-05-29 16:07:14 -0400 |
| commit | 824f22a3684209b1e11c87f20e6ff17beb8e73a3 (patch) | |
| tree | 591521c80a1cc771da5dc37d5bdfee5b89a3bb73 /src/signal | |
| parent | c9ec058657f9f8b3fd39a16f1a9e993b4a1e982e (diff) | |
finish integrating jkmalloc and read-only variable support
Diffstat (limited to 'src/signal')
| -rw-r--r-- | src/signal/sigaction.c | 15 | ||||
| -rw-r--r-- | src/signal/signal.c | 6 |
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; |
