1865695bbc89088b9526ea9045410e5afb70a985cplars/*
2865695bbc89088b9526ea9045410e5afb70a985cplars *   Copyright (c) International Business Machines  Corp., 2001
3865695bbc89088b9526ea9045410e5afb70a985cplars *
4865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is free software;  you can redistribute it and/or modify
5865695bbc89088b9526ea9045410e5afb70a985cplars *   it under the terms of the GNU General Public License as published by
6865695bbc89088b9526ea9045410e5afb70a985cplars *   the Free Software Foundation; either version 2 of the License, or
7865695bbc89088b9526ea9045410e5afb70a985cplars *   (at your option) any later version.
8865695bbc89088b9526ea9045410e5afb70a985cplars *
9865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is distributed in the hope that it will be useful,
10865695bbc89088b9526ea9045410e5afb70a985cplars *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
11865695bbc89088b9526ea9045410e5afb70a985cplars *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
12865695bbc89088b9526ea9045410e5afb70a985cplars *   the GNU General Public License for more details.
13865695bbc89088b9526ea9045410e5afb70a985cplars *
14865695bbc89088b9526ea9045410e5afb70a985cplars *   You should have received a copy of the GNU General Public License
15865695bbc89088b9526ea9045410e5afb70a985cplars *   along with this program;  if not, write to the Free Software
164548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao *
18865695bbc89088b9526ea9045410e5afb70a985cplars * NAME
19a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao *	fork09.c
20865695bbc89088b9526ea9045410e5afb70a985cplars *
21865695bbc89088b9526ea9045410e5afb70a985cplars * DESCRIPTION
22865695bbc89088b9526ea9045410e5afb70a985cplars *	Check that child has access to a full set of files.
23865695bbc89088b9526ea9045410e5afb70a985cplars *
24865695bbc89088b9526ea9045410e5afb70a985cplars * ALGORITHM
25a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao *	Parent opens a maximum number of files
26a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao *	Child closes one and attempts to open another, it should be
27a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao *	available
28865695bbc89088b9526ea9045410e5afb70a985cplars *
29865695bbc89088b9526ea9045410e5afb70a985cplars * USAGE
30a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao *	fork09
31865695bbc89088b9526ea9045410e5afb70a985cplars *
32865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY
33865695bbc89088b9526ea9045410e5afb70a985cplars *	07/2001 Ported by Wayne Boyer
34865695bbc89088b9526ea9045410e5afb70a985cplars *
35ec0471473926715a95036779918711ee27d528e7subrata_modak *	10/2008 Suzuki K P <suzuki@in.ibm.com>
36ec0471473926715a95036779918711ee27d528e7subrata_modak *		Fix maximum number of files open logic.
37ec0471473926715a95036779918711ee27d528e7subrata_modak *
38865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS
39a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao *	None
40865695bbc89088b9526ea9045410e5afb70a985cplars */
41a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao
4274948ad801d4aba1c872652580b8b331e41aefcaplars#include <sys/types.h>
4374948ad801d4aba1c872652580b8b331e41aefcaplars#include <sys/wait.h>
4474948ad801d4aba1c872652580b8b331e41aefcaplars#include <sys/stat.h>
4574948ad801d4aba1c872652580b8b331e41aefcaplars#include <fcntl.h>
46865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdio.h>
47865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h>
4856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak#include <unistd.h>		/* for _SC_OPEN_MAX */
49865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h"
50865695bbc89088b9526ea9045410e5afb70a985cplars
510422f204301aa3c08ca9c90bb7e49221dfb7ff64robbiewchar *TCID = "fork09";
52865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1;
53865695bbc89088b9526ea9045410e5afb70a985cplars
54a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gaostatic void setup(void);
55a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gaostatic void cleanup(void);
56865695bbc89088b9526ea9045410e5afb70a985cplars
57a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gaostatic char filname[40], childfile[40];
58a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gaostatic int first;
59a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gaostatic FILE **fildeses;		/* file streams */
60a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gaostatic int mypid, nfiles;
61865695bbc89088b9526ea9045410e5afb70a985cplars
6228e814915bc75e3ee3184c2bdf17d7a6edffcb1asubrata_modak#define OPEN_MAX (sysconf(_SC_OPEN_MAX))
6328e814915bc75e3ee3184c2bdf17d7a6edffcb1asubrata_modak
6474948ad801d4aba1c872652580b8b331e41aefcaplarsint main(int ac, char **av)
65865695bbc89088b9526ea9045410e5afb70a985cplars{
6674948ad801d4aba1c872652580b8b331e41aefcaplars	int pid, status, nf;
67bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
68a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao	int lc;
69865695bbc89088b9526ea9045410e5afb70a985cplars
70d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(ac, av, NULL, NULL);
71865695bbc89088b9526ea9045410e5afb70a985cplars
72865695bbc89088b9526ea9045410e5afb70a985cplars	setup();
73865695bbc89088b9526ea9045410e5afb70a985cplars
74d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis	fildeses = malloc((OPEN_MAX + 10) * sizeof(FILE *));
75a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao	if (fildeses == NULL)
76865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "malloc failed");
77865695bbc89088b9526ea9045410e5afb70a985cplars
78865695bbc89088b9526ea9045410e5afb70a985cplars	for (lc = 0; TEST_LOOPING(lc); lc++) {
79d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
80865695bbc89088b9526ea9045410e5afb70a985cplars		mypid = getpid();
81865695bbc89088b9526ea9045410e5afb70a985cplars
82923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak		tst_resm(TINFO, "OPEN_MAX is %ld", OPEN_MAX);
83865695bbc89088b9526ea9045410e5afb70a985cplars
84865695bbc89088b9526ea9045410e5afb70a985cplars		/* establish first free file */
850422f204301aa3c08ca9c90bb7e49221dfb7ff64robbiew		sprintf(filname, "fork09.%d", mypid);
86a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao		first = creat(filname, 0660);
87a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao		if (first == -1)
88865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TBROK, cleanup, "Cannot open first file %s, "
89865695bbc89088b9526ea9045410e5afb70a985cplars				 "errno = %d", filname, errno);
90865695bbc89088b9526ea9045410e5afb70a985cplars		close(first);
91865695bbc89088b9526ea9045410e5afb70a985cplars
92865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "first file descriptor is %d ", first);
93865695bbc89088b9526ea9045410e5afb70a985cplars
94a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao		if (unlink(filname) == -1)
95865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TBROK, cleanup, "Cannot unlink file %s, "
96865695bbc89088b9526ea9045410e5afb70a985cplars				 "errno = %d", filname, errno);
97865695bbc89088b9526ea9045410e5afb70a985cplars
98865695bbc89088b9526ea9045410e5afb70a985cplars		/*
99865695bbc89088b9526ea9045410e5afb70a985cplars		 * now open all the files for the test
100865695bbc89088b9526ea9045410e5afb70a985cplars		 */
101865695bbc89088b9526ea9045410e5afb70a985cplars		for (nfiles = first; nfiles < OPEN_MAX; nfiles++) {
102865695bbc89088b9526ea9045410e5afb70a985cplars			sprintf(filname, "file%d.%d", nfiles, mypid);
103a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao			fildeses[nfiles] = fopen(filname, "a");
104a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao			if (fildeses[nfiles] == NULL) {
105ec0471473926715a95036779918711ee27d528e7subrata_modak				/* Did we already reach OPEN_MAX ? */
106ec0471473926715a95036779918711ee27d528e7subrata_modak				if (errno == EMFILE)
107ec0471473926715a95036779918711ee27d528e7subrata_modak					break;
108865695bbc89088b9526ea9045410e5afb70a985cplars				tst_brkm(TBROK, cleanup, "Parent: cannot open "
109865695bbc89088b9526ea9045410e5afb70a985cplars					 "file %d %s errno = %d", nfiles,
110865695bbc89088b9526ea9045410e5afb70a985cplars					 filname, errno);
111a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao			}
112865695bbc89088b9526ea9045410e5afb70a985cplars#ifdef DEBUG
113865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "filname: %s", filname);
114865695bbc89088b9526ea9045410e5afb70a985cplars#endif
115865695bbc89088b9526ea9045410e5afb70a985cplars		}
116865695bbc89088b9526ea9045410e5afb70a985cplars
117865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Parent reporting %d files open", nfiles - 1);
118865695bbc89088b9526ea9045410e5afb70a985cplars
119a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao		pid = fork();
120a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao		if (pid == -1)
121865695bbc89088b9526ea9045410e5afb70a985cplars			tst_brkm(TBROK, cleanup, "Fork failed");
122865695bbc89088b9526ea9045410e5afb70a985cplars
12356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		if (pid == 0) {	/* child */
124865695bbc89088b9526ea9045410e5afb70a985cplars			nfiles--;
125865695bbc89088b9526ea9045410e5afb70a985cplars			if (fclose(fildeses[nfiles]) == -1) {
126865695bbc89088b9526ea9045410e5afb70a985cplars				tst_resm(TINFO, "Child could not close file "
127865695bbc89088b9526ea9045410e5afb70a985cplars					 "#%d, errno = %d", nfiles, errno);
128865695bbc89088b9526ea9045410e5afb70a985cplars				exit(1);
129a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao			} else {
130865695bbc89088b9526ea9045410e5afb70a985cplars				sprintf(childfile, "cfile.%d", getpid());
131a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao				fildeses[nfiles] = fopen(childfile, "a");
132a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao				if (fildeses[nfiles] == NULL) {
133865695bbc89088b9526ea9045410e5afb70a985cplars					tst_resm(TINFO, "Child could not open "
134865695bbc89088b9526ea9045410e5afb70a985cplars						 "file %s, errno = %d",
135865695bbc89088b9526ea9045410e5afb70a985cplars						 childfile, errno);
136865695bbc89088b9526ea9045410e5afb70a985cplars					exit(1);
137a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao				} else {
138865695bbc89088b9526ea9045410e5afb70a985cplars					tst_resm(TINFO, "Child opened new "
1394bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak						 "file #%d", nfiles);
140865695bbc89088b9526ea9045410e5afb70a985cplars					unlink(childfile);
141865695bbc89088b9526ea9045410e5afb70a985cplars					exit(0);
142865695bbc89088b9526ea9045410e5afb70a985cplars				}
143865695bbc89088b9526ea9045410e5afb70a985cplars			}
14456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		} else {	/* parent */
145865695bbc89088b9526ea9045410e5afb70a985cplars			wait(&status);
146a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao			if (status >> 8 != 0)
147865695bbc89088b9526ea9045410e5afb70a985cplars				tst_resm(TFAIL, "test 1 FAILED");
148a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao			else
149865695bbc89088b9526ea9045410e5afb70a985cplars				tst_resm(TPASS, "test 1 PASSED");
150865695bbc89088b9526ea9045410e5afb70a985cplars		}
151865695bbc89088b9526ea9045410e5afb70a985cplars
152865695bbc89088b9526ea9045410e5afb70a985cplars		/* clean up things in case we are looping */
153865695bbc89088b9526ea9045410e5afb70a985cplars		for (nf = first; nf < nfiles; nf++) {
154865695bbc89088b9526ea9045410e5afb70a985cplars			fclose(fildeses[nf]);
155865695bbc89088b9526ea9045410e5afb70a985cplars			sprintf(filname, "file%d.%d", nf, mypid);
156865695bbc89088b9526ea9045410e5afb70a985cplars			unlink(filname);
157865695bbc89088b9526ea9045410e5afb70a985cplars		}
158865695bbc89088b9526ea9045410e5afb70a985cplars	}
159865695bbc89088b9526ea9045410e5afb70a985cplars
160a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao	cleanup();
1617d0a4a57fbcd47f72b67c08df532e8ef47f6fdaeGarrett Cooper	tst_exit();
162865695bbc89088b9526ea9045410e5afb70a985cplars}
163bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
164c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingerstatic void setup(void)
165865695bbc89088b9526ea9045410e5afb70a985cplars{
166865695bbc89088b9526ea9045410e5afb70a985cplars	tst_sig(FORK, DEF_HANDLER, cleanup);
167865695bbc89088b9526ea9045410e5afb70a985cplars	umask(0);
168865695bbc89088b9526ea9045410e5afb70a985cplars
169865695bbc89088b9526ea9045410e5afb70a985cplars	TEST_PAUSE;
170865695bbc89088b9526ea9045410e5afb70a985cplars	tst_tmpdir();
171865695bbc89088b9526ea9045410e5afb70a985cplars}
172865695bbc89088b9526ea9045410e5afb70a985cplars
173c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingerstatic void cleanup(void)
174865695bbc89088b9526ea9045410e5afb70a985cplars{
175865695bbc89088b9526ea9045410e5afb70a985cplars	tst_rmdir();
176a91a4de63fa18df6e9715f5883633d8592e3df2eWanlong Gao}
177