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 * setpgid02.c 23 * 24 * DESCRIPTION 25 * Testcase to check that setpgid() sets errno correctly. 26 * 27 * CALLS 28 * setpgid 29 * 30 * ALGORITHM 31 * Checks that setpgid returns the correct errno values in case of 32 * negative testing. 33 * test 1: EINVAL - Pass '-1' as the pgid parameter to setpgid 34 * test 2: ESRCH - Pass '-1' as the pid parameter to setpgid 35 * test 3: EPERM - Pass an invalid pgid parameter to setpgid 36 * 37 * USAGE: <for command-line> 38 * setpgid02 [-c n] [-e] [-i n] [-I x] [-P x] [-t] 39 * where, -c n : Run n copies concurrently. 40 * -e : Turn on errno logging. 41 * -i n : Execute test n times. 42 * -I x : Execute test for x seconds. 43 * -P x : Pause for x seconds between iterations. 44 * -t : Turn on syscall timing. 45 * 46 * HISTORY 47 * 07/2001 Ported by Wayne Boyer 48 * 49 * RESTRICTIONS 50 * None 51 */ 52 #include <errno.h> 53 #include <unistd.h> 54 #include <sys/wait.h> 55 #include "test.h" 56 57 static void setup(void); 58 static void cleanup(void); 59 60 char *TCID = "setpgid02"; 61 int TST_TOTAL = 3; 62 63 static pid_t pgid, pid; 64 static pid_t bad_pid = -1; 65 static pid_t zero_pid; 66 static pid_t unused_pid; 67 static pid_t inval_pid = 99999; 68 69 struct test_case_t { 70 pid_t *pid; 71 pid_t *pgid; 72 int error; 73 } TC[] = { 74 /* pgid is less than zero - EINVAL */ 75 { 76 &pid, &bad_pid, EINVAL}, 77 /* pid doesn't match any process - ESRCH */ 78 { 79 &unused_pid, &pgid, ESRCH}, 80 /* pgid doesn't exist - EPERM */ 81 { 82 &zero_pid, &inval_pid, EPERM} 83 }; 84 85 int main(int ac, char **av) 86 { 87 int lc; 88 int i; 89 90 tst_parse_opts(ac, av, NULL, NULL); 91 92 setup(); 93 94 for (lc = 0; TEST_LOOPING(lc); lc++) { 95 96 /* reset tst_count in case we are looping */ 97 tst_count = 0; 98 99 /* loop through the test cases */ 100 for (i = 0; i < TST_TOTAL; i++) { 101 102 TEST(setpgid(*TC[i].pid, *TC[i].pgid)); 103 104 if (TEST_RETURN != -1) { 105 tst_resm(TFAIL, "call succeeded unexpectedly"); 106 continue; 107 } 108 109 if (TEST_ERRNO == TC[i].error) { 110 tst_resm(TPASS, "expected failure - " 111 "errno = %d : %s", TEST_ERRNO, 112 strerror(TEST_ERRNO)); 113 } else { 114 tst_resm(TFAIL, "unexpected error - %d : %s - " 115 "expected %d", TEST_ERRNO, 116 strerror(TEST_ERRNO), TC[i].error); 117 } 118 } 119 } 120 cleanup(); 121 122 tst_exit(); 123 } 124 125 /* 126 * setup - performs all ONE TIME setup for this test 127 */ 128 static void setup(void) 129 { 130 131 tst_sig(NOFORK, DEF_HANDLER, cleanup); 132 133 TEST_PAUSE; 134 135 pgid = getpgrp(); 136 pid = getpid(); 137 138 unused_pid = tst_get_unused_pid(cleanup); 139 } 140 141 /* 142 * cleanup - Performs all ONE TIME cleanup for this test at completion or 143 * premature exit 144 */ 145 static void cleanup(void) 146 { 147 148 } 149