summaryrefslogtreecommitdiff
path: root/src/signal/signal.c
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2020-08-13 19:46:28 -0400
committerJakob Kaivo <jkk@ung.org>2020-08-13 19:46:28 -0400
commite9980aa8dd4a53f14a1b316f55afe1910a223265 (patch)
tree711cd65ce40bf671b279bc4b231daace2509bdd9 /src/signal/signal.c
parent8f9b1be9c22c4e8862ce74e4cc5a3be5639038e3 (diff)
implement in terms of sigaction()
Diffstat (limited to 'src/signal/signal.c')
-rw-r--r--src/signal/signal.c28
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;
}
/***