kill01.c revision 56207cec7732e09c216c751c0b5f88a242bacae6
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
17865695bbc89088b9526ea9045410e5afb70a985cplars *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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#include "usctest.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 = "kill01";
70865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1;
71865695bbc89088b9526ea9045410e5afb70a985cplars
72865695bbc89088b9526ea9045410e5afb70a985cplarsextern int Tst_count;
73865695bbc89088b9526ea9045410e5afb70a985cplars
74865695bbc89088b9526ea9045410e5afb70a985cplars#define TEST_SIG SIGKILL
75865695bbc89088b9526ea9045410e5afb70a985cplars
76b8360ee9a4b3e0ae1707116f48bfdbcee9ba2dberobbiewint main(int ac, char **av)
77865695bbc89088b9526ea9045410e5afb70a985cplars{
7856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int lc;			/* loop counter */
7956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	char *msg;		/* message returned from parse_opts */
8056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	pid_t pid;
81865695bbc89088b9526ea9045410e5afb70a985cplars	int exno, status, nsig;
82865695bbc89088b9526ea9045410e5afb70a985cplars
83865695bbc89088b9526ea9045410e5afb70a985cplars	/* parse standard options */
8456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if ((msg = parse_opts(ac, av, (option_t *) NULL, NULL)) != (char *)NULL) {
85865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg);
86865695bbc89088b9526ea9045410e5afb70a985cplars	}
87d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
88d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&do_child, "");
89d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
90d34d581c6a320e356a6cda923c7aa399479e812crobbiew
9156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	setup();		/* global setup */
92865695bbc89088b9526ea9045410e5afb70a985cplars
93865695bbc89088b9526ea9045410e5afb70a985cplars	/* The following loop checks looping state if -i option given */
94865695bbc89088b9526ea9045410e5afb70a985cplars	for (lc = 0; TEST_LOOPING(lc); lc++) {
95865695bbc89088b9526ea9045410e5afb70a985cplars
96865695bbc89088b9526ea9045410e5afb70a985cplars		/* reset Tst_count in case we are looping */
97865695bbc89088b9526ea9045410e5afb70a985cplars		Tst_count = 0;
98865695bbc89088b9526ea9045410e5afb70a985cplars		status = 1;
99865695bbc89088b9526ea9045410e5afb70a985cplars		exno = 1;
100d34d581c6a320e356a6cda923c7aa399479e812crobbiew		pid = FORK_OR_VFORK();
101865695bbc89088b9526ea9045410e5afb70a985cplars		if (pid < 0) {
102865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TBROK, cleanup, "Fork of child failed");
103865695bbc89088b9526ea9045410e5afb70a985cplars		} else if (pid == 0) {
104d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
105d34d581c6a320e356a6cda923c7aa399479e812crobbiew			if (self_exec(av[0], "") < 0) {
10656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				tst_brkm(TBROK, cleanup,
10756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 "self_exec of child failed");
108d34d581c6a320e356a6cda923c7aa399479e812crobbiew			}
109d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
110d34d581c6a320e356a6cda923c7aa399479e812crobbiew			do_child();
111d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
112865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
113865695bbc89088b9526ea9045410e5afb70a985cplars			TEST(kill(pid, TEST_SIG));
114865695bbc89088b9526ea9045410e5afb70a985cplars			waitpid(pid, &status, 0);
115865695bbc89088b9526ea9045410e5afb70a985cplars		}
116865695bbc89088b9526ea9045410e5afb70a985cplars
117865695bbc89088b9526ea9045410e5afb70a985cplars		if (TEST_RETURN == -1) {
118865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TFAIL, cleanup, "%s failed - errno = %d : %s",
11956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				 TCID, TEST_ERRNO, strerror(TEST_ERRNO));
12056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		 /*NOTREACHED*/}
121865695bbc89088b9526ea9045410e5afb70a985cplars
122865695bbc89088b9526ea9045410e5afb70a985cplars		if (STD_FUNCTIONAL_TEST) {
123865695bbc89088b9526ea9045410e5afb70a985cplars			/*
124865695bbc89088b9526ea9045410e5afb70a985cplars			 * Check to see if the process was terminated with the
125865695bbc89088b9526ea9045410e5afb70a985cplars			 * expected signal.
126865695bbc89088b9526ea9045410e5afb70a985cplars			 */
127865695bbc89088b9526ea9045410e5afb70a985cplars			nsig = WTERMSIG(status);
128865695bbc89088b9526ea9045410e5afb70a985cplars			if (nsig == TEST_SIG) {
129865695bbc89088b9526ea9045410e5afb70a985cplars				tst_resm(TPASS, "received expected signal %d",
13056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 nsig);
131865695bbc89088b9526ea9045410e5afb70a985cplars			} else {
13256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak				tst_resm(TFAIL,
13356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 "expected signal %d received %d",
13456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak					 TEST_SIG, nsig);
135865695bbc89088b9526ea9045410e5afb70a985cplars			}
136865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
137865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TPASS, "call succeeded");
138865695bbc89088b9526ea9045410e5afb70a985cplars		}
139865695bbc89088b9526ea9045410e5afb70a985cplars	}
140865695bbc89088b9526ea9045410e5afb70a985cplars	cleanup();
141865695bbc89088b9526ea9045410e5afb70a985cplars
14256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	 /*NOTREACHED*/ return 0;
143865695bbc89088b9526ea9045410e5afb70a985cplars}
144865695bbc89088b9526ea9045410e5afb70a985cplars
145d34d581c6a320e356a6cda923c7aa399479e812crobbiew/*
146d34d581c6a320e356a6cda923c7aa399479e812crobbiew * do_child()
147d34d581c6a320e356a6cda923c7aa399479e812crobbiew */
14856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid do_child()
149d34d581c6a320e356a6cda923c7aa399479e812crobbiew{
150d34d581c6a320e356a6cda923c7aa399479e812crobbiew	int exno = 1;
151bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
152d34d581c6a320e356a6cda923c7aa399479e812crobbiew	pause();
15356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	 /*NOTREACHED*/ exit(exno);
154d34d581c6a320e356a6cda923c7aa399479e812crobbiew}
155865695bbc89088b9526ea9045410e5afb70a985cplars
156865695bbc89088b9526ea9045410e5afb70a985cplars/*
157865695bbc89088b9526ea9045410e5afb70a985cplars * setup() - performs all ONE TIME setup for this test
158865695bbc89088b9526ea9045410e5afb70a985cplars */
15956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup(void)
160865695bbc89088b9526ea9045410e5afb70a985cplars{
161865695bbc89088b9526ea9045410e5afb70a985cplars	/* Pause if that option was specified */
162865695bbc89088b9526ea9045410e5afb70a985cplars	TEST_PAUSE;
163865695bbc89088b9526ea9045410e5afb70a985cplars}
164865695bbc89088b9526ea9045410e5afb70a985cplars
165865695bbc89088b9526ea9045410e5afb70a985cplars/*
166865695bbc89088b9526ea9045410e5afb70a985cplars * cleanup() - performs all the ONE TIME cleanup for this test at completion
167865695bbc89088b9526ea9045410e5afb70a985cplars * or premature exit.
168865695bbc89088b9526ea9045410e5afb70a985cplars */
16956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup(void)
170865695bbc89088b9526ea9045410e5afb70a985cplars{
171865695bbc89088b9526ea9045410e5afb70a985cplars	/*
172865695bbc89088b9526ea9045410e5afb70a985cplars	 * print timing status if that option was specified.
173865695bbc89088b9526ea9045410e5afb70a985cplars	 * print errno log if that option was specified
174865695bbc89088b9526ea9045410e5afb70a985cplars	 */
175865695bbc89088b9526ea9045410e5afb70a985cplars	TEST_CLEANUP;
176865695bbc89088b9526ea9045410e5afb70a985cplars
177865695bbc89088b9526ea9045410e5afb70a985cplars	/* exit with return code appropriate for results */
178865695bbc89088b9526ea9045410e5afb70a985cplars	tst_exit();
179865695bbc89088b9526ea9045410e5afb70a985cplars}
180