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