summaryrefslogtreecommitdiff
path: root/libc/signal/bsd_sig.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/signal/bsd_sig.c')
-rw-r--r--libc/signal/bsd_sig.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/libc/signal/bsd_sig.c b/libc/signal/bsd_sig.c
new file mode 100644
index 000000000..509de87cb
--- /dev/null
+++ b/libc/signal/bsd_sig.c
@@ -0,0 +1,34 @@
+#define __USE_BSD_SIGNAL
+
+#include <signal.h>
+
+#undef signal
+
+/* The `sig' bit is set if the interrupt on it
+ * is enabled via siginterrupt (). */
+extern sigset_t _sigintr;
+
+__sighandler_t
+__bsd_signal (int sig, __sighandler_t handler)
+{
+ int ret;
+ struct sigaction action, oaction;
+ action.sa_handler = handler;
+ __sigemptyset (&action.sa_mask);
+ if (!__sigismember (&_sigintr, sig)) {
+#ifdef SA_RESTART
+ action.sa_flags = SA_RESTART;
+#else
+ action.sa_flags = 0;
+#endif
+ }
+ else {
+#ifdef SA_INTERRUPT
+ action.sa_flags = SA_INTERRUPT;
+#else
+ action.sa_flags = 0;
+#endif
+ }
+ ret = __sigaction (sig, &action, &oaction);
+ return (ret == -1) ? SIG_ERR : oaction.sa_handler;
+}