xref: /minix/minix/tests/test33.c (revision 83133719)
1 /* test33: access()		Author: Jan-Mark Wams (jms@cs.vu.nl) */
2 
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <sys/wait.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8 #include <string.h>
9 #include <fcntl.h>
10 #include <limits.h>
11 #include <errno.h>
12 #include <time.h>
13 #include <stdio.h>
14 
15 int max_error = 1;
16 #include "common.h"
17 
18 #define ITERATIONS     2
19 
20 
21 #define System(cmd)	if (system(cmd) != 0) printf("``%s'' failed\n", cmd)
22 #define Chdir(dir)	if (chdir(dir) != 0) printf("Can't goto %s\n", dir)
23 #define Stat(a,b)	if (stat(a,b) != 0) printf("Can't stat %s\n", a)
24 #define Chmod(a,b)	if (chmod(a,b) != 0) printf("Can't chmod %s\n", a)
25 #define Mkfifo(f)	if (mkfifo(f,0777)!=0) printf("Can't make fifo %s\n", f)
26 
27 int superuser;			/* nonzero if uid == euid (euid == 0 always) */
28 char *MaxName;			/* Name of maximum length */
29 char MaxPath[PATH_MAX];		/* Same for path */
30 char *ToLongName;		/* Name of maximum +1 length */
31 char ToLongPath[PATH_MAX + 1];	/* Same for path, both too long */
32 
33 void test33a(void);
34 void test33b(void);
35 void test33c(void);
36 void test33d(void);
37 void test_access(void);
38 void makelongnames(void);
39 
40 int main(int argc, char *argv[])
41 {
42   int i, m = 0xFFFF;
43 
44   sync();
45   if (argc == 2) m = atoi(argv[1]);
46   umask(0000);
47   start(33);
48 
49   if (geteuid() != 0) {
50 	printf("must be setuid root; test aborted\n");
51 	cleanup();
52 	exit(1);
53   }
54   if (getuid() == 0) {
55        printf("must be setuid root logged in as someone else; test aborted\n");
56        cleanup();
57        exit(1);
58   }
59 
60   makelongnames();
61   superuser = (getuid() == 0);
62 
63   for (i = 0; i < ITERATIONS; i++) {
64 	if (m & 0001) test33a();
65 	if (m & 0002) test33b();
66 	if (m & 0004) test33c();
67 	if (m & 0010) test33d();
68   }
69   quit();
70   return 1;
71 }
72 
73 void test33a()
74 {				/* Test normal operation. */
75   int stat_loc;			/* For the wait(&stat_loc) call. */
76 
77   subtest = 1;
78   System("rm -rf ../DIR_33/*");
79 
80   /* To test normal access first make some files for real uid. */
81   switch (fork()) {
82       case -1:	printf("Can't fork\n");	break;
83       case 0:
84 	alarm(20);
85 	setuid(getuid());	/* (Re)set the effective ids to the
86 				 * real ids. */
87 	setgid(getgid());
88 	System("> rwx; chmod 700 rwx");
89 	System("> rw_; chmod 600 rw_");
90 	System("> r_x; chmod 500 r_x");
91 	System("> r__; chmod 400 r__");
92 	System("> _wx; chmod 300 _wx");
93 	System("> _w_; chmod 200 _w_");
94 	System("> __x; chmod 100 __x");
95 	System("> ___; chmod 000 ___");
96 	exit(0);
97 
98       default:
99 	wait(&stat_loc);
100 	if (stat_loc != 0) e(1);/* Alarm? */
101   }
102   test_access();
103 
104   /* Let's test access() on directorys. */
105   switch (fork()) {
106       case -1:	printf("Can't fork\n");	break;
107       case 0:
108 	alarm(20);
109 	setuid(getuid());	/* (Re)set the effective ids to the
110 				 * real ids. */
111 	setgid(getgid());
112 	System("rm -rf [_r][_w][_x]");
113 	System("mkdir rwx; chmod 700 rwx");
114 	System("mkdir rw_; chmod 600 rw_");
115 	System("mkdir r_x; chmod 500 r_x");
116 	System("mkdir r__; chmod 400 r__");
117 	System("mkdir _wx; chmod 300 _wx");
118 	System("mkdir _w_; chmod 200 _w_");
119 	System("mkdir __x; chmod 100 __x");
120 	System("mkdir ___; chmod 000 ___");
121 	exit(0);
122 
123       default:
124 	wait(&stat_loc);
125 	if (stat_loc != 0) e(2);/* Alarm? */
126   }
127   test_access();
128 
129   switch (fork()) {
130       case -1:	printf("Can't fork\n");	break;
131       case 0:
132 	alarm(20);
133 	setuid(getuid());	/* (Re)set the effective ids to the
134 				 * real ids. */
135 	setgid(getgid());
136 	System("rmdir [_r][_w][_x]");
137 	Mkfifo("rwx");
138 	System("chmod 700 rwx");
139 	Mkfifo("rw_");
140 	System("chmod 600 rw_");
141 	Mkfifo("r_x");
142 	System("chmod 500 r_x");
143 	Mkfifo("r__");
144 	System("chmod 400 r__");
145 	Mkfifo("_wx");
146 	System("chmod 300 _wx");
147 	Mkfifo("_w_");
148 	System("chmod 200 _w_");
149 	Mkfifo("__x");
150 	System("chmod 100 __x");
151 	Mkfifo("___");
152 	System("chmod 000 ___");
153 	exit(0);
154 
155       default:
156 	wait(&stat_loc);
157 	if (stat_loc != 0) e(3);/* Alarm? */
158   }
159   test_access();
160 
161   /* Remove all the fifos. */
162   switch (fork()) {
163       case -1:	printf("Can't fork\n");	break;
164       case 0:
165 	alarm(20);
166 	setuid(getuid());
167 	setgid(getgid());
168 	System("rm -rf [_r][_w][_x]");
169 	exit(0);
170 
171       default:
172 	wait(&stat_loc);
173 	if (stat_loc != 0) e(4);/* Alarm? */
174   }
175 }
176 
177 void test33b()
178 {
179   int stat_loc;			/* For the wait(&stat_loc) call. */
180 
181   subtest = 2;
182   System("rm -rf ../DIR_33/*");
183 
184   switch (fork()) {
185       case -1:	printf("Can't fork\n");	break;
186       case 0:
187 	alarm(20);
188 
189 	/* (Re)set the effective ids to the real ids. */
190 	setuid(getuid());
191 	setgid(getgid());
192 	System("> ______rwx; chmod 007 ______rwx");
193 	System("> ________x; chmod 001 ________x");
194 	System("> _________; chmod 000 _________");
195 	exit(0);
196 
197       default:
198 	wait(&stat_loc);
199 	if (stat_loc != 0) e(1);/* Alarm? */
200   }
201 
202   /* If we are superuser, we have access to all. */
203   /* Well, almost, execution access might need at least one X bit. */
204   if (superuser) {
205 	if (access("_________", R_OK) != 0) e(2);
206 	if (access("_________", W_OK) != 0) e(3);
207 	if (access("________x", R_OK) != 0) e(4);
208 	if (access("________x", W_OK) != 0) e(5);
209 	if (access("________x", X_OK) != 0) e(6);
210 	if (access("______rwx", R_OK) != 0) e(7);
211 	if (access("______rwx", W_OK) != 0) e(8);
212 	if (access("______rwx", X_OK) != 0) e(9);
213   }
214   if (!superuser) {
215 	if (access("_________", R_OK) != -1) e(10);
216 	if (errno != EACCES) e(11);
217 	if (access("_________", W_OK) != -1) e(12);
218 	if (errno != EACCES) e(13);
219 	if (access("_________", X_OK) != -1) e(14);
220 	if (errno != EACCES) e(15);
221 	if (access("________x", R_OK) != -1) e(16);
222 	if (errno != EACCES) e(17);
223 	if (access("________x", W_OK) != -1) e(18);
224 	if (errno != EACCES) e(19);
225 	if (access("________x", X_OK) != -1) e(20);
226 	if (errno != EACCES) e(21);
227 	if (access("______rwx", R_OK) != -1) e(22);
228 	if (errno != EACCES) e(23);
229 	if (access("______rwx", W_OK) != -1) e(24);
230 	if (errno != EACCES) e(25);
231 	if (access("______rwx", X_OK) != -1) e(26);
232 	if (errno != EACCES) e(27);
233   }
234 
235   /* If the real uid != effective uid. */
236   if (!superuser) {
237 	System("rm -rf [_r][_w][_x]");
238 	System("> rwx");
239 	Chmod("rwx", 0700);
240 	System("> rw_");
241 	Chmod("rw_", 0600);
242 	System("> r_x");
243 	Chmod("r_x", 0500);
244 	System("> r__");
245 	Chmod("r__", 0400);
246 	System("> _wx");
247 	Chmod("_wx", 0300);
248 	System("> _w_");
249 	Chmod("_w_", 0200);
250 	System("> __x");
251 	Chmod("__x", 0100);
252 	System("> ___");
253 	Chmod("___", 0000);
254 
255 	if (access("rwx", F_OK) != 0) e(28);
256 	if (access("rwx", R_OK) != -1) e(29);
257 	if (errno != EACCES) e(30);
258 	if (access("rwx", W_OK) != -1) e(31);
259 	if (errno != EACCES) e(32);
260 	if (access("rwx", X_OK) != -1) e(33);
261 	if (errno != EACCES) e(34);
262 
263 	if (access("rw_", F_OK) != 0) e(35);
264 	if (access("rw_", R_OK) != -1) e(36);
265 	if (errno != EACCES) e(37);
266 	if (access("rw_", W_OK) != -1) e(38);
267 	if (errno != EACCES) e(39);
268 	if (access("rw_", X_OK) != -1) e(40);
269 	if (errno != EACCES) e(41);
270 
271 	if (access("r_x", F_OK) != 0) e(42);
272 	if (access("r_x", R_OK) != -1) e(43);
273 	if (errno != EACCES) e(44);
274 	if (access("r_x", W_OK) != -1) e(45);
275 	if (errno != EACCES) e(46);
276 	if (access("r_x", X_OK) != -1) e(47);
277 	if (errno != EACCES) e(48);
278 
279 	if (access("r__", F_OK) != 0) e(49);
280 	if (access("r__", R_OK) != -1) e(50);
281 	if (errno != EACCES) e(51);
282 	if (access("r__", W_OK) != -1) e(52);
283 	if (errno != EACCES) e(53);
284 	if (access("r__", X_OK) != -1) e(54);
285 	if (errno != EACCES) e(55);
286 
287 	if (access("_wx", F_OK) != 0) e(56);
288 	if (access("_wx", R_OK) != -1) e(57);
289 	if (errno != EACCES) e(58);
290 	if (access("_wx", W_OK) != -1) e(59);
291 	if (errno != EACCES) e(60);
292 	if (access("_wx", X_OK) != -1) e(61);
293 	if (errno != EACCES) e(62);
294 
295 	if (access("_w_", F_OK) != 0) e(63);
296 	if (access("_w_", R_OK) != -1) e(64);
297 	if (errno != EACCES) e(65);
298 	if (access("_w_", W_OK) != -1) e(66);
299 	if (errno != EACCES) e(67);
300 	if (access("_w_", X_OK) != -1) e(68);
301 	if (errno != EACCES) e(69);
302 
303 	if (access("__x", F_OK) != 0) e(70);
304 	if (access("__x", R_OK) != -1) e(71);
305 	if (errno != EACCES) e(72);
306 	if (access("__x", W_OK) != -1) e(73);
307 	if (errno != EACCES) e(74);
308 	if (access("__x", X_OK) != -1) e(75);
309 	if (errno != EACCES) e(76);
310 
311 	if (access("___", F_OK) != 0) e(77);
312 	if (access("___", R_OK) != -1) e(78);
313 	if (errno != EACCES) e(79);
314 	if (access("___", W_OK) != -1) e(80);
315 	if (errno != EACCES) e(81);
316 	if (access("___", X_OK) != -1) e(82);
317 	if (errno != EACCES) e(83);
318 
319 	System("rm -rf [_r][_w][_x]");
320   }
321 }
322 
323 void test33c()
324 {				/* Test errors returned. */
325   int i, fd, does_truncate;
326 
327   subtest = 3;
328   System("rm -rf ../DIR_33/*");
329 
330   /* Test what access() does with non existing files. */
331   System("rm -rf nonexist");
332   if (access("noexist", F_OK) != -1) e(1);
333   if (errno != ENOENT) e(2);
334   if (access("noexist", R_OK) != -1) e(3);
335   if (errno != ENOENT) e(4);
336   if (access("noexist", W_OK) != -1) e(5);
337   if (errno != ENOENT) e(6);
338   if (access("noexist", X_OK) != -1) e(7);
339   if (errno != ENOENT) e(8);
340   if (access("noexist", R_OK | W_OK) != -1) e(9);
341   if (errno != ENOENT) e(10);
342   if (access("noexist", R_OK | X_OK) != -1) e(11);
343   if (errno != ENOENT) e(12);
344   if (access("noexist", W_OK | X_OK) != -1) e(13);
345   if (errno != ENOENT) e(14);
346   if (access("noexist", R_OK | W_OK | X_OK) != -1) e(15);
347   if (errno != ENOENT) e(16);
348 
349   /* Test access on a nonsearchable path. */
350   if (mkdir("nosearch", 0777) != 0) e(1000);
351   if ( (i = creat("nosearch/file", 0666)) < 0) e(1001);
352   if (close(i) < 0) e(1002);
353   if ( (i = creat("file", 0666) < 0)) e(1003);
354   if (close(i) < 0) e(1004);
355   if (chmod("nosearch/file", 05777) < 0) e(1005);
356   if (chmod("file", 05777) < 0) e(1006);
357   if (chmod("nosearch", 0677) != 0) e(1007);
358   if (access("nosearch/file", F_OK) != 0) e(17);
359 
360   /* Test ToLongName and ToLongPath */
361   does_truncate = does_fs_truncate();
362   if (does_truncate) {
363   	if ((fd = creat(ToLongName, 0777)) != 0) e(18);
364   	if (close(fd) != 0) e(19);
365 	if (access(ToLongName, F_OK) != 0) e(20);
366   } else {
367   	if ((fd = creat(ToLongName, 0777)) != -1) e(21);
368 	if (errno != ENAMETOOLONG) e(22);
369   	(void) close(fd);	/* Just in case */
370 	if (access(ToLongName, F_OK) != -1) e(23);
371 	if (errno != ENAMETOOLONG) e(24);
372   }
373 
374   ToLongPath[PATH_MAX - 2] = '/';
375   ToLongPath[PATH_MAX - 1] = 'a';
376   if (access(ToLongPath, F_OK) != -1) e(27);
377   if (errno != ENAMETOOLONG) e(28);
378   ToLongPath[PATH_MAX - 1] = '/';
379 
380   /* Test empty strings. */
381   if (access("", F_OK) != -1) e(29);
382   if (errno != ENOENT) e(30);
383   System("rm -rf idonotexist");
384   if (access("idonotexist", F_OK) != -1) e(31);
385   if (errno != ENOENT) e(32);
386 
387   /* Test non directorys in prefix of path. */
388   if (access("/etc/passwd/dir/foo", F_OK) != -1) e(33);
389   if (errno != ENOTDIR) e(34);
390   System("rm -rf nodir; > nodir");
391   if (access("nodir/foo", F_OK) != -1) e(35);
392   if (errno != ENOTDIR) e(36);
393 
394   /* Test if invalid amode arguments are signaled. */
395   System("> allmod");
396   Chmod("allmod", 05777);
397   for (i = -1025; i < 1025; i++) {
398 	if ((mode_t) i != F_OK && ((mode_t) i & ~(R_OK | W_OK | X_OK)) != 0) {
399 		if (access("allmod", (mode_t) i) != -1) e(37);
400 		if (errno != EINVAL) e(38);
401 	} else
402 		if (access("allmod", (mode_t) i) != 0) e(39);
403   }
404 }
405 
406 void test33d()
407 {				/* Test access() flags. */
408 #define EXCLUDE(a,b)	(((a)^(b)) == ((a)|(b)))
409   subtest = 4;
410   System("rm -rf ../DIR_33/*");
411 
412   /* The test are rather strong, stronger that POSIX specifies. */
413   /* The should be OR able, this test tests if all the 1 bits */
414   /* Are in diferent places. This should be what one wants. */
415   if (!EXCLUDE(R_OK, W_OK | X_OK)) e(1);
416   if (!EXCLUDE(W_OK, R_OK | X_OK)) e(2);
417   if (!EXCLUDE(X_OK, R_OK | W_OK)) e(3);
418   if (F_OK == R_OK) e(4);
419   if (F_OK == W_OK) e(5);
420   if (F_OK == X_OK) e(6);
421   if (F_OK == (R_OK | W_OK)) e(7);
422   if (F_OK == (W_OK | X_OK)) e(8);
423   if (F_OK == (R_OK | X_OK)) e(9);
424   if (F_OK == (R_OK | W_OK | X_OK)) e(10);
425 }
426 
427 void test_access()
428 {				/* Test all [_r][_w][_x] files. */
429   if (!superuser) {
430 	/* Test normal access. */
431 	if (access("rwx", F_OK) != 0) e(11);
432 	if (access("rwx", R_OK) != 0) e(12);
433 	if (access("rwx", W_OK) != 0) e(13);
434 	if (access("rwx", X_OK) != 0) e(14);
435 	if (access("rwx", R_OK | W_OK) != 0) e(15);
436 	if (access("rwx", R_OK | X_OK) != 0) e(16);
437 	if (access("rwx", W_OK | X_OK) != 0) e(17);
438 	if (access("rwx", R_OK | W_OK | X_OK) != 0) e(18);
439 
440 	if (access("rw_", F_OK) != 0) e(19);
441 	if (access("rw_", R_OK) != 0) e(20);
442 	if (access("rw_", W_OK) != 0) e(21);
443 	if (access("rw_", X_OK) != -1) e(22);
444 	if (errno != EACCES) e(23);
445 	if (access("rw_", R_OK | W_OK) != 0) e(24);
446 	if (access("rw_", R_OK | X_OK) != -1) e(25);
447 	if (errno != EACCES) e(26);
448 	if (access("rw_", W_OK | X_OK) != -1) e(27);
449 	if (errno != EACCES) e(28);
450 	if (access("rw_", R_OK | W_OK | X_OK) != -1) e(29);
451 	if (errno != EACCES) e(30);
452 
453 	if (access("r_x", F_OK) != 0) e(31);
454 	if (access("r_x", R_OK) != 0) e(32);
455 	if (access("r_x", W_OK) != -1) e(33);
456 	if (errno != EACCES) e(34);
457 	if (access("r_x", X_OK) != 0) e(35);
458 	if (access("r_x", R_OK | W_OK) != -1) e(36);
459 	if (errno != EACCES) e(37);
460 	if (access("r_x", R_OK | X_OK) != 0) e(38);
461 	if (access("r_x", W_OK | X_OK) != -1) e(39);
462 	if (errno != EACCES) e(40);
463 	if (access("r_x", R_OK | W_OK | X_OK) != -1) e(41);
464 	if (errno != EACCES) e(42);
465 
466 	if (access("r__", F_OK) != 0) e(43);
467 	if (access("r__", R_OK) != 0) e(44);
468 	if (access("r__", W_OK) != -1) e(45);
469 	if (errno != EACCES) e(46);
470 	if (access("r__", X_OK) != -1) e(47);
471 	if (errno != EACCES) e(48);
472 	if (access("r__", R_OK | W_OK) != -1) e(49);
473 	if (errno != EACCES) e(50);
474 	if (access("r__", R_OK | X_OK) != -1) e(51);
475 	if (errno != EACCES) e(52);
476 	if (access("r__", W_OK | X_OK) != -1) e(53);
477 	if (errno != EACCES) e(54);
478 	if (access("r__", R_OK | W_OK | X_OK) != -1) e(55);
479 	if (errno != EACCES) e(56);
480 
481 	if (access("_wx", F_OK) != 0) e(57);
482 	if (access("_wx", R_OK) != -1) e(58);
483 	if (errno != EACCES) e(59);
484 	if (access("_wx", W_OK) != 0) e(60);
485 	if (access("_wx", X_OK) != 0) e(61);
486 	if (access("_wx", R_OK | W_OK) != -1) e(62);
487 	if (errno != EACCES) e(63);
488 	if (access("_wx", R_OK | X_OK) != -1) e(64);
489 	if (errno != EACCES) e(65);
490 	if (access("_wx", W_OK | X_OK) != 0) e(66);
491 	if (access("_wx", R_OK | W_OK | X_OK) != -1) e(67);
492 	if (errno != EACCES) e(68);
493 
494 	if (access("_w_", F_OK) != 0) e(69);
495 	if (access("_w_", R_OK) != -1) e(70);
496 	if (errno != EACCES) e(71);
497 	if (access("_w_", W_OK) != 0) e(72);
498 	if (access("_w_", X_OK) != -1) e(73);
499 	if (errno != EACCES) e(74);
500 	if (access("_w_", R_OK | W_OK) != -1) e(75);
501 	if (errno != EACCES) e(76);
502 	if (access("_w_", R_OK | X_OK) != -1) e(77);
503 	if (errno != EACCES) e(78);
504 	if (access("_w_", W_OK | X_OK) != -1) e(79);
505 	if (errno != EACCES) e(80);
506 	if (access("_w_", R_OK | W_OK | X_OK) != -1) e(81);
507 	if (errno != EACCES) e(82);
508 
509 	if (access("__x", F_OK) != 0) e(83);
510 	if (access("__x", R_OK) != -1) e(84);
511 	if (errno != EACCES) e(85);
512 	if (access("__x", W_OK) != -1) e(86);
513 	if (errno != EACCES) e(87);
514 	if (access("__x", X_OK) != 0) e(88);
515 	if (access("__x", R_OK | W_OK) != -1) e(89);
516 	if (errno != EACCES) e(90);
517 	if (access("__x", R_OK | X_OK) != -1) e(91);
518 	if (errno != EACCES) e(92);
519 	if (access("__x", W_OK | X_OK) != -1) e(93);
520 	if (errno != EACCES) e(94);
521 	if (access("__x", R_OK | W_OK | X_OK) != -1) e(95);
522 	if (errno != EACCES) e(96);
523 
524 	if (access("___", F_OK) != 0) e(97);
525 	if (access("___", R_OK) != -1) e(98);
526 	if (errno != EACCES) e(99);
527 	if (access("___", W_OK) != -1) e(100);
528 	if (errno != EACCES) e(101);
529 	if (access("___", X_OK) != -1) e(102);
530 	if (errno != EACCES) e(103);
531 	if (access("___", R_OK | W_OK) != -1) e(104);
532 	if (errno != EACCES) e(105);
533 	if (access("___", R_OK | X_OK) != -1) e(106);
534 	if (errno != EACCES) e(107);
535 	if (access("___", W_OK | X_OK) != -1) e(108);
536 	if (errno != EACCES) e(109);
537 	if (access("___", R_OK | W_OK | X_OK) != -1) e(110);
538 	if (errno != EACCES) e(111);
539   }
540   if (superuser) {
541 	/* Test root access don't test X_OK on [_r][_w]_ files. */
542 	if (access("rwx", F_OK) != 0) e(112);
543 	if (access("rwx", R_OK) != 0) e(113);
544 	if (access("rwx", W_OK) != 0) e(114);
545 	if (access("rwx", X_OK) != 0) e(115);
546 	if (access("rwx", R_OK | W_OK) != 0) e(116);
547 	if (access("rwx", R_OK | X_OK) != 0) e(117);
548 	if (access("rwx", W_OK | X_OK) != 0) e(118);
549 	if (access("rwx", R_OK | W_OK | X_OK) != 0) e(119);
550 
551 	if (access("rw_", F_OK) != 0) e(120);
552 	if (access("rw_", R_OK) != 0) e(121);
553 	if (access("rw_", W_OK) != 0) e(122);
554 	if (access("rw_", R_OK | W_OK) != 0) e(123);
555 
556 	if (access("r_x", F_OK) != 0) e(124);
557 	if (access("r_x", R_OK) != 0) e(125);
558 	if (access("r_x", W_OK) != 0) e(126);
559 	if (access("r_x", X_OK) != 0) e(127);
560 	if (access("r_x", R_OK | W_OK) != 0) e(128);
561 	if (access("r_x", R_OK | X_OK) != 0) e(129);
562 	if (access("r_x", W_OK | X_OK) != 0) e(130);
563 	if (access("r_x", R_OK | W_OK | X_OK) != 0) e(131);
564 
565 	if (access("r__", F_OK) != 0) e(132);
566 	if (access("r__", R_OK) != 0) e(133);
567 	if (access("r__", W_OK) != 0) e(134);
568 	if (access("r__", R_OK | W_OK) != 0) e(135);
569 
570 	if (access("_wx", F_OK) != 0) e(136);
571 	if (access("_wx", R_OK) != 0) e(137);
572 	if (access("_wx", W_OK) != 0) e(138);
573 	if (access("_wx", X_OK) != 0) e(139);
574 	if (access("_wx", R_OK | W_OK) != 0) e(140);
575 	if (access("_wx", R_OK | X_OK) != 0) e(141);
576 	if (access("_wx", W_OK | X_OK) != 0) e(142);
577 	if (access("_wx", R_OK | W_OK | X_OK) != 0) e(143);
578 
579 	if (access("_w_", F_OK) != 0) e(144);
580 	if (access("_w_", R_OK) != 0) e(145);
581 	if (access("_w_", W_OK) != 0) e(146);
582 	if (access("_w_", R_OK | W_OK) != 0) e(147);
583 
584 	if (access("__x", F_OK) != 0) e(148);
585 	if (access("__x", R_OK) != 0) e(149);
586 	if (access("__x", W_OK) != 0) e(150);
587 	if (access("__x", X_OK) != 0) e(151);
588 	if (access("__x", R_OK | W_OK) != 0) e(152);
589 	if (access("__x", R_OK | X_OK) != 0) e(153);
590 	if (access("__x", W_OK | X_OK) != 0) e(154);
591 	if (access("__x", R_OK | W_OK | X_OK) != 0) e(155);
592 
593 	if (access("___", F_OK) != 0) e(156);
594 	if (access("___", R_OK) != 0) e(157);
595 	if (access("___", W_OK) != 0) e(158);
596 	if (access("___", R_OK | W_OK) != 0) e(159);
597   }
598 }
599 
600 void makelongnames()
601 {
602   register int i;
603   int max_name_length;
604 
605   max_name_length = name_max("."); /* Aka NAME_MAX, but not every FS supports
606 				    * the same length, hence runtime check */
607   MaxName = malloc(max_name_length + 1);
608   ToLongName = malloc(max_name_length + 1 + 1); /* Name of maximum +1 length */
609   memset(MaxName, 'a', max_name_length);
610   MaxName[max_name_length] = '\0';
611 
612   for (i = 0; i < PATH_MAX - 1; i++) {	/* idem path */
613 	MaxPath[i++] = '.';
614 	MaxPath[i] = '/';
615   }
616   MaxPath[PATH_MAX - 1] = '\0';
617 
618   strcpy(ToLongName, MaxName);	/* copy them Max to ToLong */
619   strcpy(ToLongPath, MaxPath);
620 
621   ToLongName[max_name_length] = 'a';
622   ToLongName[max_name_length+1] = '\0';/* extend ToLongName by one too many */
623   ToLongPath[PATH_MAX - 1] = '/';
624   ToLongPath[PATH_MAX] = '\0';	/* inc ToLongPath by one */
625 }
626