• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  *   Copyright (c) International Business Machines  Corp., 2002
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 /* Ported from SPIE, section2/iosuite/dup6.c, by Airong Zhang */
21 
22 /*======================================================================
23 	=================== TESTPLAN SEGMENT ===================
24 >KEYS:  < dup2()
25 >WHAT:  < Does dup return -1 on the 21st file?
26 >HOW:   < Create up to _NFILE files and check for -1 return on the
27 	< next attempt
28 	< Should check NOFILE as well as _NFILE.  19-Jun-84 Dale.
29 >BUGS:  <
30 ======================================================================*/
31 
32 #include <sys/param.h>
33 #include <sys/types.h>
34 #include <sys/stat.h>
35 #include <errno.h>
36 #include <fcntl.h>
37 #include <stdio.h>
38 #include <unistd.h>
39 #include "test.h"
40 
41 char *TCID = "dup205";
42 int TST_TOTAL = 1;
43 int *fildes;
44 int min;
45 int local_flag;
46 
47 #define PASSED 1
48 #define FAILED 0
49 
50 static void setup(void);
51 static void cleanup(void);
52 
main(int ac,char * av[])53 int main(int ac, char *av[])
54 {
55 	int ifile;
56 	char pfilname[40];
57 	int serrno;
58 
59 	int lc;
60 
61 	ifile = -1;
62 
63 	tst_parse_opts(ac, av, NULL, NULL);
64 
65 	local_flag = PASSED;
66 
67 	setup();
68 
69 	for (lc = 0; TEST_LOOPING(lc); lc++) {
70 
71 		sprintf(pfilname, "./dup205.%d\n", getpid());
72 		unlink(pfilname);
73 		serrno = 0;
74 		if ((fildes[0] = creat(pfilname, 0666)) == -1)
75 			tst_brkm(TBROK | TERRNO, cleanup, "creat failed");
76 		else {
77 			fildes[fildes[0]] = fildes[0];
78 			for (ifile = fildes[0] + 1; ifile < min + 10; ifile++) {
79 				if ((fildes[ifile] = dup2(fildes[ifile - 1],
80 							  ifile)) == -1) {
81 					serrno = errno;
82 					break;
83 				} else {
84 					if (fildes[ifile] != ifile) {
85 						tst_brkm(TFAIL, cleanup,
86 							 "got wrong descriptor "
87 							 "number back (%d != %d)",
88 							 fildes[ifile], ifile);
89 					}
90 				}
91 			}	/* end for */
92 			if (ifile < min) {
93 				tst_resm(TFAIL, "Not enough files duped");
94 				local_flag = FAILED;
95 			} else if (ifile > min) {
96 				tst_resm(TFAIL, "Too many files duped");
97 				local_flag = FAILED;
98 			}
99 			if (serrno != EBADF && serrno != EMFILE &&
100 			    serrno != EINVAL) {
101 				tst_resm(TFAIL, "bad errno on dup2 failure");
102 				local_flag = FAILED;
103 			}
104 		}
105 		unlink(pfilname);
106 		for (ifile = fildes[0]; ifile < min + 10; ifile++)
107 			close(fildes[ifile]);
108 		if (local_flag == PASSED) {
109 			tst_resm(TPASS, "Test passed.");
110 		} else {
111 			tst_resm(TFAIL, "Test failed.");
112 		}
113 
114 	}
115 	cleanup();
116 	tst_exit();
117 }
118 
setup(void)119 static void setup(void)
120 {
121 	tst_tmpdir();
122 
123 	min = getdtablesize();	/* get number of files allowed open */
124 	fildes = malloc((min + 10) * sizeof(int));
125 	if (fildes == NULL)
126 		tst_brkm(TBROK | TERRNO, cleanup, "malloc error");
127 }
128 
cleanup(void)129 static void cleanup(void)
130 {
131 	if (fildes != NULL)
132 		free(fildes);
133 	tst_rmdir();
134 }
135