| 631 | |
| 632 | |
| 633 | static void |
| 634 | parse_block_signal_params (char const *arg, bool block) |
| 635 | { |
| 636 | if (! arg) |
| 637 | { |
| 638 | /* Without an argument, reset all signals. */ |
| 639 | sigfillset (block ? &block_signals : &unblock_signals); |
| 640 | sigemptyset (block ? &unblock_signals : &block_signals); |
| 641 | } |
| 642 | else if (! sig_mask_changed) |
| 643 | { |
| 644 | /* Initialize the sets. */ |
| 645 | sigemptyset (&block_signals); |
| 646 | sigemptyset (&unblock_signals); |
| 647 | } |
| 648 | |
| 649 | sig_mask_changed = true; |
| 650 | |
| 651 | if (! arg) |
| 652 | return; |
| 653 | |
| 654 | char *optarg_writable = xstrdup (arg); |
| 655 | |
| 656 | char *opt_sig = strtok (optarg_writable, ","); |
| 657 | while (opt_sig) |
| 658 | { |
| 659 | int signum = operand2sig (opt_sig); |
| 660 | /* operand2sig accepts signal 0 (EXIT) - but we reject it. */ |
| 661 | if (signum == 0) |
| 662 | error (0, 0, _("%s: invalid signal"), quote (opt_sig)); |
| 663 | if (signum <= 0) |
| 664 | usage (exit_failure); |
| 665 | |
| 666 | if (sigaddset (block ? &block_signals : &unblock_signals, signum) == -1) |
| 667 | { |
| 668 | if (block) |
| 669 | error (EXIT_CANCELED, errno, |
| 670 | _("failed to block signal %d"), signum); |
| 671 | /* else diagnosed in parse_signal_action_params(). */ |
| 672 | } |
| 673 | else |
| 674 | sigdelset (block ? &unblock_signals : &block_signals, signum); |
| 675 | |
| 676 | opt_sig = strtok (NULL, ","); |
| 677 | } |
| 678 | |
| 679 | free (optarg_writable); |
| 680 | } |
| 681 | |
| 682 | static void |
| 683 | set_signal_proc_mask (void) |
no test coverage detected