diff options
author | Jakob Kaivo <jkk@ung.org> | 2020-08-13 19:46:28 -0400 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2020-08-13 19:46:28 -0400 |
commit | e9980aa8dd4a53f14a1b316f55afe1910a223265 (patch) | |
tree | 711cd65ce40bf671b279bc4b231daace2509bdd9 /src/signal/signal.c | |
parent | 8f9b1be9c22c4e8862ce74e4cc5a3be5639038e3 (diff) |
implement in terms of sigaction()
Diffstat (limited to 'src/signal/signal.c')
-rw-r--r-- | src/signal/signal.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/signal/signal.c b/src/signal/signal.c index eac3b650..5aed37c9 100644 --- a/src/signal/signal.c +++ b/src/signal/signal.c @@ -2,18 +2,40 @@ #include "sys/types.h" #endif +#include "stddef.h" #include <signal.h> +#ifndef _POSIX_SOURCE +#include "sigaction.c" +#include "sigemptyset.c" +#include "sigaddset.c" +#endif + +#undef SA_RESTART +#ifndef SA_RESTART +/* #include "SA_RESTART.c" */ +#define SA_RESTART 0x10000000 +#endif + /** set a signal handler **/ void (*signal(int sig, void (*func)(int)))(int) { - (void)sig; - /* TODO */ + struct sigaction sa = { 0 }, osa = { 0 }; + sa.sa_handler = func; + sigemptyset(&sa.sa_mask); + sigaddset(&sa.sa_mask, sig); + sa.sa_flags = SA_RESTART; + + if (sigaction(sig, &sa, &osa) != 0) { + return SIG_ERR; + } + /* RETURN_SUCCESS(a pointer to the signal handler); RETURN_FAILURE(CONSTANT(SIG_ERR), the request could not be honored); */ - return func; + + return osa.sa_handler; } /*** |