1 /* 2 * 3 * Copyright (c) International Business Machines Corp., 2002 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13 * the GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18 */ 19 20 /* 10/31/2002 Port to LTP robbiew (at) us.ibm.com */ 21 /* 06/30/2001 Port to Linux nsharoff (at) us.ibm.com */ 22 23 /* 24 * NAME 25 * nftw64.c - Test of nftw64() 26 */ 27 28 #include <pwd.h> 29 #include "nftw64.h" 30 31 void setup(void); 32 void blenter(void); 33 void blexit(void); 34 void anyfail(void); 35 36 char progname[] = "nftw64.c"; 37 38 /** LTP Port **/ 39 #define FAILED 0 40 #define PASSED 1 41 42 int local_flag = PASSED; 43 int block_number; 44 45 FILE *temp; 46 char *TCID = "nftw6401"; 47 int TST_TOTAL = 10; 48 49 struct passwd *ltpuser; /* password struct for ltpuser */ 50 /**************/ 51 52 /* Used for error return for some library routines */ 53 int s2; 54 55 /* error messages formatted here. */ 56 char ebuf[ERR_BUF_SIZ]; 57 58 /* 59 * Local data declarations. 60 */ 61 char *dirlist[NDIRLISTENTS]; 62 63 int visit; 64 int next_fd[4]; 65 66 pathdata pathdat[] = { 67 { 68 "./tmp/data", 69 S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH, 70 DIR, ""}, { 71 "./tmp/byebye", 72 S_IRWXU | S_IRWXG | S_IROTH | S_IWOTH, 73 REG, "byebye!\n"}, { 74 "./tmp/data/d333", 75 S_IRWXU | S_IRWXG | S_IRWXO, 76 DIR, ""}, { 77 "./tmp/data/d666", 78 S_IRWXU | S_IRWXG | S_IRWXO, 79 DIR, ""}, { 80 "./tmp/data/d777", 81 S_IRWXU | S_IRWXG 82 | S_IRWXO, 83 DIR, ""}, { 84 "./tmp/data/dirg", 85 S_IRWXU 86 | 87 S_IRWXG 88 | 89 S_IROTH 90 | 91 S_IWOTH, 92 DIR, 93 ""}, { 94 "./tmp/data/dirh", 95 S_IRWXU 96 | 97 S_IRWXG 98 | 99 S_IROTH 100 | 101 S_IWOTH, 102 DIR, 103 ""}, 104 { 105 "./tmp/data/dirl", 106 S_IRWXU | S_IRWXG | S_IROTH | S_IWOTH, 107 DIR, ""}, { 108 "./tmp/data/d333/errs", 109 S_IRWXU | S_IRWXG | S_IROTH | S_IWOTH, 110 REG, "Do not eat yellow snow!\n"}, { 111 "./tmp/data/d666/errs", 112 S_IRWXU | S_IRWXG | 113 S_IROTH | S_IWOTH, 114 REG, 115 "Do not eat yellow snow!\n"}, 116 { 117 "./tmp/data/d777/errs", 118 S_IRWXU | S_IRWXG | S_IROTH | S_IWOTH, 119 REG, "Do not eat yellow snow!\n"}, { 120 "./tmp/data/dirg/filebad", 121 S_IRUSR | S_IWUSR | S_IRGRP | 122 S_IROTH, 123 REG, ""}, { 124 "./tmp/data/dirg/fileok", 125 S_IRUSR | S_IWUSR | 126 S_IRGRP | S_IROTH, 127 REG, ""}, { 128 "./tmp/data/dirg/symlink", 129 S_IRWXU | 130 S_IRWXG | 131 S_IRWXO, 132 SYM, 133 "../../byebye"}, 134 { 135 "./tmp/data/dirg/dir_left.1", 136 S_IRWXU | S_IRWXG | S_IROTH | S_IWOTH, 137 DIR, ""}, { 138 "./tmp/data/dirg/dir_left.1/dir_left.2", 139 S_IRWXU | S_IRWXG | S_IROTH | S_IWOTH, 140 DIR, ""}, { 141 "./tmp/data/dirg/dir_right.1", 142 S_IRWXU | S_IRWXG | S_IRWXO, 143 DIR, ""}, { 144 "./tmp/data/dirg/dir_left.1/dir_left.2/left.3", 145 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP 146 | S_IROTH, 147 REG, ""}, { 148 "./tmp/data/dirh/dir_left.1", 149 S_IRWXU | S_IRWXG | S_IROTH 150 | S_IWOTH, 151 DIR, ""}, { 152 "./tmp/data/dirh/dir_right.1", 153 S_IRWXU | 154 S_IRWXG | 155 S_IROTH | 156 S_IWOTH, 157 DIR, ""}, { 158 "./tmp/data/dirh/dir_left.1/dir_left.2", 159 S_IRWXU 160 | 161 S_IRWXG 162 | 163 S_IROTH 164 | 165 S_IWOTH, 166 DIR, 167 ""}, 168 { 169 "./tmp/data/dirh/dir_left.1/dir_left.2/left.3", 170 S_IRWXU | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, 171 REG, "left leaf\n"}, { 172 "./tmp/data/dirh/dir_right.1/dir_right.2", 173 S_IRWXU | S_IRWXG | S_IROTH | S_IWOTH, 174 DIR, ""}, { 175 "./tmp/data/dirh/dir_right.1/dir_right.2/right.3", 176 S_IRWXU | S_IRGRP | S_IWGRP | S_IROTH 177 | S_IWOTH, 178 REG, "right leaf\n"}, { 179 "./tmp/data/dirl/dir_left.1", 180 S_IRWXU | 181 S_IRWXG | 182 S_IROTH | 183 S_IWOTH, 184 DIR, ""}, { 185 "./tmp/data/dirl/dir_left.1/dir_left.2", 186 S_IRWXU 187 | 188 S_IRWXG 189 | 190 S_IROTH 191 | 192 S_IWOTH, 193 DIR, 194 ""}, 195 { 196 "./tmp/data/dirl/dir_left.1/dir_left.2/left.3", 197 0, 198 SYM, "../../../dirh"}, { 199 "./tmp/data/dirl/dir_right.1", 200 S_IRWXU | S_IRWXG | S_IROTH | S_IWOTH, 201 DIR, ""}, { 202 "./tmp/data/dirl/dir_right.1/dir_right.2", 203 S_IRWXU | S_IRWXG | S_IROTH | 204 S_IWOTH, 205 DIR, ""}, { 206 "./tmp/data/dirl/dir_right.1/dir_right.2/right.3", 207 0, 208 SYM, "../dir_right.2"}, { 209 "./tmp/data/loop", 210 0, 211 SYM, 212 "./loop"} 213 }; 214 215 char *goodlist[] = { 216 "/dirh", 217 "/dirh/dir_left.1", 218 "/dirh/dir_right.1", 219 "/dirh/dir_left.1/dir_left.2", 220 "/dirh/dir_right.1/dir_right.2", 221 "/dirh/dir_left.1/dir_left.2/left.3", 222 "/dirh/dir_right.1/dir_right.2/right.3" 223 }; 224 225 struct list badlist[] = { 226 {"/dirg", FTW_D}, 227 {"/dirg/dir_left.1", FTW_D}, 228 /* not FTW_NS in following since stat can't fail if file exists */ 229 {"/dirg/filebad", FTW_F}, 230 {"/dirg/fileok", FTW_F}, 231 {"/dirg/symlink", FTW_SL}, 232 {"/dirg/dir_right.1", FTW_DNR}, 233 {"/dirg/dir_left.1/dir_left.2", FTW_D}, 234 {"/dirg/dir_left.1/dir_left.2/left.3", FTW_F}, 235 }; 236 237 struct list mnem[] = { 238 {"FTW_F", FTW_F}, 239 {"FTW_D", FTW_D}, 240 {"FTW_DNR", FTW_DNR}, 241 {"FTW_NS", FTW_NS}, 242 {"FTW_SL", FTW_SL}, 243 {"FTW_DP", FTW_DP}, 244 {"FTW_SLN", FTW_SLN}, 245 }; 246 247 int npathdats, ngoods, nbads, nmnem; 248 249 /*--------------------------------------------------------------*/ 250 int main(void) 251 { 252 setup(); /* temp file is now open */ 253 254 npathdats = ARRAY_SIZE(pathdat); 255 ngoods = ARRAY_SIZE(goodlist); 256 nbads = ARRAY_SIZE(badlist); 257 nmnem = ARRAY_SIZE(mnem); 258 259 setup_path(); 260 261 /*---------------- ENTER BLOCK 0 --------------------------------*/ 262 blenter(); 263 #ifdef DEBUG 264 fprintf(temp, 265 "A call to int nftw64(const char *path, int (*fn)(const\n"); 266 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 267 fprintf(temp, "depth, int flags) shall recursively descend the\n"); 268 fprintf(temp, "directory hierarchy rooted in path until it has\n"); 269 fprintf(temp, 270 "traversed the whole tree, calling the function fn for\n"); 271 fprintf(temp, "each object in the directory tree, and return 0.\n\n"); 272 #endif 273 test1A(); 274 blexit(); 275 /*--------------- EXIT BLOCK 0 ---------------------------------*/ 276 277 /*---------------- ENTER BLOCK 1 --------------------------------*/ 278 blenter(); 279 #ifdef DEBUG 280 fprintf(temp, 281 "A call to int nftw64(const char *path, int (*fn)(const\n"); 282 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 283 fprintf(temp, "depth, int flags) when flags contains FTW_PHYS shall\n"); 284 fprintf(temp, "not traverse symbolic links.\n\n"); 285 #endif 286 test2A(); 287 blexit(); 288 /*--------------- EXIT BLOCK 1 ---------------------------------*/ 289 290 /*---------------- ENTER BLOCK 2 --------------------------------*/ 291 blenter(); 292 #ifdef DEBUG 293 fprintf(temp, 294 "A call to int nftw64(const char *path, int (*fn)(const\n"); 295 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 296 fprintf(temp, 297 "depth, int flags) when flags does not contain FTW_PHYS\n"); 298 fprintf(temp, 299 "shall follow links instead of reporting them and shall\n"); 300 fprintf(temp, "not report the same file twice.\n\n"); 301 #endif 302 test3A(); 303 blexit(); 304 /*--------------- EXIT BLOCK 2 ---------------------------------*/ 305 306 /*---------------- ENTER BLOCK 3 --------------------------------*/ 307 blenter(); 308 #ifdef DEBUG 309 fprintf(temp, 310 "A call to int nftw64(const char *path, int (*fn)(const\n"); 311 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 312 fprintf(temp, 313 "depth, int flags) when flags contains FTW_DEPTH shall\n"); 314 fprintf(temp, "report all files in a directory before reporting the\n"); 315 fprintf(temp, "directory.\n\n"); 316 #endif 317 test4A(); 318 blexit(); 319 /*--------------- EXIT BLOCK 3 ---------------------------------*/ 320 321 /*---------------- ENTER BLOCK 4 --------------------------------*/ 322 blenter(); 323 #ifdef DEBUG 324 fprintf(temp, 325 "A call to int nftw64(const char *path, int (*fn)(const\n"); 326 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 327 fprintf(temp, "depth, int flags) when flags does not contain\n"); 328 fprintf(temp, "FTW_DEPTH shall report a directory before reporting\n"); 329 fprintf(temp, "the files in that directory.\n\n"); 330 #endif 331 test5A(); 332 blexit(); 333 /*--------------- EXIT BLOCK 4 ---------------------------------*/ 334 335 /*---------------- ENTER BLOCK 5 --------------------------------*/ 336 blenter(); 337 #ifdef DEBUG 338 fprintf(temp, 339 "A call to int nftw64(const char *path, int (*fn)(const\n"); 340 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 341 fprintf(temp, 342 "depth, int flags) when flags contains FTW_CHDIR shall\n"); 343 fprintf(temp, 344 "change the current working directory to each directory\n"); 345 fprintf(temp, "as it reports files in that directory.\n\n"); 346 #endif 347 test6A(); 348 blexit(); 349 /*--------------- EXIT BLOCK 5 ---------------------------------*/ 350 351 /*---------------- ENTER BLOCK 6 --------------------------------*/ 352 blenter(); 353 #ifdef DEBUG 354 fprintf(temp, 355 "A call to int nftw64(const char *path, int (*fn)(const\n"); 356 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 357 fprintf(temp, "depth, int flags) shall pass the path-name of the\n"); 358 fprintf(temp, "current object as the first argument of the function\n"); 359 fprintf(temp, "fn.\n\n"); 360 #endif 361 test7A(); 362 blexit(); 363 /*--------------- EXIT BLOCK 6 ---------------------------------*/ 364 365 /*---------------- ENTER BLOCK 7 --------------------------------*/ 366 blenter(); 367 #ifdef DEBUG 368 fprintf(temp, 369 "A call to int nftw64(const char *path, int (*fn)(const\n"); 370 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 371 fprintf(temp, "depth, int flags) shall pass a pointer to a stat\n"); 372 fprintf(temp, "structure containing information about the current\n"); 373 fprintf(temp, "object as the second argument to fn.\n\n"); 374 #endif 375 test8A(); 376 blexit(); 377 /*--------------- EXIT BLOCK 7 ---------------------------------*/ 378 379 /*---------------- ENTER BLOCK 8 --------------------------------*/ 380 blenter(); 381 #ifdef DEBUG 382 fprintf(temp, 383 "A call to int nftw64(const char *path, int (*fn)(const\n"); 384 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 385 fprintf(temp, "depth, int flags) shall pass FTW_F as the third\n"); 386 fprintf(temp, 387 "argument of the function fn when the object is a file.\n\n"); 388 #endif 389 test9A(); 390 blexit(); 391 /*--------------- EXIT BLOCK 8 ---------------------------------*/ 392 393 /*---------------- ENTER BLOCK 9 --------------------------------*/ 394 blenter(); 395 #ifdef DEBUG 396 fprintf(temp, 397 "A call to int nftw64(const char *path, int (*fn)(const\n"); 398 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 399 fprintf(temp, "depth, int flags) shall pass FTW_D as the third\n"); 400 fprintf(temp, "argument of the function fn when the object is a\n"); 401 fprintf(temp, "directory.\n\n"); 402 #endif 403 test10A(); 404 blexit(); 405 /*--------------- EXIT BLOCK 9 ---------------------------------*/ 406 407 /*---------------- ENTER BLOCK 10 --------------------------------*/ 408 blenter(); 409 #ifdef DEBUG 410 fprintf(temp, 411 "A call to int nftw64(const char *path, int (*fn)(const\n"); 412 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 413 fprintf(temp, "depth, int flags) shall pass FTW_DP as the third\n"); 414 fprintf(temp, "argument of the function fn when the object is a\n"); 415 fprintf(temp, "directory and subdirectories have been visited.\n\n"); 416 #endif 417 test11A(); 418 blexit(); 419 /*--------------- EXIT BLOCK 10 ---------------------------------*/ 420 421 /*---------------- ENTER BLOCK 11 --------------------------------*/ 422 blenter(); 423 #ifdef DEBUG 424 fprintf(temp, 425 "A call to int nftw64(const char *path, int (*fn)(const\n"); 426 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 427 fprintf(temp, "depth, int flags) shall pass FTW_SL as the third\n"); 428 fprintf(temp, "argument of the function fn when the object is a\n"); 429 fprintf(temp, "symbolic link.\n\n"); 430 #endif 431 test12A(); 432 blexit(); 433 /*--------------- EXIT BLOCK 11 ---------------------------------*/ 434 435 /*---------------- ENTER BLOCK 12 --------------------------------*/ 436 blenter(); 437 #ifdef DEBUG 438 fprintf(temp, 439 "A call to int nftw64(const char *path, int (*fn)(const\n"); 440 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 441 fprintf(temp, "depth, int flags) shall pass FTW_SLN as the third\n"); 442 fprintf(temp, "argument of the function fn when the object is a\n"); 443 fprintf(temp, "symbolic link that does not name an existing file.\n\n"); 444 #endif 445 test13A(); 446 blexit(); 447 /*--------------- EXIT BLOCK 12 ---------------------------------*/ 448 449 /*---------------- ENTER BLOCK 13 --------------------------------*/ 450 blenter(); 451 #ifdef DEBUG 452 fprintf(temp, 453 "A call to int nftw64(const char *path, int (*fn)(const\n"); 454 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 455 fprintf(temp, "depth, int flags) shall pass FTW_DNR as the third\n"); 456 fprintf(temp, "argument of the function fn when the object is a\n"); 457 fprintf(temp, "directory that cannot be read.\n\n"); 458 #endif 459 test14A(); 460 blexit(); 461 /*--------------- EXIT BLOCK 13 ---------------------------------*/ 462 463 /*---------------- ENTER BLOCK 14 --------------------------------*/ 464 blenter(); 465 #ifdef DEBUG 466 fprintf(temp, 467 "A call to int nftw64(const char *path, int (*fn)(const\n"); 468 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 469 fprintf(temp, "depth, int flags) shall pass FTW_NS as the third\n"); 470 fprintf(temp, 471 "argument of the function fn when stat() failed on the\n"); 472 fprintf(temp, "object because of lack of appropriate permission.\n\n"); 473 #endif 474 test15A(); 475 blexit(); 476 /*--------------- EXIT BLOCK 14 ---------------------------------*/ 477 478 /*---------------- ENTER BLOCK 15 --------------------------------*/ 479 blenter(); 480 #ifdef DEBUG 481 fprintf(temp, 482 "A call to int nftw64(const char *path, int (*fn)(const\n"); 483 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 484 fprintf(temp, "depth, int flags) shall pass a structure which\n"); 485 fprintf(temp, "contains the offset into the pathname of the object\n"); 486 fprintf(temp, "and the depth relative to the root of the walk\n"); 487 fprintf(temp, 488 "starting from 0 as the fourth argument of the function\n"); 489 fprintf(temp, "fn.\n\n"); 490 #endif 491 test16A(); 492 blexit(); 493 /*--------------- EXIT BLOCK 15 ---------------------------------*/ 494 495 /*---------------- ENTER BLOCK 16 --------------------------------*/ 496 blenter(); 497 #ifdef DEBUG 498 fprintf(temp, 499 "A call to int nftw64(const char *path, int (*fn)(const\n"); 500 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 501 fprintf(temp, "depth, int flags) shall pass FTW_SL as the third\n"); 502 fprintf(temp, "argument to the function fn if and only if the\n"); 503 fprintf(temp, "FTW_PHYS flag is included in flags.\n\n"); 504 #endif 505 test17A(); 506 blexit(); 507 /*--------------- EXIT BLOCK 16 ---------------------------------*/ 508 509 /*---------------- ENTER BLOCK 17 --------------------------------*/ 510 blenter(); 511 #ifdef DEBUG 512 fprintf(temp, 513 "A call to int nftw64(const char *path, int (*fn)(const\n"); 514 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 515 fprintf(temp, "depth, int flags) shall pass FTW_SLN as the third\n"); 516 fprintf(temp, "argument to the function fn if and only if the\n"); 517 fprintf(temp, "FTW_PHYS flag is not included in flags.\n\n"); 518 #endif 519 test18A(); 520 blexit(); 521 /*--------------- EXIT BLOCK 17 ---------------------------------*/ 522 523 /*---------------- ENTER BLOCK 18 --------------------------------*/ 524 blenter(); 525 #ifdef DEBUG 526 fprintf(temp, "On a call to int nftw64(const char *path, int\n"); 527 fprintf(temp, "(*fn)(const char *, const struct stat *, int, struct\n"); 528 fprintf(temp, 529 "FTW *), int depth, int flags) when the third argument\n"); 530 fprintf(temp, "passed to the function fn is FTW_DNR then the\n"); 531 fprintf(temp, 532 "descendants of the directory shall not be processed.\n\n"); 533 #endif 534 test19A(); 535 blexit(); 536 /*--------------- EXIT BLOCK 18 ---------------------------------*/ 537 538 /*---------------- ENTER BLOCK 19 --------------------------------*/ 539 blenter(); 540 #ifdef DEBUG 541 fprintf(temp, 542 "A call to int nftw64(const char *path, int (*fn)(const\n"); 543 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 544 fprintf(temp, 545 "depth, int flags) shall close any file descriptors or\n"); 546 fprintf(temp, 547 "directory streams used to traverse the directory tree.\n\n"); 548 #endif 549 test20A(); 550 blexit(); 551 /*--------------- EXIT BLOCK 19 ---------------------------------*/ 552 553 /*---------------- ENTER BLOCK 20 --------------------------------*/ 554 blenter(); 555 #ifdef DEBUG 556 fprintf(temp, "On a call to int nftw64(const char *path, int\n"); 557 fprintf(temp, "(*fn)(const char *, const struct stat *, int, struct\n"); 558 fprintf(temp, "FTW *), int depth, int flags) depth shall be the\n"); 559 fprintf(temp, 560 "maximum number of file descriptors used for the search.\n\n"); 561 #endif 562 test21A(); 563 blexit(); 564 /*--------------- EXIT BLOCK 20 ---------------------------------*/ 565 566 /*---------------- ENTER BLOCK 21 --------------------------------*/ 567 blenter(); 568 #ifdef DEBUG 569 fprintf(temp, 570 "A call to int nftw64(const char *path, int (*fn)(const\n"); 571 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 572 fprintf(temp, "depth, int flags) shall use at most one file\n"); 573 fprintf(temp, "descriptor for each directory level.\n\n"); 574 #endif 575 test22A(); 576 blexit(); 577 /*--------------- EXIT BLOCK 21 ---------------------------------*/ 578 579 /*---------------- ENTER BLOCK 22 --------------------------------*/ 580 blenter(); 581 #ifdef DEBUG 582 fprintf(temp, 583 "A call to int nftw64(const char *path, int (*fn)(const\n"); 584 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n"); 585 fprintf(temp, "depth, int flags) when the function fn returns a\n"); 586 fprintf(temp, "non-zero value shall stop and return the value\n"); 587 fprintf(temp, "returned by fn.\n\n"); 588 #endif 589 test23A(); 590 blexit(); 591 /*--------------- EXIT BLOCK 22 ---------------------------------*/ 592 593 /*---------------- ENTER BLOCK 23 --------------------------------*/ 594 blenter(); 595 #ifdef DEBUG 596 fprintf(temp, "ENAMETOOLONG in errno and return -1 on a call to int\n"); 597 fprintf(temp, 598 "nftw64(const char *path, int (*fn)(const char *, const\n"); 599 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n"); 600 fprintf(temp, "flags) when the length of path exceeds PATH_MAX.\n\n"); 601 #endif 602 test24A(); 603 blexit(); 604 /*--------------- EXIT BLOCK 23 ---------------------------------*/ 605 606 /*---------------- ENTER BLOCK 24 --------------------------------*/ 607 blenter(); 608 #ifdef DEBUG 609 fprintf(temp, "ENAMETOOLONG in errno and return -1 on a call to int\n"); 610 fprintf(temp, 611 "nftw64(const char *path, int (*fn)(const char *, const\n"); 612 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n"); 613 fprintf(temp, "flags) when a component of path exceeds NAME_MAX.\n\n"); 614 #endif 615 test25A(); 616 blexit(); 617 /*--------------- EXIT BLOCK 24 ---------------------------------*/ 618 619 /*---------------- ENTER BLOCK 25 --------------------------------*/ 620 blenter(); 621 #ifdef DEBUG 622 fprintf(temp, "ENOENT in errno and return -1 on a call to int\n"); 623 fprintf(temp, 624 "nftw64(const char *path, int (*fn)(const char *, const\n"); 625 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n"); 626 fprintf(temp, 627 "flags) when path points to a file which does not exist.\n\n"); 628 #endif 629 test26A(); 630 blexit(); 631 /*--------------- EXIT BLOCK 25 ---------------------------------*/ 632 633 /*---------------- ENTER BLOCK 26 --------------------------------*/ 634 blenter(); 635 #ifdef DEBUG 636 fprintf(temp, "ENOENT in errno and return -1 on a call to int\n"); 637 fprintf(temp, 638 "nftw64(const char *path, int (*fn)(const char *, const\n"); 639 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n"); 640 fprintf(temp, "flags) when path points to an empty string.\n\n"); 641 #endif 642 test27A(); 643 blexit(); 644 /*--------------- EXIT BLOCK 26 ---------------------------------*/ 645 646 /*---------------- ENTER BLOCK 27 --------------------------------*/ 647 blenter(); 648 #ifdef DEBUG 649 fprintf(temp, "ENOTDIR in errno and return -1 on a call to int\n"); 650 fprintf(temp, 651 "nftw64(const char *path, int (*fn)(const char *, const\n"); 652 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n"); 653 fprintf(temp, "flags) when path is not a directory.\n\n"); 654 #endif 655 test28A(); 656 blexit(); 657 /*--------------- EXIT BLOCK 27 ---------------------------------*/ 658 659 /*---------------- ENTER BLOCK 28 --------------------------------*/ 660 blenter(); 661 #ifdef DEBUG 662 fprintf(temp, "EACCES in errno and return -1 on a call to int\n"); 663 fprintf(temp, 664 "nftw64(const char *path, int (*fn)(const char *, const\n"); 665 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n"); 666 fprintf(temp, "flags) when search permission is denied for any\n"); 667 fprintf(temp, "component of path.\n\n"); 668 #endif 669 test29A(); 670 blexit(); 671 /*--------------- EXIT BLOCK 28 ---------------------------------*/ 672 673 /*---------------- ENTER BLOCK 29 --------------------------------*/ 674 blenter(); 675 #ifdef DEBUG 676 fprintf(temp, "EACCES in errno and return -1 on a call to int\n"); 677 fprintf(temp, 678 "nftw64(const char *path, int (*fn)(const char *, const\n"); 679 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n"); 680 fprintf(temp, "flags) when read permission is denied for path.\n\n"); 681 #endif 682 test30A(); 683 blexit(); 684 /*--------------- EXIT BLOCK 29 ---------------------------------*/ 685 686 cleanup_function(); 687 688 anyfail(); /* THIS CALL DOES NOT RETURN - EXITS!! */ 689 690 tst_exit(); 691 } 692 693 /*--------------------------------------------------------------*/ 694 695 /** LTP Port **/ 696 /* 697 * setup 698 * 699 * Do set up - here its a dummy function 700 */ 701 void setup(void) 702 { 703 /* Direct debug output to stderr */ 704 temp = stderr; 705 706 /* Get the user id "nobody" */ 707 if ((ltpuser = getpwnam("nobody")) == NULL) { 708 perror("change_owner: nobody not found in /etc/passwd"); 709 exit(1); 710 } 711 712 /* Switch to "nobody" */ 713 setuid(ltpuser->pw_uid); 714 715 tst_tmpdir(); 716 } 717 718 /* 719 * Function: blenter() 720 * 721 * Description: Print message on entering a new block 722 */ 723 void blenter(void) 724 { 725 local_flag = PASSED; 726 return; 727 } 728 729 /* 730 * Function: blexit() 731 * 732 * Description: This function will exit a block, a block may be a logical unit 733 * of a test. It will report the status if the test ie fail or 734 * pass. 735 */ 736 void blexit(void) 737 { 738 (local_flag == PASSED) ? tst_resm(TPASS, "Test block %d", block_number) 739 : tst_resm(TFAIL, "Test block %d", block_number); 740 block_number++; 741 return; 742 } 743 744 /* 745 * 746 * Function: anyfail() 747 * 748 * Description: Exit a test. 749 */ 750 void anyfail(void) 751 { 752 (local_flag == FAILED) ? tst_resm(TFAIL, "Test failed") 753 : tst_resm(TPASS, "Test passed"); 754 tst_rmdir(); 755 tst_exit(); 756 } 757 758 /**************/ 759