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