OLD | NEW |
(Empty) | |
| 1 #include <signal.h> |
| 2 |
| 3 void (*sigset(int sig, void (*handler)(int)))(int) |
| 4 { |
| 5 struct sigaction sa, sa_old; |
| 6 sigset_t mask; |
| 7 |
| 8 sigemptyset(&mask); |
| 9 if (sigaddset(&mask, sig) < 0) |
| 10 return SIG_ERR; |
| 11 |
| 12 if (handler == SIG_HOLD) { |
| 13 if (sigaction(sig, 0, &sa_old) < 0) |
| 14 return SIG_ERR; |
| 15 if (sigprocmask(SIG_BLOCK, &mask, &mask) < 0) |
| 16 return SIG_ERR; |
| 17 } else { |
| 18 sa.sa_handler = handler; |
| 19 sa.sa_flags = 0; |
| 20 sigemptyset(&sa.sa_mask); |
| 21 if (sigaction(sig, &sa, &sa_old) < 0) |
| 22 return SIG_ERR; |
| 23 if (sigprocmask(SIG_UNBLOCK, &mask, &mask) < 0) |
| 24 return SIG_ERR; |
| 25 } |
| 26 return sigismember(&mask, sig) ? SIG_HOLD : sa_old.sa_handler; |
| 27 } |
OLD | NEW |