• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  *   Copyright (c) International Business Machines  Corp., 2001
4  *
5  *   This program is free software;  you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation; either version 2 of the License, or
8  *   (at your option) any later version.
9  *
10  *   This program is distributed in the hope that it will be useful,
11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13  *   the GNU General Public License for more details.
14  *
15  *   You should have received a copy of the GNU General Public License
16  *   along with this program;  if not, write to the Free Software
17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
20 /*
21  * NAME
22  *	signal04.c
23  *
24  * DESCRIPTION
25  *	signal04 - restore signals to default behavior
26  *
27  * ALGORITHM
28  *	loop if that option was specified
29  *	for each signal in siglist[]
30  *	  set the signal handler to our own and save the return value
31  *	  issue the signal system call to restore the default behavior
32  *	  check the return value
33  *	  if return value == -1
34  *	    issue a FAIL message, break remaining tests and cleanup
35  *	  if we are doing functional testing
36  *	    set the signal handler to our own again and save second return value
37  *	    if the first return value matches the second return value
38  *	      issue a PASS message
39  *	    else
40  *	      issue a FAIL message
41  *	call cleanup
42  *
43  * USAGE:  <for command-line>
44  *  signal04 [-c n] [-f] [-i n] [-I x] [-p x] [-t]
45  *	where,  -c n : Run n copies concurrently.
46  *		-f   : Turn off functionality Testing.
47  *		-i n : Execute test n times.
48  *		-I x : Execute test for x seconds.
49  *		-P x : Pause for x seconds between iterations.
50  *		-t   : Turn on syscall timing.
51  *
52  * History
53  *	07/2001 John George
54  *		-Ported
55  *
56  * Restrictions
57  *	none
58  */
59 
60 #include "test.h"
61 
62 #include <errno.h>
63 #include <signal.h>
64 
65 void cleanup(void);
66 void setup(void);
67 void sighandler(int);
68 
69 char *TCID = "signal04";
70 
71 int siglist[] = { SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGTRAP, SIGABRT,
72 	SIGBUS, SIGFPE, SIGUSR1, SIGSEGV, SIGUSR2, SIGPIPE, SIGALRM,
73 	SIGTERM, SIGCHLD, SIGCONT, SIGTSTP, SIGTTIN,
74 	SIGTTOU, SIGURG, SIGXCPU, SIGXFSZ, SIGVTALRM, SIGPROF,
75 	SIGWINCH, SIGIO, SIGPWR, SIGSYS
76 };
77 
78 int TST_TOTAL = sizeof(siglist) / sizeof(int);
79 
80 typedef void (*sighandler_t) (int);
81 
82 sighandler_t Tret;
83 
main(int ac,char ** av)84 int main(int ac, char **av)
85 {
86 	int lc;
87 	int i;
88 	sighandler_t rval, first;
89 
90 	tst_parse_opts(ac, av, NULL, NULL);
91 
92 	setup();		/* global setup */
93 
94 	/* The following loop checks looping state if -i option given */
95 
96 	for (lc = 0; TEST_LOOPING(lc); lc++) {
97 		/* reset tst_count in case we are looping */
98 		tst_count = 0;
99 
100 		/*
101 		 * loop through the list of signals and test each one
102 		 */
103 		for (i = 0; i < TST_TOTAL; i++) {
104 
105 			/* First reset the signal to the default
106 			   action to clear out any pre-test
107 			   execution settings */
108 			signal(siglist[i], SIG_DFL);
109 
110 			/* then set the handler to our own handler */
111 			if ((rval = signal(siglist[i], &sighandler)) == SIG_ERR) {
112 				tst_brkm(TBROK, cleanup, "initial signal call"
113 					 " failed");
114 			}
115 
116 			/* store the return value */
117 			first = rval;
118 
119 			/* restore the default signal action */
120 			errno = 0;
121 			Tret = signal(siglist[i], SIG_DFL);
122 			TEST_ERRNO = errno;
123 
124 			if (Tret == SIG_ERR) {
125 				tst_brkm(TFAIL, cleanup, "%s call failed - "
126 					 "errno = %d : %s", TCID, TEST_ERRNO,
127 					 strerror(TEST_ERRNO));
128 			}
129 
130 			/* now set the handler back to our own */
131 			if ((rval = signal(siglist[i], &sighandler))
132 			    == SIG_ERR) {
133 				tst_brkm(TBROK, cleanup, "initial "
134 					 "signal call failed");
135 			}
136 
137 			/*
138 			 * the first return value should equal the
139 			 * second one.
140 			 */
141 			if (rval == first) {
142 				tst_resm(TPASS, "%s call succeeded "
143 					 "received %p.", TCID, rval);
144 			} else {
145 				tst_brkm(TFAIL, cleanup, "return "
146 					 "values for signal(%d) don't "
147 					 "match. Got %p, expected %p.",
148 					 siglist[i], rval, first);
149 			}
150 		}
151 	}
152 
153 	cleanup();
154 	tst_exit();
155 
156 }
157 
158 /*
159  * sighandler() - handle the signals
160  */
sighandler(int sig LTP_ATTRIBUTE_UNUSED)161 void sighandler(int sig LTP_ATTRIBUTE_UNUSED)
162 {
163 }
164 
165 /*
166  * setup() - performs all the ONE TIME setup for this test.
167  */
setup(void)168 void setup(void)
169 {
170 
171 	TEST_PAUSE;
172 }
173 
174 /*
175  * cleanup() - performs all the ONE TIME cleanup for this test at completion
176  * 	       or premature exit.
177  */
cleanup(void)178 void cleanup(void)
179 {
180 
181 }
182