1 /*
2 *
3 * Copyright (C) Bull S.A. 2001
4 * Copyright (c) International Business Machines Corp., 2001
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
14 * the GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 /*
22 * NAME
23 * statfs03.c
24 *
25 * DESCRIPTION
26 * Testcase to check that statfs(2) sets errno to EACCES when
27 * search permission is denied for a component of the path prefix of path.
28 *
29 * ALGORITHM
30 * Use a component of the pathname, where search permission
31 * is denied for a component of the path prefix of path.
32 *
33 * USAGE: <for command-line>
34 * statfs03 [-c n] [-e] [-i n] [-I x] [-P x] [-t]
35 * where, -c n : Run n copies concurrently.
36 * -e : Turn on errno logging.
37 * -i n : Execute test n times.
38 * -I x : Execute test for x seconds.
39 * -P x : Pause for x seconds between iterations.
40 * -t : Turn on syscall timing.
41 *
42 * HISTORY
43 * 05/2002 Ported by Jacky Malcles
44 *
45 * RESTRICTIONS
46 * NONE
47 *
48 */
49 #include <sys/types.h>
50 #include <sys/statfs.h>
51 #include <sys/stat.h>
52 #include <sys/vfs.h>
53 #include <fcntl.h>
54 #include <errno.h>
55 #include <stdio.h>
56 #include "test.h"
57 #include "safe_macros.h"
58 #include <pwd.h>
59
60 char *TCID = "statfs03";
61 int TST_TOTAL = 1;
62 int fileHandle = 0;
63
64 char nobody_uid[] = "nobody";
65 struct passwd *ltpuser;
66
67 char fname[30] = "testfile";
68 char path[50];
69 struct statfs buf;
70
71 void setup(void);
72 void cleanup(void);
73
main(int ac,char ** av)74 int main(int ac, char **av)
75 {
76 int lc;
77
78 tst_parse_opts(ac, av, NULL, NULL);
79
80 setup();
81
82 for (lc = 0; TEST_LOOPING(lc); lc++) {
83
84 tst_count = 0;
85
86 TEST(statfs(path, &buf));
87
88 if (TEST_RETURN != -1) {
89 tst_resm(TFAIL, "call succeeded unexpectedly");
90
91 } else {
92
93 if (TEST_ERRNO == EACCES) {
94 tst_resm(TPASS, "expected failure - "
95 "errno = %d : %s", TEST_ERRNO,
96 strerror(TEST_ERRNO));
97 } else {
98 tst_resm(TFAIL, "unexpected error - %d : %s - "
99 "expected %d", TEST_ERRNO,
100 strerror(TEST_ERRNO), EACCES);
101 }
102 }
103 }
104
105 cleanup();
106 tst_exit();
107 }
108
109 /*
110 * setup() - performs all ONE TIME setup for this test.
111 */
setup(void)112 void setup(void)
113 {
114
115 tst_require_root();
116
117 tst_sig(NOFORK, DEF_HANDLER, cleanup);
118
119 TEST_PAUSE;
120
121 /* make a temporary directory and cd to it */
122 tst_tmpdir();
123 SAFE_CHMOD(cleanup, tst_get_tmpdir(), S_IRWXU);
124
125 /* create a test file */
126 sprintf(fname, "%s.%d", fname, getpid());
127 if (mkdir(fname, 0444) == -1) {
128 tst_resm(TFAIL, "creat(2) FAILED to creat temp file");
129 } else {
130 sprintf(path, "%s/%s", fname, fname);
131 if ((fileHandle = creat(path, 0444)) == -1)
132 tst_brkm(TFAIL | TERRNO, cleanup, "creat failed");
133 }
134
135 ltpuser = getpwnam(nobody_uid);
136 if (ltpuser == NULL)
137 tst_brkm(TBROK | TERRNO, cleanup, "getpwnam failed");
138 if (seteuid(ltpuser->pw_uid) == -1) {
139 tst_resm(TINFO | TERRNO, "seteuid failed to "
140 "to set the effective uid to %d", ltpuser->pw_uid);
141 }
142
143 }
144
145 /*
146 * cleanup() - performs all ONE TIME cleanup for this test at
147 * completion or premature exit.
148 */
cleanup(void)149 void cleanup(void)
150 {
151 /* reset the process ID to the saved ID (root) */
152 if (setuid(0) == -1) {
153 tst_resm(TINFO, "setuid(0) failed");
154 }
155
156 /*
157 * print timing stats if that option was specified.
158 * print errno log if that option was specified.
159 */
160 close(fileHandle);
161
162 /* delete the test directory created in setup() */
163 tst_rmdir();
164
165 }
166