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