changes to kernel sigaction struct handling in preparation for mips port
[musl] / src / signal / sigset.c
1 #include <signal.h>
2 #include <stdlib.h>
3
4 void (*sigset(int sig, void (*handler)(int)))(int)
5 {
6         struct sigaction sa, sa_old;
7         sigset_t mask;
8
9         sigemptyset(&mask);
10         if (sigaddset(&mask, sig) < 0)
11                 return SIG_ERR;
12         
13         if (handler == SIG_HOLD) {
14                 if (sigaction(sig, NULL, &sa_old) < 0)
15                         return SIG_ERR;
16                 if (sigprocmask(SIG_BLOCK, &mask, &mask) < 0)
17                         return SIG_ERR;
18         } else {
19                 sa.sa_handler = handler;
20                 sa.sa_flags = 0;
21                 sigemptyset(&sa.sa_mask);
22                 if (sigaction(sig, &sa, &sa_old) < 0)
23                         return SIG_ERR;
24                 if (sigprocmask(SIG_UNBLOCK, &mask, &mask) < 0)
25                         return SIG_ERR;
26         }
27         return sigismember(&mask, sig) ? SIG_HOLD : sa_old.sa_handler;
28 }