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 LTP_ATTRIBUTE_UNUSED)35 void handler(int signo LTP_ATTRIBUTE_UNUSED)
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