1865695bbc89088b9526ea9045410e5afb70a985cplars/* 27e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * Copyright (c) International Business Machines Corp., 2001 37e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * Copyright (c) 2012 Cyril Hrubis <chrubis@suse.cz> 4865695bbc89088b9526ea9045410e5afb70a985cplars * 57e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * This program is free software; you can redistribute it and/or modify 67e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * it under the terms of the GNU General Public License as published by 77e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * the Free Software Foundation; either version 2 of the License, or 87e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * (at your option) any later version. 9865695bbc89088b9526ea9045410e5afb70a985cplars * 107e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * This program is distributed in the hope that it will be useful, 117e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * but WITHOUT ANY WARRANTY; without even the implied warranty of 127e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 137e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * the GNU General Public License for more details. 14865695bbc89088b9526ea9045410e5afb70a985cplars * 157e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * You should have received a copy of the GNU General Public License 167e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * along with this program; if not, write to the Free Software 177e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18865695bbc89088b9526ea9045410e5afb70a985cplars */ 19865695bbc89088b9526ea9045410e5afb70a985cplars 20865695bbc89088b9526ea9045410e5afb70a985cplars/* 217e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis * Check that exit returns the correct values to the waiting parent 22865695bbc89088b9526ea9045410e5afb70a985cplars */ 237e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis 2474948ad801d4aba1c872652580b8b331e41aefcaplars#include <sys/types.h> 2574948ad801d4aba1c872652580b8b331e41aefcaplars#include <sys/wait.h> 2674948ad801d4aba1c872652580b8b331e41aefcaplars#include <sys/stat.h> 27865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdio.h> 28865695bbc89088b9526ea9045410e5afb70a985cplars#include <signal.h> 29865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h> 30865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h" 31865695bbc89088b9526ea9045410e5afb70a985cplars 327e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubisstatic void cleanup(void); 337e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubisstatic void setup(void); 34865695bbc89088b9526ea9045410e5afb70a985cplars 35865695bbc89088b9526ea9045410e5afb70a985cplarschar *TCID = "exit01"; 36865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1; 37865695bbc89088b9526ea9045410e5afb70a985cplars 3874948ad801d4aba1c872652580b8b331e41aefcaplarsint main(int ac, char **av) 39865695bbc89088b9526ea9045410e5afb70a985cplars{ 40865695bbc89088b9526ea9045410e5afb70a985cplars int pid, npid, sig, nsig, exno, nexno, status; 41865695bbc89088b9526ea9045410e5afb70a985cplars int rval = 0; 4289af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 43865695bbc89088b9526ea9045410e5afb70a985cplars 44d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(ac, av, NULL, NULL); 45865695bbc89088b9526ea9045410e5afb70a985cplars 467e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis setup(); 47865695bbc89088b9526ea9045410e5afb70a985cplars 48865695bbc89088b9526ea9045410e5afb70a985cplars for (lc = 0; TEST_LOOPING(lc); lc++) { 49865695bbc89088b9526ea9045410e5afb70a985cplars 50d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 51865695bbc89088b9526ea9045410e5afb70a985cplars 52865695bbc89088b9526ea9045410e5afb70a985cplars sig = 0; 53865695bbc89088b9526ea9045410e5afb70a985cplars exno = 1; 54865695bbc89088b9526ea9045410e5afb70a985cplars 557e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis pid = FORK_OR_VFORK(); 56865695bbc89088b9526ea9045410e5afb70a985cplars 577e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis switch (pid) { 587e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis case 0: 59865695bbc89088b9526ea9045410e5afb70a985cplars exit(exno); 607e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis break; 617e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis case -1: 627e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis tst_brkm(TBROK | TERRNO, cleanup, "fork() failed"); 637e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis break; 647e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis default: 65865695bbc89088b9526ea9045410e5afb70a985cplars npid = wait(&status); 66865695bbc89088b9526ea9045410e5afb70a985cplars 67865695bbc89088b9526ea9045410e5afb70a985cplars if (npid != pid) { 68865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "wait error: " 69865695bbc89088b9526ea9045410e5afb70a985cplars "unexpected pid returned"); 70865695bbc89088b9526ea9045410e5afb70a985cplars rval = 1; 71865695bbc89088b9526ea9045410e5afb70a985cplars } 72865695bbc89088b9526ea9045410e5afb70a985cplars 73865695bbc89088b9526ea9045410e5afb70a985cplars nsig = status % 256; 74865695bbc89088b9526ea9045410e5afb70a985cplars 75865695bbc89088b9526ea9045410e5afb70a985cplars /* 76865695bbc89088b9526ea9045410e5afb70a985cplars * Check if the core dump bit has been set, bit # 7 77865695bbc89088b9526ea9045410e5afb70a985cplars */ 78865695bbc89088b9526ea9045410e5afb70a985cplars if (nsig >= 128) { 79865695bbc89088b9526ea9045410e5afb70a985cplars nsig = nsig - 128; 80865695bbc89088b9526ea9045410e5afb70a985cplars } 81865695bbc89088b9526ea9045410e5afb70a985cplars 82865695bbc89088b9526ea9045410e5afb70a985cplars /* 83865695bbc89088b9526ea9045410e5afb70a985cplars * nsig is the signal number returned by wait 84865695bbc89088b9526ea9045410e5afb70a985cplars */ 85865695bbc89088b9526ea9045410e5afb70a985cplars if (nsig != sig) { 86865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "wait error: " 87865695bbc89088b9526ea9045410e5afb70a985cplars "unexpected signal returned"); 88865695bbc89088b9526ea9045410e5afb70a985cplars rval = 1; 89865695bbc89088b9526ea9045410e5afb70a985cplars } 90865695bbc89088b9526ea9045410e5afb70a985cplars 91865695bbc89088b9526ea9045410e5afb70a985cplars /* 92865695bbc89088b9526ea9045410e5afb70a985cplars * nexno is the exit number returned by wait 93865695bbc89088b9526ea9045410e5afb70a985cplars */ 94865695bbc89088b9526ea9045410e5afb70a985cplars nexno = status / 256; 95865695bbc89088b9526ea9045410e5afb70a985cplars if (nexno != exno) { 96865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "wait error: " 97865695bbc89088b9526ea9045410e5afb70a985cplars "unexpected exit number returned"); 98865695bbc89088b9526ea9045410e5afb70a985cplars rval = 1; 99865695bbc89088b9526ea9045410e5afb70a985cplars } 1007e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis break; 101865695bbc89088b9526ea9045410e5afb70a985cplars } 102865695bbc89088b9526ea9045410e5afb70a985cplars 103865695bbc89088b9526ea9045410e5afb70a985cplars if (rval != 1) { 104865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TPASS, "exit() test PASSED"); 105865695bbc89088b9526ea9045410e5afb70a985cplars } 106865695bbc89088b9526ea9045410e5afb70a985cplars } 1077e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubis 108865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 1097d0a4a57fbcd47f72b67c08df532e8ef47f6fdaeGarrett Cooper tst_exit(); 110865695bbc89088b9526ea9045410e5afb70a985cplars} 111865695bbc89088b9526ea9045410e5afb70a985cplars 1127e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubisstatic void setup(void) 113865695bbc89088b9526ea9045410e5afb70a985cplars{ 114865695bbc89088b9526ea9045410e5afb70a985cplars tst_sig(FORK, DEF_HANDLER, cleanup); 115865695bbc89088b9526ea9045410e5afb70a985cplars 116865695bbc89088b9526ea9045410e5afb70a985cplars TEST_PAUSE; 117865695bbc89088b9526ea9045410e5afb70a985cplars} 118865695bbc89088b9526ea9045410e5afb70a985cplars 1197e92025800fea8845db8ce99c003024ad88017d3Cyril Hrubisstatic void cleanup(void) 120865695bbc89088b9526ea9045410e5afb70a985cplars{ 121ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 122