1865695bbc89088b9526ea9045410e5afb70a985cplars/*
2865695bbc89088b9526ea9045410e5afb70a985cplars *
3865695bbc89088b9526ea9045410e5afb70a985cplars *   Copyright (c) International Business Machines  Corp., 2001
4865695bbc89088b9526ea9045410e5afb70a985cplars *
5865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is free software;  you can redistribute it and/or modify
6865695bbc89088b9526ea9045410e5afb70a985cplars *   it under the terms of the GNU General Public License as published by
7865695bbc89088b9526ea9045410e5afb70a985cplars *   the Free Software Foundation; either version 2 of the License, or
8865695bbc89088b9526ea9045410e5afb70a985cplars *   (at your option) any later version.
9865695bbc89088b9526ea9045410e5afb70a985cplars *
10865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is distributed in the hope that it will be useful,
11865695bbc89088b9526ea9045410e5afb70a985cplars *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12865695bbc89088b9526ea9045410e5afb70a985cplars *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13865695bbc89088b9526ea9045410e5afb70a985cplars *   the GNU General Public License for more details.
14865695bbc89088b9526ea9045410e5afb70a985cplars *
15865695bbc89088b9526ea9045410e5afb70a985cplars *   You should have received a copy of the GNU General Public License
16865695bbc89088b9526ea9045410e5afb70a985cplars *   along with this program;  if not, write to the Free Software
174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18865695bbc89088b9526ea9045410e5afb70a985cplars */
19865695bbc89088b9526ea9045410e5afb70a985cplars
20865695bbc89088b9526ea9045410e5afb70a985cplars/*
21865695bbc89088b9526ea9045410e5afb70a985cplars * NAME
22865695bbc89088b9526ea9045410e5afb70a985cplars *	kill06.c
23865695bbc89088b9526ea9045410e5afb70a985cplars *
24865695bbc89088b9526ea9045410e5afb70a985cplars * DESCRIPTION
25865695bbc89088b9526ea9045410e5afb70a985cplars *	Test case to check the basic functionality of kill() when killing an
26865695bbc89088b9526ea9045410e5afb70a985cplars *	entire process group with a negative pid.
27865695bbc89088b9526ea9045410e5afb70a985cplars *
28865695bbc89088b9526ea9045410e5afb70a985cplars * ALGORITHM
29865695bbc89088b9526ea9045410e5afb70a985cplars *	call setup
30865695bbc89088b9526ea9045410e5afb70a985cplars *	loop if the -i option was given
31865695bbc89088b9526ea9045410e5afb70a985cplars *	fork 5 children
32865695bbc89088b9526ea9045410e5afb70a985cplars *	execute the kill system call
33865695bbc89088b9526ea9045410e5afb70a985cplars *	check the return value
34865695bbc89088b9526ea9045410e5afb70a985cplars *	if return value is -1
35865695bbc89088b9526ea9045410e5afb70a985cplars *		issue a FAIL message, break remaining tests and cleanup
36865695bbc89088b9526ea9045410e5afb70a985cplars *	if we are doing functional testing
37865695bbc89088b9526ea9045410e5afb70a985cplars *		if the processes were terminated with the expected signal.
38865695bbc89088b9526ea9045410e5afb70a985cplars *			issue a PASS message
39865695bbc89088b9526ea9045410e5afb70a985cplars *		otherwise
40865695bbc89088b9526ea9045410e5afb70a985cplars *			issue a FAIL message
41865695bbc89088b9526ea9045410e5afb70a985cplars *	call cleanup
42865695bbc89088b9526ea9045410e5afb70a985cplars *
43865695bbc89088b9526ea9045410e5afb70a985cplars * USAGE
44865695bbc89088b9526ea9045410e5afb70a985cplars *  kill06 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
45865695bbc89088b9526ea9045410e5afb70a985cplars *     where,  -c n : Run n copies concurrently.
46865695bbc89088b9526ea9045410e5afb70a985cplars *             -f   : Turn off functionality Testing.
47865695bbc89088b9526ea9045410e5afb70a985cplars *             -i n : Execute test n times.
48865695bbc89088b9526ea9045410e5afb70a985cplars *             -I x : Execute test for x seconds.
49865695bbc89088b9526ea9045410e5afb70a985cplars *             -P x : Pause for x seconds between iterations.
50865695bbc89088b9526ea9045410e5afb70a985cplars *             -t   : Turn on syscall timing.
51865695bbc89088b9526ea9045410e5afb70a985cplars *
52865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY
53865695bbc89088b9526ea9045410e5afb70a985cplars *	07/2001 Ported by Wayne Boyer
54865695bbc89088b9526ea9045410e5afb70a985cplars *
55865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS
56865695bbc89088b9526ea9045410e5afb70a985cplars *	This test should be run as a non-root user.
57865695bbc89088b9526ea9045410e5afb70a985cplars */
58865695bbc89088b9526ea9045410e5afb70a985cplars
59865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h"
60865695bbc89088b9526ea9045410e5afb70a985cplars
61865695bbc89088b9526ea9045410e5afb70a985cplars#include <signal.h>
62865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h>
63865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/wait.h>
64865695bbc89088b9526ea9045410e5afb70a985cplars
65865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup(void);
66865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup(void);
67d34d581c6a320e356a6cda923c7aa399479e812crobbiewvoid do_child(void);
68865695bbc89088b9526ea9045410e5afb70a985cplars
6956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *TCID = "kill06";
70865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1;
71865695bbc89088b9526ea9045410e5afb70a985cplars
72865695bbc89088b9526ea9045410e5afb70a985cplars#define TEST_SIG SIGKILL
73865695bbc89088b9526ea9045410e5afb70a985cplars
74b8360ee9a4b3e0ae1707116f48bfdbcee9ba2dberobbiewint main(int ac, char **av)
75865695bbc89088b9526ea9045410e5afb70a985cplars{
7689af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis	int lc;
77865695bbc89088b9526ea9045410e5afb70a985cplars	pid_t pid1, pid2;
78865695bbc89088b9526ea9045410e5afb70a985cplars	int exno, status, nsig, i;
79865695bbc89088b9526ea9045410e5afb70a985cplars
80d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(ac, av, NULL, NULL);
81d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
82d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&do_child, "");
83d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
84d34d581c6a320e356a6cda923c7aa399479e812crobbiew
8556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	setup();		/* global setup */
86865695bbc89088b9526ea9045410e5afb70a985cplars
87865695bbc89088b9526ea9045410e5afb70a985cplars	/* The following loop checks looping state if -i option given */
88865695bbc89088b9526ea9045410e5afb70a985cplars	for (lc = 0; TEST_LOOPING(lc); lc++) {
89865695bbc89088b9526ea9045410e5afb70a985cplars
90d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		/* reset tst_count in case we are looping */
91d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
92865695bbc89088b9526ea9045410e5afb70a985cplars		status = 1;
93865695bbc89088b9526ea9045410e5afb70a985cplars		exno = 1;
94865695bbc89088b9526ea9045410e5afb70a985cplars
95865695bbc89088b9526ea9045410e5afb70a985cplars		/* Fork a process and set the process group so that */
96865695bbc89088b9526ea9045410e5afb70a985cplars		/* it is different from this one.  Fork 5 more children. */
97865695bbc89088b9526ea9045410e5afb70a985cplars
98d34d581c6a320e356a6cda923c7aa399479e812crobbiew		pid1 = FORK_OR_VFORK();
99865695bbc89088b9526ea9045410e5afb70a985cplars		if (pid1 < 0) {
100865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TBROK, cleanup, "Fork of first child failed");
101865695bbc89088b9526ea9045410e5afb70a985cplars		} else if (pid1 == 0) {
102865695bbc89088b9526ea9045410e5afb70a985cplars			setpgrp();
103865695bbc89088b9526ea9045410e5afb70a985cplars			for (i = 0; i < 5; i++) {
104d34d581c6a320e356a6cda923c7aa399479e812crobbiew				pid2 = FORK_OR_VFORK();
105865695bbc89088b9526ea9045410e5afb70a985cplars				if (pid2 < 0) {
106865695bbc89088b9526ea9045410e5afb70a985cplars					tst_brkm(TBROK, cleanup, "Fork failed");
107865695bbc89088b9526ea9045410e5afb70a985cplars				} else if (pid2 == 0) {
108d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
109d34d581c6a320e356a6cda923c7aa399479e812crobbiew					if (self_exec(av[0], "") < 0) {
110d34d581c6a320e356a6cda923c7aa399479e812crobbiew						tst_brkm(TBROK, cleanup,
111d34d581c6a320e356a6cda923c7aa399479e812crobbiew							 "self_exec of "
112d34d581c6a320e356a6cda923c7aa399479e812crobbiew							 "child failed");
113d34d581c6a320e356a6cda923c7aa399479e812crobbiew					}
114d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
115d34d581c6a320e356a6cda923c7aa399479e812crobbiew					do_child();
116d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
117865695bbc89088b9526ea9045410e5afb70a985cplars				}
118865695bbc89088b9526ea9045410e5afb70a985cplars			}
119865695bbc89088b9526ea9045410e5afb70a985cplars			/* Kill all processes in this process group */
1201f3a6977465e71fe3e135b931e467c05038d4d96subrata_modak			TEST(kill(-getpgrp(), TEST_SIG));
121865695bbc89088b9526ea9045410e5afb70a985cplars			sleep(300);
1222c28215423293e443469a07ae7011135d058b671Garrett Cooper
123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			tst_resm(TINFO, "%d never recieved a"
124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				 " signal", getpid());
125865695bbc89088b9526ea9045410e5afb70a985cplars			exit(exno);
126865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
127865695bbc89088b9526ea9045410e5afb70a985cplars			waitpid(pid1, &status, 0);
128865695bbc89088b9526ea9045410e5afb70a985cplars			if (TEST_RETURN != 0) {
129865695bbc89088b9526ea9045410e5afb70a985cplars				tst_brkm(TFAIL, cleanup, "%s failed - errno = "
13056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 "%d : %s", TCID, TEST_ERRNO,
13156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 strerror(TEST_ERRNO));
132865695bbc89088b9526ea9045410e5afb70a985cplars			}
133865695bbc89088b9526ea9045410e5afb70a985cplars		}
134865695bbc89088b9526ea9045410e5afb70a985cplars
135e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		/*
136e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		 * Check to see if the process was terminated with the
137e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		 * expected signal.
138e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		 */
139e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		nsig = WTERMSIG(status);
140e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		if (!nsig) {
141e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			tst_resm(TFAIL, "Did not receive any signal");
142e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		} else if (nsig == TEST_SIG) {
143e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			tst_resm(TPASS, "received expected signal %d",
144e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis				 nsig);
145e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		} else {
146e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			tst_resm(TFAIL,
147e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis				 "expected signal %d received %d",
148e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis				 TEST_SIG, nsig);
149865695bbc89088b9526ea9045410e5afb70a985cplars		}
150865695bbc89088b9526ea9045410e5afb70a985cplars	}
151865695bbc89088b9526ea9045410e5afb70a985cplars
152e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis	cleanup();
1537d0a4a57fbcd47f72b67c08df532e8ef47f6fdaeGarrett Cooper	tst_exit();
154865695bbc89088b9526ea9045410e5afb70a985cplars}
155865695bbc89088b9526ea9045410e5afb70a985cplars
156d34d581c6a320e356a6cda923c7aa399479e812crobbiew/*
157d34d581c6a320e356a6cda923c7aa399479e812crobbiew * do_child()
158d34d581c6a320e356a6cda923c7aa399479e812crobbiew */
159c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid do_child(void)
160d34d581c6a320e356a6cda923c7aa399479e812crobbiew{
161d34d581c6a320e356a6cda923c7aa399479e812crobbiew	int exno = 1;
162d34d581c6a320e356a6cda923c7aa399479e812crobbiew
163d34d581c6a320e356a6cda923c7aa399479e812crobbiew	sleep(299);
1642c28215423293e443469a07ae7011135d058b671Garrett Cooper
165354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	tst_resm(TINFO, "%d never recieved a" " signal", getpid());
166d34d581c6a320e356a6cda923c7aa399479e812crobbiew	exit(exno);
167d34d581c6a320e356a6cda923c7aa399479e812crobbiew}
168865695bbc89088b9526ea9045410e5afb70a985cplars
169865695bbc89088b9526ea9045410e5afb70a985cplars/*
170865695bbc89088b9526ea9045410e5afb70a985cplars * setup() - performs all ONE TIME setup for this test
171865695bbc89088b9526ea9045410e5afb70a985cplars */
17256207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup(void)
173865695bbc89088b9526ea9045410e5afb70a985cplars{
174865695bbc89088b9526ea9045410e5afb70a985cplars	/* Setup default signal handling */
175865695bbc89088b9526ea9045410e5afb70a985cplars	tst_sig(FORK, DEF_HANDLER, cleanup);
176865695bbc89088b9526ea9045410e5afb70a985cplars
177865695bbc89088b9526ea9045410e5afb70a985cplars	TEST_PAUSE;
178865695bbc89088b9526ea9045410e5afb70a985cplars}
179865695bbc89088b9526ea9045410e5afb70a985cplars
180865695bbc89088b9526ea9045410e5afb70a985cplars/*
181865695bbc89088b9526ea9045410e5afb70a985cplars * cleanup() - performs all the ONE TIME cleanup for this test at completion
182865695bbc89088b9526ea9045410e5afb70a985cplars * or premature exit.
183865695bbc89088b9526ea9045410e5afb70a985cplars */
18456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup(void)
185865695bbc89088b9526ea9045410e5afb70a985cplars{
186865695bbc89088b9526ea9045410e5afb70a985cplars
187ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
188