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