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 * getpgid01.c 23 * 24 * DESCRIPTION 25 * Testcase to check the basic functionality of getpgid(). 26 * 27 * ALGORITHM 28 * block1: Does getpgid(0), and checks for error. 29 * block2: Does getpgid(getpid()) and checks for error. 30 * block3: Does getpgid(getppid()) and checks for error. 31 * block4: Verifies that getpgid(getpgid(0)) == getpgid(0). 32 * block5: Does getpgid(1) and checks for error. 33 * 34 * USAGE 35 * getpgid01 36 * 37 * HISTORY 38 * 07/2001 Ported by Wayne Boyer 39 * 40 * RESTRICTIONS 41 * Expects that there are no EPERM limitations on getting the 42 * process group ID from proc 1 (init). 43 */ 44 #define _GNU_SOURCE 1 45 46 #include <errno.h> 47 #include <unistd.h> 48 #include <stdarg.h> 49 #include <sys/wait.h> 50 #include <sys/types.h> 51 #include "test.h" 52 53 void setup(void); 54 void cleanup(void); 55 56 char *TCID = "getpgid01"; 57 int TST_TOTAL = 1; 58 59 int main(int ac, char **av) 60 { 61 int lc; 62 63 register int pgid_0, pgid_1; 64 register int my_pid, my_ppid; 65 int ex_stat, fail = 0; 66 67 tst_parse_opts(ac, av, NULL, NULL); 68 69 setup(); 70 71 for (lc = 0; TEST_LOOPING(lc); lc++) { 72 tst_count = 0; 73 74 if ((pgid_0 = FORK_OR_VFORK()) == -1) 75 tst_brkm(TBROK, cleanup, "fork failed"); 76 if (pgid_0 > 0) { 77 while ((pgid_0 = wait(&ex_stat)) != -1) ; 78 79 if (WEXITSTATUS(ex_stat) == 0) 80 tst_resm(TINFO, "%s PASSED", TCID); 81 else 82 tst_resm(TINFO, "%s FAILED", TCID); 83 84 exit(0); 85 } 86 87 tst_resm(TINFO, "Enter block 1"); 88 fail = 0; 89 if ((pgid_0 = getpgid(0)) == -1) { 90 tst_resm(TFAIL | TERRNO, "getpgid(0) failed"); 91 fail = 1; 92 } 93 94 if (fail) 95 tst_resm(TINFO, "Test block 1: getpgid(0) FAILED"); 96 else 97 tst_resm(TPASS, "Test block 1: getpgid(0) PASSED"); 98 tst_resm(TINFO, "Exit block 1"); 99 100 //block2: 101 tst_resm(TINFO, "Enter block 2"); 102 fail = 0; 103 104 my_pid = getpid(); 105 if ((pgid_1 = getpgid(my_pid)) == -1) 106 tst_resm(TFAIL | TERRNO, "getpgid(%d) failed", my_pid); 107 108 if (pgid_0 != pgid_1) { 109 tst_resm(TFAIL, "getpgid(my_pid=%d) != getpgid(0) " 110 "[%d != %d]", my_pid, pgid_1, pgid_0); 111 fail = 1; 112 } 113 if (fail) 114 tst_resm(TINFO, "Test block 2: getpgid(getpid()) " 115 "FAILED"); 116 else 117 tst_resm(TPASS, "Test block 2: getpgid(getpid()) " 118 "PASSED"); 119 tst_resm(TINFO, "Exit block 2"); 120 121 //block3: 122 tst_resm(TINFO, "Enter block 3"); 123 fail = 0; 124 125 my_ppid = getppid(); 126 if ((pgid_1 = getpgid(my_ppid)) == -1) 127 tst_resm(TFAIL | TERRNO, "getpgid(%d) failed", my_ppid); 128 129 if (pgid_0 != pgid_1) { 130 tst_resm(TFAIL, "getpgid(%d) != getpgid(0) [%d != %d]", 131 my_ppid, pgid_1, pgid_0); 132 fail = 1; 133 } 134 135 if (fail) { 136 tst_resm(TINFO, "Test block 3: getpgid(getppid()) " 137 "FAILED"); 138 } else { 139 tst_resm(TPASS, "Test block 3: getpgid(getppid()) " 140 "PASSED"); 141 } 142 tst_resm(TINFO, "Exit block 3"); 143 144 //block4: 145 tst_resm(TINFO, "Enter block 4"); 146 fail = 0; 147 148 if ((pgid_1 = getpgid(pgid_0)) < 0) 149 tst_resm(TFAIL | TERRNO, "getpgid(%d) failed", pgid_0); 150 151 if (pgid_0 != pgid_1) { 152 tst_resm(TFAIL, "getpgid(%d) != getpgid(0) [%d != %d]", 153 pgid_0, pgid_1, pgid_0); 154 fail = 1; 155 } 156 157 if (fail) 158 tst_resm(TINFO, "Test block 4: getpgid(1) FAILED"); 159 else 160 tst_resm(TPASS, "Test block 4: getpgid(1) PASSED"); 161 tst_resm(TINFO, "Exit block 4"); 162 163 //block5: 164 tst_resm(TINFO, "Enter block 5"); 165 fail = 0; 166 167 if (getpgid(1) < 0) { 168 tst_resm(TFAIL | TERRNO, "getpgid(1) failed"); 169 fail = 1; 170 } 171 172 if (fail) 173 tst_resm(TINFO, "Test block 5: getpgid(1) FAILED"); 174 else 175 tst_resm(TPASS, "Test block 5: getpgid(1) PASSED"); 176 tst_resm(TINFO, "Exit block 5"); 177 } 178 cleanup(); 179 tst_exit(); 180 181 } 182 183 void setup(void) 184 { 185 186 tst_sig(FORK, DEF_HANDLER, cleanup); 187 188 TEST_PAUSE; 189 } 190 191 void cleanup(void) 192 { 193 } 194