1 /* 2 * Copyright (c) International Business Machines Corp., 2001 3 * Copyright (c) 2012 Cyril Hrubis <chrubis (at) suse.cz> 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 * Check that exit returns the correct values to the waiting parent 22 */ 23 24 #include <sys/types.h> 25 #include <sys/wait.h> 26 #include <sys/stat.h> 27 #include <stdio.h> 28 #include <signal.h> 29 #include <errno.h> 30 #include "test.h" 31 32 static void cleanup(void); 33 static void setup(void); 34 35 char *TCID = "exit01"; 36 int TST_TOTAL = 1; 37 38 int main(int ac, char **av) 39 { 40 int pid, npid, sig, nsig, exno, nexno, status; 41 int rval = 0; 42 int lc; 43 44 tst_parse_opts(ac, av, NULL, NULL); 45 46 setup(); 47 48 for (lc = 0; TEST_LOOPING(lc); lc++) { 49 50 tst_count = 0; 51 52 sig = 0; 53 exno = 1; 54 55 pid = FORK_OR_VFORK(); 56 57 switch (pid) { 58 case 0: 59 exit(exno); 60 break; 61 case -1: 62 tst_brkm(TBROK | TERRNO, cleanup, "fork() failed"); 63 break; 64 default: 65 npid = wait(&status); 66 67 if (npid != pid) { 68 tst_resm(TFAIL, "wait error: " 69 "unexpected pid returned"); 70 rval = 1; 71 } 72 73 nsig = status % 256; 74 75 /* 76 * Check if the core dump bit has been set, bit # 7 77 */ 78 if (nsig >= 128) { 79 nsig = nsig - 128; 80 } 81 82 /* 83 * nsig is the signal number returned by wait 84 */ 85 if (nsig != sig) { 86 tst_resm(TFAIL, "wait error: " 87 "unexpected signal returned"); 88 rval = 1; 89 } 90 91 /* 92 * nexno is the exit number returned by wait 93 */ 94 nexno = status / 256; 95 if (nexno != exno) { 96 tst_resm(TFAIL, "wait error: " 97 "unexpected exit number returned"); 98 rval = 1; 99 } 100 break; 101 } 102 103 if (rval != 1) { 104 tst_resm(TPASS, "exit() test PASSED"); 105 } 106 } 107 108 cleanup(); 109 tst_exit(); 110 } 111 112 static void setup(void) 113 { 114 tst_sig(FORK, DEF_HANDLER, cleanup); 115 116 TEST_PAUSE; 117 } 118 119 static void cleanup(void) 120 { 121 } 122