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