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 * getsid01.c 23 * 24 * DESCRIPTION 25 * getsid01 - call getsid() and make sure it succeeds 26 * 27 * ALGORITHM 28 * loop if that option was specified 29 * issue the system call 30 * check the return value 31 * if return value == -1 32 * issue a FAIL message, break remaining tests and cleanup 33 * if we are doing functional testing 34 * save the return value from the getsid() call - the session ID 35 * fork a child and get the child's session ID 36 * if the child's session ID == the parent's session ID 37 * issue a PASS message 38 * else 39 * issue a FAIL message 40 * else issue a PASS message 41 * call cleanup 42 * 43 * USAGE: <for command-line> 44 * getsid01 [-c n] [-f] [-i n] [-I x] [-P x] [-t] 45 * where, -c n : Run n copies concurrently. 46 * -f : Turn off functionality Testing. 47 * -i n : Execute test n times. 48 * -I x : Execute test for x seconds. 49 * -P x : Pause for x seconds between iterations. 50 * -t : Turn on syscall timing. 51 * 52 * HISTORY 53 * 07/2001 Ported by Wayne Boyer 54 * 55 * RESTRICTIONS 56 * none 57 */ 58 #define _GNU_SOURCE 1 59 60 #include <errno.h> 61 #include <sys/wait.h> 62 #include <unistd.h> 63 #include "test.h" 64 65 void cleanup(void); 66 void setup(void); 67 68 char *TCID = "getsid01"; 69 int TST_TOTAL = 1; 70 71 pid_t p_sid; 72 73 int main(int ac, char **av) 74 { 75 int lc; 76 pid_t pid, c_pid, c_sid; 77 78 tst_parse_opts(ac, av, NULL, NULL); 79 80 setup(); /* global setup */ 81 82 /* The following loop checks looping state if -i option given */ 83 84 for (lc = 0; TEST_LOOPING(lc); lc++) { 85 /* reset tst_count in case we are looping */ 86 tst_count = 0; 87 88 /* call the system call with the TEST() macro */ 89 90 TEST(getsid(0)); 91 92 if (TEST_RETURN == -1) { 93 tst_resm(TFAIL, "call failed - errno = %d " 94 "- %s", TEST_ERRNO, strerror(TEST_ERRNO)); 95 continue; 96 } 97 98 /* save the return value in a global variable */ 99 p_sid = TEST_RETURN; 100 101 if ((pid = FORK_OR_VFORK()) == -1) { 102 tst_brkm(TBROK, cleanup, "could not fork"); 103 } 104 105 if (pid == 0) { /* child */ 106 if ((c_pid = getpid()) == -1) { 107 tst_resm(TINFO, "getpid failed in " 108 "functionality test"); 109 exit(1); 110 } 111 112 /* 113 * if the session ID of the child is the 114 * same as the parent then things look good 115 */ 116 117 if ((c_sid = getsid(0)) == -1) { 118 tst_resm(TINFO, "getsid failed in " 119 "functionality test"); 120 exit(2); 121 } 122 123 if (c_sid == p_sid) { 124 tst_resm(TPASS, "session ID is " 125 "correct"); 126 } else { 127 tst_resm(TFAIL, "session ID is " 128 "not correct"); 129 } 130 exit(0); 131 132 } else { 133 waitpid(pid, NULL, 0); 134 } 135 } 136 137 cleanup(); 138 tst_exit(); 139 } 140 141 /* 142 * setup() - performs all the ONE TIME setup for this test. 143 */ 144 void setup(void) 145 { 146 147 tst_sig(FORK, DEF_HANDLER, cleanup); 148 149 TEST_PAUSE; 150 } 151 152 /* 153 * cleanup() - performs all the ONE TIME cleanup for this test at completion 154 * or premature exit. 155 */ 156 void cleanup(void) 157 { 158 159 } 160