1 /*
2 * Copyright (c) 2002, Intel Corporation. All rights reserved.
3 * Created by: julie.n.fleischer REMOVE-THIS AT intel DOT com
4 * This file is licensed under the GPL license. For the full content
5 * of this license, see the COPYING file at the top level of this
6 * source tree.
7
8 * Test that the sigpending() function stores the set of signals that
9 * are blocked from delivery to a signal handler function. Steps are:
10 * 1) Block three signals from delivery to a signal handler.
11 * 2) Raise the signal to get into that signal handler.
12 * From the signal handler:
13 * 3) Raise two of the blocked signals.
14 * 4) Verify that the two signals raised are shown via sigpending.
15 * 5) Verify the one signal not raised is not shown.
16 */
17
18 /*
19 * Copyright (c) 2002, Intel Corporation. All rights reserved.
20 * Created by: julie.n.fleischer REMOVE-THIS AT intel DOT com
21 * This file is licensed under the GPL license. For the full content
22 * of this license, see the COPYING file at the top level of this
23 * source tree.
24
25 * The handler raises the two blocked signals and verifies they are
26 * shown via sigpending().
27 * It uses exit() to leave so that the signals are not executed.
28 */
29
30 #include <signal.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include "posixtest.h"
34
handler(int signo)35 void handler(int signo)
36 {
37 sigset_t pendingset;
38
39 if (sigemptyset(&pendingset) == -1) {
40 printf("Could not call sigemptyset()\n");
41 exit(-1);
42 }
43 if (raise(SIGCONT) != 0) {
44 printf("Could not raise SIGCONT\n");
45 exit(-1);
46 }
47 if (raise(SIGUSR1) != 0) {
48 printf("Could not raise SIGUSR1\n");
49 exit(-1);
50 }
51
52 if (sigpending(&pendingset) == -1) {
53 printf("Error calling sigpending()\n");
54 exit(-1);
55 }
56
57 if (sigismember(&pendingset, SIGCONT) == 1) {
58 if (sigismember(&pendingset, SIGUSR1) == 1) {
59 printf("All pending signals found\n");
60 if (sigismember(&pendingset, SIGHUP) == 0) {
61 printf("Unsent signals not found.\n");
62 printf("Test PASSED\n");
63 exit(0);
64 } else {
65 printf("Error with unsent signals\n");
66 printf("Test FAILED\n");
67 exit(-1);
68 }
69 } else {
70 printf("Not all pending signals found\n");
71 exit(-1);
72 }
73 } else {
74 printf("Not all pending signals found\n");
75 exit(-1);
76 }
77 }
78
main(void)79 int main(void)
80 {
81 struct sigaction act;
82
83 act.sa_handler = handler;
84 act.sa_flags = 0;
85
86 if (sigemptyset(&act.sa_mask) == -1) {
87 printf("Could not call sigemptyset()\n");
88 return PTS_UNRESOLVED;
89 }
90
91 if ((sigaddset(&act.sa_mask, SIGCONT) == -1) ||
92 (sigaddset(&act.sa_mask, SIGHUP) == -1) ||
93 (sigaddset(&act.sa_mask, SIGUSR1) == -1)) {
94 perror("Error calling sigaddset()\n");
95 return PTS_UNRESOLVED;
96 }
97
98 if (sigaction(SIGTTOU, &act, 0) == -1) {
99 perror("Could not call sigaction()");
100 return PTS_UNRESOLVED;
101 }
102
103 if (raise(SIGTTOU) == -1) {
104 perror("Could not raise SIGTTOU");
105 return PTS_UNRESOLVED;
106 }
107 printf("This code should not be reachable\n");
108 return PTS_UNRESOLVED;
109 }
110