Home | History | Annotate | Download | only in kill
      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 
     64 void cleanup(void);
     65 void setup(void);
     66 void do_child(void);
     67 
     68 char *TCID = "kill03";
     69 int TST_TOTAL = 1;
     70 
     71 #define TEST_SIG 2000
     72 
     73 int 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  */
    141 void 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  */
    152 void 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  */
    162 void cleanup(void)
    163 {
    164 
    165 }
    166