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