diff options
author | Bruno Haible <bruno@clisp.org> | 2008-09-26 13:25:57 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2008-09-26 13:44:51 +0200 |
commit | b5298eb7a71c5ae0a2320a99dd3965ef8df33648 (patch) | |
tree | 1701a50a98d9e437b514d1da5ddf17298091477c /lib/sigprocmask.c | |
parent | 1d569ca4e7e6147793e6e6510e5a36a4139b2f31 (diff) | |
download | gnulib-b5298eb7a71c5ae0a2320a99dd3965ef8df33648.tar.gz |
Support signal handling with SIGPIPE on native Windows platforms.
Diffstat (limited to 'lib/sigprocmask.c')
-rw-r--r-- | lib/sigprocmask.c | 51 |
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 |