• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  *   Copyright (c) International Business Machines  Corp., 2001
4  *
5  *   This program is free software;  you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation; either version 2 of the License, or
8  *   (at your option) any later version.
9  *
10  *   This program is distributed in the hope that it will be useful,
11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13  *   the GNU General Public License for more details.
14  *
15  *   You should have received a copy of the GNU General Public License
16  *   along with this program;  if not, write to the Free Software
17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
20 /*
21  * NAME
22  *	fcntl12.c
23  *
24  * DESCRIPTION
25  *	Testcase to test that fcntl() sets EMFILE for F_DUPFD command.
26  *
27  * ALGORITHM
28  *	Get the size of the descriptor table of a process, by calling the
29  *	getdtablesize() system call. Then attempt to use the F_DUPFD command
30  *	for fcntl(), which should fail with EMFILE.
31  *
32  * USAGE
33  *	fcntl12
34  *
35  * HISTORY
36  *	07/2001 Ported by Wayne Boyer
37  *
38  * RESTRICTIONS
39  *	NONE
40  */
41 
42 #include <fcntl.h>
43 #include <sys/types.h>
44 #include <sys/wait.h>
45 #include <errno.h>
46 #include "test.h"
47 
48 char *TCID = "fcntl12";
49 int TST_TOTAL = 1;
50 
51 int fail;
52 char fname[20];
53 void setup(void);
54 void cleanup(void);
55 
main(int ac,char ** av)56 int main(int ac, char **av)
57 {
58 	int lc;
59 
60 	pid_t pid;
61 	int fd, i, status, max_files;
62 
63 	tst_parse_opts(ac, av, NULL, NULL);
64 
65 	setup();
66 
67 	/* check for looping state if -i option is given */
68 	for (lc = 0; TEST_LOOPING(lc); lc++) {
69 		tst_count = 0;
70 
71 		tst_resm(TINFO, "Test for errno EMFILE");
72 		fail = 0;
73 
74 		pid = FORK_OR_VFORK();
75 		if (pid < 0) {
76 			tst_brkm(TBROK | TERRNO, cleanup, "Fork failed");
77 		} else if (pid == 0) {
78 			max_files = getdtablesize();
79 			for (i = 0; i < max_files; i++) {
80 				if ((fd = open(fname, O_CREAT | O_RDONLY,
81 					       0444)) == -1) {
82 					break;
83 				}
84 			}
85 
86 			if (fcntl(1, F_DUPFD, 1) != -1) {
87 				tst_resm(TFAIL, "fcntl failed to FAIL");
88 				exit(1);
89 			} else if (errno != EMFILE) {
90 				tst_resm(TFAIL, "Expected EMFILE got %d",
91 					 errno);
92 				exit(1);
93 			}
94 			exit(0);
95 		}
96 		waitpid(pid, &status, 0);
97 		if (WEXITSTATUS(status) == 0)
98 			tst_resm(TPASS, "block 1 PASSED");
99 		else
100 			tst_resm(TFAIL, "block 1 FAILED");
101 	}
102 	cleanup();
103 	tst_exit();
104 }
105 
setup(void)106 void setup(void)
107 {
108 	tst_sig(FORK, DEF_HANDLER, cleanup);
109 
110 	TEST_PAUSE;
111 
112 	sprintf(fname, "fcnlt12.%d", getpid());
113 	tst_tmpdir();
114 }
115 
cleanup(void)116 void cleanup(void)
117 {
118 	unlink(fname);
119 	tst_rmdir();
120 }
121