1865695bbc89088b9526ea9045410e5afb70a985cplars/*
27268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh * Copyright (c) International Business Machines  Corp., 2001
3865695bbc89088b9526ea9045410e5afb70a985cplars *
47268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh * This program is free software;  you can redistribute it and/or modify
57268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh * it under the terms of the GNU General Public License as published by
67268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh * the Free Software Foundation; either version 2 of the License, or
77268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh * (at your option) any later version.
8865695bbc89088b9526ea9045410e5afb70a985cplars *
97268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh * This program is distributed in the hope that it will be useful,
107268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh * but WITHOUT ANY WARRANTY;  without even the implied warranty of
117268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
127268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh * the GNU General Public License for more details.
13865695bbc89088b9526ea9045410e5afb70a985cplars *
147268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh * You should have received a copy of the GNU General Public License
157268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh * along with this program.
16865695bbc89088b9526ea9045410e5afb70a985cplars *
177268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh * History
187268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh *	07/2001 John George
197268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh *		-Ported
207268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh *      04/2002 wjhuie sigset cleanups
21865695bbc89088b9526ea9045410e5afb70a985cplars */
22865695bbc89088b9526ea9045410e5afb70a985cplars
23865695bbc89088b9526ea9045410e5afb70a985cplars/*
24865695bbc89088b9526ea9045410e5afb70a985cplars * DESCRIPTION
257268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh *	Tests to see if pids returned from fork and waitpid are same
26bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak *
27865695bbc89088b9526ea9045410e5afb70a985cplars * ALGORITHM
2804cfe1bb3043e373f65e35a35705319cbeba163cWanlong Gao *	Check proper functioning of waitpid with pid = 0 and < -1 with arg
2904cfe1bb3043e373f65e35a35705319cbeba163cWanlong Gao *	WUNTRACED
30865695bbc89088b9526ea9045410e5afb70a985cplars */
31865695bbc89088b9526ea9045410e5afb70a985cplars
327268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh#include "waitpid_common.h"
33865695bbc89088b9526ea9045410e5afb70a985cplars
347268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikhstatic void do_child_1(void)
35865695bbc89088b9526ea9045410e5afb70a985cplars{
367268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	pid_t pid, group;
377268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	int i;
387268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	int status;
39865695bbc89088b9526ea9045410e5afb70a985cplars
407268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	group = SAFE_GETPGID(0);
4156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
42c548a3187d37ebdacce0891131c9ab5143bc5998Garrett Cooper	for (i = 0; i < MAXKIDS; i++) {
437268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh		if (i == (MAXKIDS / 2))
447268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh			SAFE_SETPGID(0, 0);
45865695bbc89088b9526ea9045410e5afb70a985cplars
467268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh		pid = SAFE_FORK();
477268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh		if (pid == 0)
487268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh			do_exit(1);
49c548a3187d37ebdacce0891131c9ab5143bc5998Garrett Cooper
507268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh		fork_kid_pid[i] = pid;
51c548a3187d37ebdacce0891131c9ab5143bc5998Garrett Cooper	}
52865695bbc89088b9526ea9045410e5afb70a985cplars
537268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	if (TST_TRACE(waitpid_ret_test(0, &status, WNOHANG | WUNTRACED, 0, 0)))
547268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh		return;
55d34d581c6a320e356a6cda923c7aa399479e812crobbiew
567268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	if (TST_TRACE(waitpid_ret_test(-group, &status, WNOHANG | WUNTRACED,
577268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh				       0, 0)))
587268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh		return;
59865695bbc89088b9526ea9045410e5afb70a985cplars
607268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	TST_CHECKPOINT_WAKE2(0, MAXKIDS);
61865695bbc89088b9526ea9045410e5afb70a985cplars
627268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	if (TST_TRACE(reap_children(0, WUNTRACED, fork_kid_pid + (MAXKIDS / 2),
637268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh				    MAXKIDS / 2)))
647268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh		return;
65865695bbc89088b9526ea9045410e5afb70a985cplars
667268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	if (TST_TRACE(reap_children(-group, WUNTRACED, fork_kid_pid,
677268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh				    MAXKIDS / 2)))
687268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh		return;
69865695bbc89088b9526ea9045410e5afb70a985cplars
707268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	tst_res(TPASS, "Test PASSED");
71865695bbc89088b9526ea9045410e5afb70a985cplars}
72d34d581c6a320e356a6cda923c7aa399479e812crobbiew
737268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikhstatic struct tst_test test = {
747268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	.forks_child = 1,
757268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	.needs_checkpoints = 1,
767268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	.setup = waitpid_setup,
777268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	.cleanup = waitpid_cleanup,
787268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh	.test_all = waitpid_test,
797268ae743688268db79e2da15924c9a0a62012e1Stanislav Kholmanskikh};
80