1 /*
2 * Copyright (c) International Business Machines Corp., 2005
3 * Copyright (c) Wipro Technologies Ltd, 2005. All Rights Reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it would be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16 *
17 */
18 /**********************************************************
19 *
20 * TEST IDENTIFIER : getdtablesize01
21 *
22 * EXECUTED BY : root / superuser
23 *
24 * TEST TITLE : Basic tests for getdtablesize01(2)
25 *
26 * TEST CASE TOTAL : 1
27 *
28 * AUTHOR : Prashant P Yendigeri
29 * <prashant.yendigeri@wipro.com>
30 * Robbie Williamson
31 * <robbiew@us.ibm.com>
32 *
33 * DESCRIPTION
34 * This is a Phase I test for the getdtablesize01(2) system call.
35 * It is intended to provide a limited exposure of the system call.
36 *
37 **********************************************************/
38
39 #include <stdio.h>
40 #include <errno.h>
41 #include <sys/types.h>
42 #include <sys/stat.h>
43 #include <fcntl.h>
44 #include <sys/time.h>
45 #include <sys/resource.h>
46 #include <unistd.h>
47 #include "test.h"
48
49 void setup();
50 void cleanup();
51
52 char *TCID = "getdtablesize01";
53 int TST_TOTAL = 1;
54
main(void)55 int main(void)
56 {
57 int table_size, fd = 0, count = 0;
58 int max_val_opfiles;
59 struct rlimit rlp;
60
61 setup();
62 table_size = getdtablesize();
63 getrlimit(RLIMIT_NOFILE, &rlp);
64 max_val_opfiles = (rlim_t) rlp.rlim_cur;
65
66 tst_resm(TINFO,
67 "Maximum number of files a process can have opened is %d",
68 table_size);
69 tst_resm(TINFO,
70 "Checking with the value returned by getrlimit...RLIMIT_NOFILE");
71
72 if (table_size == max_val_opfiles)
73 tst_resm(TPASS, "got correct dtablesize, value is %d",
74 max_val_opfiles);
75 else {
76 tst_resm(TFAIL, "got incorrect table size, value is %d",
77 max_val_opfiles);
78 cleanup();
79 }
80
81 tst_resm(TINFO,
82 "Checking Max num of files that can be opened by a process.Should be: RLIMIT_NOFILE - 1");
83 for (;;) {
84 fd = open("/etc/hosts", O_RDONLY);
85
86 if (fd == -1)
87 break;
88 count = fd;
89
90 #ifdef DEBUG
91 printf("Opened file num %d\n", fd);
92 #endif
93 }
94
95 //Now the max files opened should be RLIMIT_NOFILE - 1 , why ? read getdtablesize man page
96
97 if (count > 0)
98 close(count);
99 if (count == (max_val_opfiles - 1))
100 tst_resm(TPASS, "%d = %d", count, (max_val_opfiles - 1));
101 else if (fd < 0 && errno == ENFILE)
102 tst_brkm(TCONF, cleanup, "Reached maximum number of open files for the system");
103 else
104 tst_resm(TFAIL, "%d != %d", count, (max_val_opfiles - 1));
105
106 cleanup();
107 tst_exit();
108 }
109
setup(void)110 void setup(void)
111 {
112 tst_sig(NOFORK, DEF_HANDLER, cleanup);
113
114 TEST_PAUSE;
115 }
116
cleanup(void)117 void cleanup(void)
118 {
119 }
120