1 /* Test to check that the mask parameter of the sigresend syscall is handled
2 correctly. */
3
4 #include <assert.h>
5 #include <signal.h>
6 #include <stdio.h>
7 #include <string.h>
8 #include <sys/syscall.h>
9 #include <unistd.h>
10
signal_handler(int signo,siginfo_t * info,void * uc)11 static void signal_handler(int signo, siginfo_t *info, void *uc)
12 {
13 ssize_t written;
14 const char str[] = "Signal caught.\n";
15 size_t len = sizeof(str) - 1;
16 sigset_t current;
17
18 written = write(STDOUT_FILENO, str, len);
19 assert(written == len);
20
21 /* Check that SIGUSR1 is already blocked in the signal handler. */
22 assert(!sigprocmask(SIG_BLOCK, NULL, ¤t));
23 assert(sigismember(¤t, SIGUSR1));
24 }
25
main(void)26 int main(void)
27 {
28 sigset_t block, current;
29 struct sigaction sa;
30
31 /* Check that SIGUSR1 is unblocked. */
32 if (sigprocmask(0, NULL, ¤t)) {
33 perror("sigprocmask");
34 return 1;
35 }
36 assert(!sigismember(¤t, SIGUSR1));
37
38 /* Establish a SIGINT handler. */
39 sa.sa_sigaction = signal_handler;
40 sa.sa_flags = SA_RESTART | SA_SIGINFO;
41 if (sigfillset(&sa.sa_mask)) {
42 perror("sigfillset");
43 return 1;
44 }
45 if (sigaction(SIGINT, &sa, NULL)) {
46 perror("sigaction");
47 return 1;
48 }
49
50 /* Send us a signal to handle and install a new sigmask. */
51 if (sigemptyset(&block)) {
52 perror("sigemptyset");
53 return 1;
54 }
55 if (sigaddset(&block, SIGUSR1)) {
56 perror("sigaddset");
57 return 1;
58 }
59 if (syscall(SYS_sigresend, SIGINT, NULL, &block)) {
60 fprintf(stderr, "Sigresend failed.\n");
61 return 1;
62 }
63
64 /* Check that SIGUSR1 is now blocked. */
65 if (sigprocmask(SIG_BLOCK, NULL, ¤t)) {
66 perror("sigprocmask");
67 return 1;
68 }
69 assert(sigismember(¤t, SIGUSR1));
70
71 return 0;
72 }
73
74