1865695bbc89088b9526ea9045410e5afb70a985cplars/*
2865695bbc89088b9526ea9045410e5afb70a985cplars * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
3865695bbc89088b9526ea9045410e5afb70a985cplars *
4865695bbc89088b9526ea9045410e5afb70a985cplars * This program is free software; you can redistribute it and/or modify it
5865695bbc89088b9526ea9045410e5afb70a985cplars * under the terms of version 2 of the GNU General Public License as
6865695bbc89088b9526ea9045410e5afb70a985cplars * published by the Free Software Foundation.
7865695bbc89088b9526ea9045410e5afb70a985cplars *
8865695bbc89088b9526ea9045410e5afb70a985cplars * This program is distributed in the hope that it would be useful, but
9865695bbc89088b9526ea9045410e5afb70a985cplars * WITHOUT ANY WARRANTY; without even the implied warranty of
10865695bbc89088b9526ea9045410e5afb70a985cplars * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11865695bbc89088b9526ea9045410e5afb70a985cplars *
12865695bbc89088b9526ea9045410e5afb70a985cplars * Further, this software is distributed without any warranty that it is
13865695bbc89088b9526ea9045410e5afb70a985cplars * free of the rightful claim of any third person regarding infringement
14865695bbc89088b9526ea9045410e5afb70a985cplars * or the like.  Any license provided herein, whether implied or
15865695bbc89088b9526ea9045410e5afb70a985cplars * otherwise, applies only to this software file.  Patent licenses, if
16865695bbc89088b9526ea9045410e5afb70a985cplars * any, provided herein do not apply to combinations of this program with
17865695bbc89088b9526ea9045410e5afb70a985cplars * other software, or any other product whatsoever.
18865695bbc89088b9526ea9045410e5afb70a985cplars *
19865695bbc89088b9526ea9045410e5afb70a985cplars * You should have received a copy of the GNU General Public License along
20fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * with this program; if not, write the Free Software Foundation, Inc.,
21fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22865695bbc89088b9526ea9045410e5afb70a985cplars *
23865695bbc89088b9526ea9045410e5afb70a985cplars * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
24865695bbc89088b9526ea9045410e5afb70a985cplars * Mountain View, CA  94043, or:
25865695bbc89088b9526ea9045410e5afb70a985cplars *
26865695bbc89088b9526ea9045410e5afb70a985cplars * http://www.sgi.com
27865695bbc89088b9526ea9045410e5afb70a985cplars *
28865695bbc89088b9526ea9045410e5afb70a985cplars * For further information regarding this notice, see:
29865695bbc89088b9526ea9045410e5afb70a985cplars *
30865695bbc89088b9526ea9045410e5afb70a985cplars * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
31865695bbc89088b9526ea9045410e5afb70a985cplars *
32865695bbc89088b9526ea9045410e5afb70a985cplars */
33923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak/* $Id: setpgid01.c,v 1.7 2009/11/02 13:57:18 subrata_modak Exp $ */
34700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang
35700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang/*
36700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang * Description:
37700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang * Verify that:
38700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang *   1. Basic functionality test for setpgid(2).
398866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang *   2. Check functioning of setpgid(2) with pid = 0 and pgid = 0.
40700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang */
41865695bbc89088b9526ea9045410e5afb70a985cplars
42865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h>
43865695bbc89088b9526ea9045410e5afb70a985cplars#include <string.h>
44865695bbc89088b9526ea9045410e5afb70a985cplars#include <signal.h>
45865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdlib.h>
468866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang#include <sys/wait.h>
47865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h"
48865695bbc89088b9526ea9045410e5afb70a985cplars
49700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wangstatic void setup(void);
50700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wangstatic void cleanup(void);
51865695bbc89088b9526ea9045410e5afb70a985cplars
52fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "setpgid01";
53354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
54700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wangstatic void setpgid_test1(void);
558866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wangstatic void setpgid_test2(void);
568866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wangstatic void (*testfunc[])(void) = { setpgid_test1, setpgid_test2};
57700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wangint TST_TOTAL = ARRAY_SIZE(testfunc);
58865695bbc89088b9526ea9045410e5afb70a985cplars
5956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av)
60865695bbc89088b9526ea9045410e5afb70a985cplars{
61700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang	int i, lc;
6256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
63d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(ac, av, NULL, NULL);
64865695bbc89088b9526ea9045410e5afb70a985cplars
6556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	setup();
66865695bbc89088b9526ea9045410e5afb70a985cplars
6756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	for (lc = 0; TEST_LOOPING(lc); lc++) {
68d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
6956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
70700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang		for (i = 0; i < TST_TOTAL; i++)
71700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang			(*testfunc[i])();
722c28215423293e443469a07ae7011135d058b671Garrett Cooper	}
73865695bbc89088b9526ea9045410e5afb70a985cplars
7456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	cleanup();
751e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper	tst_exit();
762c28215423293e443469a07ae7011135d058b671Garrett Cooper}
77865695bbc89088b9526ea9045410e5afb70a985cplars
78700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wangstatic void setpgid_test1(void)
79865695bbc89088b9526ea9045410e5afb70a985cplars{
80700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang	pid_t pgid, pid;
81865695bbc89088b9526ea9045410e5afb70a985cplars
8256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	pgid = getpgrp();
8356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	pid = getpid();
8456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
85700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang	TEST(setpgid(pid, pgid));
86700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang	if (TEST_RETURN == -1 || getpgrp() != pgid) {
87700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang		tst_resm(TFAIL | TTERRNO, "test setpgid(%d, %d) fail",
88700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang			 pid, pgid);
89700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang	} else {
90700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang		tst_resm(TPASS, "test setpgid(%d, %d) success", pid, pgid);
91865695bbc89088b9526ea9045410e5afb70a985cplars	}
922c28215423293e443469a07ae7011135d058b671Garrett Cooper}
93865695bbc89088b9526ea9045410e5afb70a985cplars
948866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wangstatic int wait4child(pid_t child)
958866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang{
968866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	int status;
978866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang
988866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	if (waitpid(child, &status, 0) == -1)
998866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		tst_resm(TBROK|TERRNO, "waitpid");
1008866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	if (WIFEXITED(status))
1018866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		return WEXITSTATUS(status);
1028866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	else
1038866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		return status;
1048866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang}
1058866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang
1068866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wangstatic void setpgid_test2(void)
1078866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang{
1088866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	int ret;
1098866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	pid_t pgid, pid;
1108866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang
1118866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	pid = FORK_OR_VFORK();
1128866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	if (pid == -1)
1138866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		tst_brkm(TBROK | TERRNO, cleanup, "fork()");
1148866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang
1158866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	if (pid != 0) {
1168866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		ret = wait4child(pid);
1178866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	} else {
1188866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		pid = getpid();
1198866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		TEST(setpgid(0, 0));
1208866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		pgid = getpgrp();
1218866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		if (TEST_RETURN == -1) {
1228866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang			fprintf(stderr, "setpgid(0, 0) fails in "
1238866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang				"child process: %s\n", strerror(TEST_ERRNO));
1248866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang			exit(1);
1258866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		} else if (pgid != pid) {
1268866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang			fprintf(stderr, "setpgid(0, 0) fails to make PGID"
1278866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang				"equal to PID\n");
1288866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang			exit(1);
1298866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		} else {
1308866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang			exit(0);
1318866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		}
1328866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	}
1338866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang
1348866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	if (ret == 0)
1358866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		tst_resm(TPASS, "test setpgid(0, 0) success");
1368866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	else
1378866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang		tst_resm(TFAIL, "test setpgid(0, 0) fail");
1388866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang}
1398866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang
1408866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang
141700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wangstatic void setup(void)
142865695bbc89088b9526ea9045410e5afb70a985cplars{
1438866f064cd35c52a746f3418a403b7f4271a6c76Xiaoguang Wang	tst_sig(FORK, DEF_HANDLER, cleanup);
14456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
145700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang	TEST_PAUSE;
146700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang}
147700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang
148700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wangstatic void cleanup(void)
149700c3f95774b137425f122226d526d7815cc6cebXiaoguang Wang{
150ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
151