diff --git a/job.c b/job.c index e2f2273d..c35213a7 100644 --- a/job.c +++ b/job.c @@ -464,6 +464,62 @@ is_bourne_compatible_shell (const char *path) return 0; } +#ifdef POSIX +extern sigset_t fatal_signal_set; + +static void +block_sigs () +{ + sigprocmask (SIG_BLOCK, &fatal_signal_set, (sigset_t *) 0); +} + +static void +unblock_sigs () +{ + sigprocmask (SIG_UNBLOCK, &fatal_signal_set, (sigset_t *) 0); +} + +void +unblock_all_sigs () +{ + sigset_t empty; + sigemptyset (&empty); + sigprocmask (SIG_SETMASK, &empty, (sigset_t *) 0); +} + +#elif defined(HAVE_SIGSETMASK) + +extern int fatal_signal_mask; + +static void +block_sigs () +{ + sigblock (fatal_signal_mask); +} + +static void +unblock_sigs () +{ + sigsetmask (siggetmask (0) & ~fatal_signal_mask) +} + +void +unblock_all_sigs () +{ + sigsetmask (0); +} + +#else + +#define block_sigs() +#define unblock_sigs() + +void +unblock_all_sigs () +{ +} + +#endif /* Write an error message describing the exit status given in EXIT_CODE, EXIT_SIG, and COREDUMP, for the target TARGET_NAME. @@ -1037,32 +1093,6 @@ free_child (struct child *child) free (child); } -#ifdef POSIX -extern sigset_t fatal_signal_set; -#endif - -void -block_sigs (void) -{ -#ifdef POSIX - (void) sigprocmask (SIG_BLOCK, &fatal_signal_set, (sigset_t *) 0); -#else -# ifdef HAVE_SIGSETMASK - (void) sigblock (fatal_signal_mask); -# endif -#endif -} - -#ifdef POSIX -void -unblock_sigs (void) -{ - sigset_t empty; - sigemptyset (&empty); - sigprocmask (SIG_SETMASK, &empty, (sigset_t *) 0); -} -#endif - /* Start a job to run the commands specified in CHILD. CHILD is updated to reflect the commands and ID of the child process. @@ -2144,7 +2174,7 @@ child_execute_job (struct output *out, int good_stdin, char **argv, char **envp) return pid; /* We are the child. */ - unblock_sigs (); + unblock_all_sigs (); #ifdef SET_STACK_SIZE /* Reset limits, if necessary. */ diff --git a/job.h b/job.h index 9bea9a72..a8677bf3 100644 --- a/job.h +++ b/job.h @@ -73,18 +73,7 @@ int exec_command (char **argv, char **envp); void exec_command (char **argv, char **envp) __attribute__ ((noreturn)); #endif +void unblock_all_sigs (void); + extern unsigned int job_slots_used; - -void block_sigs (void); -#ifdef POSIX -void unblock_sigs (void); -#else -#ifdef HAVE_SIGSETMASK -extern int fatal_signal_mask; -#define unblock_sigs() sigsetmask (0) -#else -#define unblock_sigs() -#endif -#endif - extern unsigned int jobserver_tokens; diff --git a/main.c b/main.c index 939a1577..4079da22 100644 --- a/main.c +++ b/main.c @@ -582,12 +582,10 @@ struct output make_sync; /* Mask of signals that are being caught with fatal_error_signal. */ -#ifdef POSIX +#if defined(POSIX) sigset_t fatal_signal_set; -#else -# ifdef HAVE_SIGSETMASK +#elif defined(HAVE_SIGSETMASK) int fatal_signal_mask; -# endif #endif #if !HAVE_DECL_BSD_SIGNAL && !defined bsd_signal diff --git a/remote-cstms.c b/remote-cstms.c index 7c36b9dc..894b1794 100644 --- a/remote-cstms.c +++ b/remote-cstms.c @@ -246,7 +246,7 @@ start_remote_job (char **argv, char **envp, int stdin_fd, (void) dup2 (stdin_fd, 0); /* Unblock signals in the child. */ - unblock_sigs (); + unblock_all_sigs (); /* Run the command. */ exec_command (new_argv, envp);