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 *	kill03.c
23 *
24 * DESCRIPTION
25 *	Test case to check that kill fails when given an invalid signal.
26 *
27 * ALGORITHM
28 *	call setup
29 *	loop if the -i option was given
30 *	fork a child
31 *	execute the kill system call with an invalid signal
32 *	check the return value
33 *	if return value is not -1
34 *		issue a FAIL message, break remaining tests and cleanup
35 *	if we are doing functional testing
36 *		if the errno was set to 22 (invalid argument).
37 *			issue a PASS message
38 *		otherwise
39 *			issue a FAIL message
40 *	call cleanup
41 *
42 * USAGE
43 *  kill03 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
44 *     where,  -c n : Run n copies concurrently.
45 *             -f   : Turn off functionality Testing.
46 *             -i n : Execute test n times.
47 *             -I x : Execute test for x seconds.
48 *             -P x : Pause for x seconds between iterations.
49 *             -t   : Turn on syscall timing.
50 *
51 * HISTORY
52 *	07/2001 Ported by Wayne Boyer
53 *
54 * RESTRICTIONS
55 *	none
56 */
57
58#include "test.h"
59
60#include <signal.h>
61#include <errno.h>
62#include <sys/wait.h>
63
64void cleanup(void);
65void setup(void);
66void do_child(void);
67
68char *TCID = "kill03";
69int TST_TOTAL = 1;
70
71#define TEST_SIG 2000
72
73int main(int ac, char **av)
74{
75	int lc;
76	pid_t pid;
77	int exno, status;
78
79	tst_parse_opts(ac, av, NULL, NULL);
80#ifdef UCLINUX
81	maybe_run_child(&do_child, "");
82#endif
83
84	setup();
85
86	/* The following loop checks looping state if -i option given */
87	for (lc = 0; TEST_LOOPING(lc); lc++) {
88
89		/* reset tst_count in case we are looping */
90		tst_count = 0;
91		status = 1;
92		exno = 1;
93		pid = FORK_OR_VFORK();
94		if (pid < 0) {
95			tst_brkm(TBROK, cleanup, "Fork of child failed");
96		} else if (pid == 0) {
97#ifdef UCLINUX
98			if (self_exec(av[0], "") < 0) {
99				tst_brkm(TBROK, cleanup,
100					 "self_exec of child failed");
101			}
102#else
103			do_child();
104#endif
105		} else {
106			TEST(kill(pid, TEST_SIG));
107			kill(pid, SIGKILL);
108			waitpid(pid, &status, 0);
109		}
110
111		if (TEST_RETURN != -1) {
112			tst_brkm(TFAIL, cleanup, "%s failed - errno = %d : %s "
113				 "Expected a return value of -1 got %ld",
114				 TCID, TEST_ERRNO, strerror(TEST_ERRNO),
115				 TEST_RETURN);
116		}
117
118		/*
119		 * Check to see if the errno was set to the expected
120		 * value of 22 : EINVAL.
121		 */
122		if (TEST_ERRNO == EINVAL) {
123			tst_resm(TPASS, "errno set to %d : %s, as "
124				 "expected", TEST_ERRNO,
125				 strerror(TEST_ERRNO));
126		} else {
127			tst_resm(TFAIL, "errno set to %d : %s expected "
128				 "%d : %s", TEST_ERRNO,
129				 strerror(TEST_ERRNO), 22,
130				 strerror(22));
131		}
132	}
133
134	cleanup();
135	tst_exit();
136}
137
138/*
139 * do_child()
140 */
141void do_child(void)
142{
143	int exno = 1;
144
145	pause();
146	exit(exno);
147}
148
149/*
150 * setup() - performs all ONE TIME setup for this test
151 */
152void setup(void)
153{
154
155	TEST_PAUSE;
156}
157
158/*
159 * cleanup() - performs all the ONE TIME cleanup for this test at completion
160 * or premature exit.
161 */
162void cleanup(void)
163{
164
165}
166