diff options
Diffstat (limited to 'gnulib/lib/sigprocmask.c')
-rw-r--r-- | gnulib/lib/sigprocmask.c | 56 |
1 files changed, 38 insertions, 18 deletions
diff --git a/gnulib/lib/sigprocmask.c b/gnulib/lib/sigprocmask.c index 6780a37b..d6961893 100644 --- a/gnulib/lib/sigprocmask.c +++ b/gnulib/lib/sigprocmask.c @@ -24,6 +24,10 @@ #include <stdint.h> #include <stdlib.h> +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +# include "msvc-inval.h" +#endif + /* We assume that a platform without POSIX signal blocking functions also does not have the POSIX sigaction() function, only the signal() function. We also assume signal() has SysV semantics, @@ -58,6 +62,28 @@ typedef void (*handler_t) (int); +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static inline handler_t +signal_nothrow (int sig, handler_t handler) +{ + handler_t result; + + TRY_MSVC_INVAL + { + result = signal (sig, handler); + } + CATCH_MSVC_INVAL + { + result = SIG_ERR; + errno = EINVAL; + } + DONE_MSVC_INVAL; + + return result; +} +# define signal signal_nothrow +#endif + /* Handling of gnulib defined signals. */ #if GNULIB_defined_SIGPIPE @@ -80,6 +106,7 @@ ext_signal (int sig, handler_t handler) return signal (sig, handler); } } +# undef signal # define signal ext_signal #endif @@ -303,27 +330,20 @@ rpl_signal (int sig, handler_t handler) } #if GNULIB_defined_SIGPIPE -/* Raise the signal SIG. */ +/* Raise the signal SIGPIPE. */ int -rpl_raise (int sig) -# undef raise +_gl_raise_SIGPIPE (void) { - switch (sig) + if (blocked_set & (1U << SIGPIPE)) + pending_array[SIGPIPE] = 1; + else { - 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); + handler_t handler = SIGPIPE_handler; + if (handler == SIG_DFL) + exit (128 + SIGPIPE); + else if (handler != SIG_IGN) + (*handler) (SIGPIPE); } + return 0; } #endif |