summaryrefslogtreecommitdiff
path: root/lib/sigprocmask.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2008-09-26 13:25:57 +0200
committerBruno Haible <bruno@clisp.org>2008-09-26 13:44:51 +0200
commitb5298eb7a71c5ae0a2320a99dd3965ef8df33648 (patch)
tree1701a50a98d9e437b514d1da5ddf17298091477c /lib/sigprocmask.c
parent1d569ca4e7e6147793e6e6510e5a36a4139b2f31 (diff)
downloadgnulib-b5298eb7a71c5ae0a2320a99dd3965ef8df33648.tar.gz
Support signal handling with SIGPIPE on native Windows platforms.
Diffstat (limited to 'lib/sigprocmask.c')
-rw-r--r--lib/sigprocmask.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/lib/sigprocmask.c b/lib/sigprocmask.c
index d6daca6ae2..7f73f951c1 100644
--- a/lib/sigprocmask.c
+++ b/lib/sigprocmask.c
@@ -45,6 +45,31 @@
typedef void (*handler_t) (int);
+/* Handling of gnulib defined signals. */
+
+#if GNULIB_defined_SIGPIPE
+static handler_t SIGPIPE_handler = SIG_DFL;
+#endif
+
+#if GNULIB_defined_SIGPIPE
+static handler_t
+ext_signal (int sig, handler_t handler)
+{
+ switch (sig)
+ {
+ case SIGPIPE:
+ {
+ handler_t old_handler = SIGPIPE_handler;
+ SIGPIPE_handler = handler;
+ return old_handler;
+ }
+ default: /* System defined signal */
+ return signal (sig, handler);
+ }
+}
+# define signal ext_signal
+#endif
+
int
sigismember (const sigset_t *set, int sig)
{
@@ -240,3 +265,29 @@ rpl_signal (int sig, handler_t handler)
return SIG_ERR;
}
}
+
+#if GNULIB_defined_SIGPIPE
+/* Raise the signal SIG. */
+int
+rpl_raise (int sig)
+# undef raise
+{
+ switch (sig)
+ {
+ case SIGPIPE:
+ if (blocked_set & (1U << sig))
+ pending_array[sig] = 1;
+ else
+ {
+ handler_t handler = SIGPIPE_handler;
+ if (handler == SIG_DFL)
+ exit (128 + SIGPIPE);
+ else if (handler != SIG_IGN)
+ (*handler) (sig);
+ }
+ return 0;
+ default: /* System defined signal */
+ return raise (sig);
+ }
+}
+#endif