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 *	kill01.c
23865695bbc89088b9526ea9045410e5afb70a985cplars *
24865695bbc89088b9526ea9045410e5afb70a985cplars * DESCRIPTION
25865695bbc89088b9526ea9045410e5afb70a985cplars *	Test case to check the basic functionality of kill().
26865695bbc89088b9526ea9045410e5afb70a985cplars *
27865695bbc89088b9526ea9045410e5afb70a985cplars * ALGORITHM
28865695bbc89088b9526ea9045410e5afb70a985cplars *	call setup
29865695bbc89088b9526ea9045410e5afb70a985cplars *	loop if the -i option was given
30865695bbc89088b9526ea9045410e5afb70a985cplars *	fork a child
31865695bbc89088b9526ea9045410e5afb70a985cplars *	execute the kill system call
32865695bbc89088b9526ea9045410e5afb70a985cplars *	check the return value
33865695bbc89088b9526ea9045410e5afb70a985cplars *	if return value is -1
34865695bbc89088b9526ea9045410e5afb70a985cplars *		issue a FAIL message, break remaining tests and cleanup
35865695bbc89088b9526ea9045410e5afb70a985cplars *	if we are doing functional testing
36865695bbc89088b9526ea9045410e5afb70a985cplars *		if the process was terminated with the expected signal.
37865695bbc89088b9526ea9045410e5afb70a985cplars *			issue a PASS message
38865695bbc89088b9526ea9045410e5afb70a985cplars *		otherwise
39865695bbc89088b9526ea9045410e5afb70a985cplars *			issue a FAIL message
40865695bbc89088b9526ea9045410e5afb70a985cplars *	call cleanup
41865695bbc89088b9526ea9045410e5afb70a985cplars *
42865695bbc89088b9526ea9045410e5afb70a985cplars * USAGE
43865695bbc89088b9526ea9045410e5afb70a985cplars *  kill01 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
44865695bbc89088b9526ea9045410e5afb70a985cplars *     where,  -c n : Run n copies concurrently.
45865695bbc89088b9526ea9045410e5afb70a985cplars *             -f   : Turn off functionality Testing.
46865695bbc89088b9526ea9045410e5afb70a985cplars *             -i n : Execute test n times.
47865695bbc89088b9526ea9045410e5afb70a985cplars *             -I x : Execute test for x seconds.
48865695bbc89088b9526ea9045410e5afb70a985cplars *             -P x : Pause for x seconds between iterations.
49865695bbc89088b9526ea9045410e5afb70a985cplars *             -t   : Turn on syscall timing.
50865695bbc89088b9526ea9045410e5afb70a985cplars *
51865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY
52865695bbc89088b9526ea9045410e5afb70a985cplars *	07/2001 Ported by Wayne Boyer
53865695bbc89088b9526ea9045410e5afb70a985cplars *
54865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS
55865695bbc89088b9526ea9045410e5afb70a985cplars *	This test should be ran as a non-root user.
56865695bbc89088b9526ea9045410e5afb70a985cplars */
57865695bbc89088b9526ea9045410e5afb70a985cplars
58865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h"
59865695bbc89088b9526ea9045410e5afb70a985cplars
60865695bbc89088b9526ea9045410e5afb70a985cplars#include <signal.h>
61865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h>
62865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/wait.h>
63865695bbc89088b9526ea9045410e5afb70a985cplars
64865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup(void);
65865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup(void);
66d34d581c6a320e356a6cda923c7aa399479e812crobbiewvoid do_child(void);
67865695bbc89088b9526ea9045410e5afb70a985cplars
6856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *TCID = "kill01";
69865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1;
70865695bbc89088b9526ea9045410e5afb70a985cplars
71865695bbc89088b9526ea9045410e5afb70a985cplars#define TEST_SIG SIGKILL
72865695bbc89088b9526ea9045410e5afb70a985cplars
73b8360ee9a4b3e0ae1707116f48bfdbcee9ba2dberobbiewint main(int ac, char **av)
74865695bbc89088b9526ea9045410e5afb70a985cplars{
7589af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis	int lc;
7656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	pid_t pid;
77865695bbc89088b9526ea9045410e5afb70a985cplars	int exno, status, nsig;
78865695bbc89088b9526ea9045410e5afb70a985cplars
79d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(ac, av, NULL, NULL);
80d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
81d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&do_child, "");
82d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
83d34d581c6a320e356a6cda923c7aa399479e812crobbiew
8456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	setup();		/* global setup */
85865695bbc89088b9526ea9045410e5afb70a985cplars
86865695bbc89088b9526ea9045410e5afb70a985cplars	/* The following loop checks looping state if -i option given */
87865695bbc89088b9526ea9045410e5afb70a985cplars	for (lc = 0; TEST_LOOPING(lc); lc++) {
88865695bbc89088b9526ea9045410e5afb70a985cplars
89d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		/* reset tst_count in case we are looping */
90d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
91865695bbc89088b9526ea9045410e5afb70a985cplars		status = 1;
92865695bbc89088b9526ea9045410e5afb70a985cplars		exno = 1;
93d34d581c6a320e356a6cda923c7aa399479e812crobbiew		pid = FORK_OR_VFORK();
94865695bbc89088b9526ea9045410e5afb70a985cplars		if (pid < 0) {
95865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TBROK, cleanup, "Fork of child failed");
96865695bbc89088b9526ea9045410e5afb70a985cplars		} else if (pid == 0) {
97d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
98d34d581c6a320e356a6cda923c7aa399479e812crobbiew			if (self_exec(av[0], "") < 0) {
9956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				tst_brkm(TBROK, cleanup,
10056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 "self_exec of child failed");
101d34d581c6a320e356a6cda923c7aa399479e812crobbiew			}
102d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
103d34d581c6a320e356a6cda923c7aa399479e812crobbiew			do_child();
104d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
105865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
106865695bbc89088b9526ea9045410e5afb70a985cplars			TEST(kill(pid, TEST_SIG));
107865695bbc89088b9526ea9045410e5afb70a985cplars			waitpid(pid, &status, 0);
108865695bbc89088b9526ea9045410e5afb70a985cplars		}
109865695bbc89088b9526ea9045410e5afb70a985cplars
110865695bbc89088b9526ea9045410e5afb70a985cplars		if (TEST_RETURN == -1) {
111865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "%s failed - errno = %d : %s",
11256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				 TCID, TEST_ERRNO, strerror(TEST_ERRNO));
113354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
114865695bbc89088b9526ea9045410e5afb70a985cplars
115e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		/*
116e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		 * Check to see if the process was terminated with the
117e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		 * expected signal.
118e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		 */
119e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		nsig = WTERMSIG(status);
120e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		if (nsig == TEST_SIG) {
121e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			tst_resm(TPASS, "received expected signal %d",
122e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis				 nsig);
123865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
124e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			tst_resm(TFAIL,
125e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis				 "expected signal %d received %d",
126e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis				 TEST_SIG, nsig);
127865695bbc89088b9526ea9045410e5afb70a985cplars		}
128865695bbc89088b9526ea9045410e5afb70a985cplars	}
129865695bbc89088b9526ea9045410e5afb70a985cplars
130e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis	cleanup();
1317d0a4a57fbcd47f72b67c08df532e8ef47f6fdaeGarrett Cooper	tst_exit();
132865695bbc89088b9526ea9045410e5afb70a985cplars}
133865695bbc89088b9526ea9045410e5afb70a985cplars
134d34d581c6a320e356a6cda923c7aa399479e812crobbiew/*
135d34d581c6a320e356a6cda923c7aa399479e812crobbiew * do_child()
136d34d581c6a320e356a6cda923c7aa399479e812crobbiew */
137c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid do_child(void)
138d34d581c6a320e356a6cda923c7aa399479e812crobbiew{
139d34d581c6a320e356a6cda923c7aa399479e812crobbiew	int exno = 1;
140bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
141d34d581c6a320e356a6cda923c7aa399479e812crobbiew	pause();
142354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	exit(exno);
143d34d581c6a320e356a6cda923c7aa399479e812crobbiew}
144865695bbc89088b9526ea9045410e5afb70a985cplars
145865695bbc89088b9526ea9045410e5afb70a985cplars/*
146865695bbc89088b9526ea9045410e5afb70a985cplars * setup() - performs all ONE TIME setup for this test
147865695bbc89088b9526ea9045410e5afb70a985cplars */
14856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup(void)
149865695bbc89088b9526ea9045410e5afb70a985cplars{
1502c28215423293e443469a07ae7011135d058b671Garrett Cooper
151865695bbc89088b9526ea9045410e5afb70a985cplars	TEST_PAUSE;
152865695bbc89088b9526ea9045410e5afb70a985cplars}
153865695bbc89088b9526ea9045410e5afb70a985cplars
154865695bbc89088b9526ea9045410e5afb70a985cplars/*
155865695bbc89088b9526ea9045410e5afb70a985cplars * cleanup() - performs all the ONE TIME cleanup for this test at completion
156865695bbc89088b9526ea9045410e5afb70a985cplars * or premature exit.
157865695bbc89088b9526ea9045410e5afb70a985cplars */
15856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup(void)
159865695bbc89088b9526ea9045410e5afb70a985cplars{
160865695bbc89088b9526ea9045410e5afb70a985cplars
161ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
162