blob: e9e5899ecd157ad3a33470d4e31eb755069ae135 [file] [log] [blame]
plars865695b2001-08-27 22:15:12 +00001/*
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
Wanlong Gao4548c6c2012-10-19 18:03:36 +080017 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
plars865695b2001-08-27 22:15:12 +000018 */
19
20/*
21 * NAME
nstrazfa31d552002-05-14 16:50:06 +000022 * signal05.c
plars865695b2001-08-27 22:15:12 +000023 *
24 * DESCRIPTION
nstrazfa31d552002-05-14 16:50:06 +000025 * signal05 - set the signal handler to our own function
plars865695b2001-08-27 22:15:12 +000026 *
27 * ALGORITHM
28 * loop if that option was specified
29 * issue the system call
30 * check the return value
31 * if return value == -1
32 * issue a FAIL message, break remaining tests and cleanup
33 * if we are doing functional testing
34 * send the signal with kill()
35 * if we catch the signal in the signal handler
36 * issue a PASS message
37 * else
38 * issue a FAIL message
39 * call cleanup
40 *
41 * USAGE: <for command-line>
nstrazfa31d552002-05-14 16:50:06 +000042 * signal05 [-c n] [-f] [-i n] [-I x] [-p x] [-t]
plars865695b2001-08-27 22:15:12 +000043 * where, -c n : Run n copies concurrently.
44 * -f : Turn off functionality Testing.
45 * -i n : Execute test n times.
46 * -I x : Execute test for x seconds.
47 * -P x : Pause for x seconds between iterations.
48 * -t : Turn on syscall timing.
49 *
50 * History
51 * 07/2001 John George
52 * -Ported
53 *
54 * Restrictions
55 * none
56 */
57
58#include "test.h"
plars865695b2001-08-27 22:15:12 +000059
60#include <errno.h>
61#include <signal.h>
62
63void cleanup(void);
64void setup(void);
65void sighandler(int);
66
plars865695b2001-08-27 22:15:12 +000067int siglist[] = { SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGTRAP, SIGABRT, SIGIOT,
subrata_modak56207ce2009-03-23 13:35:39 +000068 SIGBUS, SIGFPE, SIGUSR1, SIGSEGV, SIGUSR2, SIGPIPE, SIGALRM,
69 SIGTERM,
plars067f3842002-05-28 14:45:38 +000070#ifdef SIGSTKFLT
subrata_modak56207ce2009-03-23 13:35:39 +000071 SIGSTKFLT,
plars067f3842002-05-28 14:45:38 +000072#endif
subrata_modak56207ce2009-03-23 13:35:39 +000073 SIGCHLD, SIGCONT, SIGTSTP, SIGTTIN,
74 SIGTTOU, SIGURG, SIGXCPU, SIGXFSZ, SIGVTALRM, SIGPROF,
75 SIGWINCH, SIGIO, SIGPWR, SIGSYS,
plars067f3842002-05-28 14:45:38 +000076#ifdef SIGUNUSED
subrata_modak56207ce2009-03-23 13:35:39 +000077 SIGUNUSED
plars067f3842002-05-28 14:45:38 +000078#endif
79};
Wanlong Gao354ebb42012-12-07 10:10:04 +080080
Cyril Hrubis63564ce2015-02-04 13:28:31 +010081char *TCID = "signal05";
82int TST_TOTAL = ARRAY_SIZE(siglist);
83
84typedef void (*sighandler_t) (int);
85
86sighandler_t Tret;
87
plars865695b2001-08-27 22:15:12 +000088int pass = 0;
89
plars74948ad2002-11-14 16:16:14 +000090int main(int ac, char **av)
plars865695b2001-08-27 22:15:12 +000091{
Cyril Hrubis89af32a2012-10-24 16:39:11 +020092 int lc;
Cyril Hrubis0b9589f2014-05-27 17:40:33 +020093 const char *msg;
plars865695b2001-08-27 22:15:12 +000094 pid_t pid;
95 int i, rval;
96
Garrett Cooper45e285d2010-11-22 12:19:25 -080097 if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) {
Garrett Cooper60fa8012010-11-22 13:50:58 -080098 tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
Wanlong Gao354ebb42012-12-07 10:10:04 +080099 }
plars865695b2001-08-27 22:15:12 +0000100
subrata_modak56207ce2009-03-23 13:35:39 +0000101 setup(); /* global setup */
plars865695b2001-08-27 22:15:12 +0000102
103 /* The following loop checks looping state if -i option given */
104
105 for (lc = 0; TEST_LOOPING(lc); lc++) {
Caspar Zhangd59a6592013-03-07 14:59:12 +0800106 /* reset tst_count in case we are looping */
107 tst_count = 0;
plars865695b2001-08-27 22:15:12 +0000108
109 /*
110 * loop through the list of signals and test each one
111 */
subrata_modak56207ce2009-03-23 13:35:39 +0000112 for (i = 0; i < TST_TOTAL; i++) {
plars865695b2001-08-27 22:15:12 +0000113
subrata_modak56207ce2009-03-23 13:35:39 +0000114 errno = 0;
115 Tret = signal(siglist[i], &sighandler);
116 TEST_ERRNO = errno;
plars865695b2001-08-27 22:15:12 +0000117
plars74948ad2002-11-14 16:16:14 +0000118 if (Tret == SIG_ERR) {
plars865695b2001-08-27 22:15:12 +0000119 tst_resm(TFAIL, "%s call failed - errno = %d "
120 ": %s", TCID, TEST_ERRNO,
121 strerror(TEST_ERRNO));
122 continue;
123 }
subrata_modakbdbaec52009-02-26 12:14:51 +0000124
Cyril Hrubise38b9612014-06-02 17:20:57 +0200125 /*
126 * Send the signals and make sure they are
127 * handled in our handler.
128 */
129 pid = getpid();
subrata_modakbdbaec52009-02-26 12:14:51 +0000130
Cyril Hrubise38b9612014-06-02 17:20:57 +0200131 if ((rval = kill(pid, siglist[i])) != 0) {
132 tst_brkm(TBROK, cleanup,
133 "call to kill failed");
134 }
plars865695b2001-08-27 22:15:12 +0000135
Cyril Hrubise38b9612014-06-02 17:20:57 +0200136 if (siglist[i] == pass) {
137 tst_resm(TPASS,
138 "%s call succeeded", TCID);
plars865695b2001-08-27 22:15:12 +0000139 } else {
Cyril Hrubise38b9612014-06-02 17:20:57 +0200140 tst_resm(TFAIL,
141 "received unexpected signal");
plars865695b2001-08-27 22:15:12 +0000142 }
143 }
144 }
145
146 cleanup();
Garrett Cooper7d0a4a52010-12-16 10:05:08 -0800147 tst_exit();
plars865695b2001-08-27 22:15:12 +0000148}
149
150/*
151 * sighandler() - handle the signals
152 */
subrata_modak56207ce2009-03-23 13:35:39 +0000153void sighandler(int sig)
plars865695b2001-08-27 22:15:12 +0000154{
155 /* set the global pass variable = sig */
156 pass = sig;
157}
158
159/*
160 * setup() - performs all the ONE TIME setup for this test.
161 */
subrata_modak56207ce2009-03-23 13:35:39 +0000162void setup(void)
plars865695b2001-08-27 22:15:12 +0000163{
plars865695b2001-08-27 22:15:12 +0000164 TEST_PAUSE;
165}
166
167/*
168 * cleanup() - performs all the ONE TIME cleanup for this test at completion
169 * or premature exit.
170 */
subrata_modak56207ce2009-03-23 13:35:39 +0000171void cleanup(void)
plars865695b2001-08-27 22:15:12 +0000172{
plars865695b2001-08-27 22:15:12 +0000173
Chris Dearmanec6edca2012-10-17 19:54:01 -0700174}