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@us.ibm.com */
21 /* 06/30/2001 Port to Linux nsharoff@us.ibm.com */
22
23 /*
24 * NAME
25 * nftw.c - Test of nftw()
26 */
27
28 #include <pwd.h>
29 #include "nftw.h"
30
31 void setup(void);
32 void blenter(void);
33 void blexit(void);
34 void anyfail(void);
35
36 char progname[] = "nftw.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 = "nftw01";
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 #ifndef __linux__
244 /* How do we define __USE_XOPEN_EXTENDED ? Following depends on that */
245 {"FTW_DP", FTW_DP},
246 {"FTW_SLN", FTW_SLN},
247 #endif
248 };
249
250 int npathdats, ngoods, nbads, nmnem;
251
252 /*--------------------------------------------------------------*/
main(void)253 int main(void)
254 {
255 setup(); /* temp file is now open */
256
257 npathdats = ARRAY_SIZE(pathdat);
258 ngoods = ARRAY_SIZE(goodlist);
259 nbads = ARRAY_SIZE(badlist);
260 nmnem = ARRAY_SIZE(mnem);
261
262 setup_path();
263
264 /*---------------- ENTER BLOCK 0 --------------------------------*/
265 blenter();
266 #ifdef DEBUG
267 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
268 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
269 fprintf(temp, "depth, int flags) shall recursively descend the\n");
270 fprintf(temp, "directory hierarchy rooted in path until it has\n");
271 fprintf(temp,
272 "traversed the whole tree, calling the function fn for\n");
273 fprintf(temp, "each object in the directory tree, and return 0.\n\n");
274 #endif
275 test1A();
276 blexit();
277 /*--------------- EXIT BLOCK 0 ---------------------------------*/
278
279 /*---------------- ENTER BLOCK 1 --------------------------------*/
280 blenter();
281 #ifdef DEBUG
282 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
283 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
284 fprintf(temp, "depth, int flags) when flags contains FTW_PHYS shall\n");
285 fprintf(temp, "not traverse symbolic links.\n\n");
286 #endif
287 test2A();
288 blexit();
289 /*--------------- EXIT BLOCK 1 ---------------------------------*/
290
291 /*---------------- ENTER BLOCK 2 --------------------------------*/
292 blenter();
293 #ifdef DEBUG
294 fprintf(temp, "A call to int nftw(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, "A call to int nftw(const char *path, int (*fn)(const\n");
310 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
311 fprintf(temp,
312 "depth, int flags) when flags contains FTW_DEPTH shall\n");
313 fprintf(temp, "report all files in a directory before reporting the\n");
314 fprintf(temp, "directory.\n\n");
315 #endif
316 test4A();
317 blexit();
318 /*--------------- EXIT BLOCK 3 ---------------------------------*/
319
320 /*---------------- ENTER BLOCK 4 --------------------------------*/
321 blenter();
322 #ifdef DEBUG
323 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
324 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
325 fprintf(temp, "depth, int flags) when flags does not contain\n");
326 fprintf(temp, "FTW_DEPTH shall report a directory before reporting\n");
327 fprintf(temp, "the files in that directory.\n\n");
328 #endif
329 test5A();
330 blexit();
331 /*--------------- EXIT BLOCK 4 ---------------------------------*/
332
333 /*---------------- ENTER BLOCK 5 --------------------------------*/
334 blenter();
335 #ifdef DEBUG
336 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
337 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
338 fprintf(temp,
339 "depth, int flags) when flags contains FTW_CHDIR shall\n");
340 fprintf(temp,
341 "change the current working directory to each directory\n");
342 fprintf(temp, "as it reports files in that directory.\n\n");
343 #endif
344 test6A();
345 blexit();
346 /*--------------- EXIT BLOCK 5 ---------------------------------*/
347
348 /*---------------- ENTER BLOCK 6 --------------------------------*/
349 blenter();
350 #ifdef DEBUG
351 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
352 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
353 fprintf(temp, "depth, int flags) shall pass the path-name of the\n");
354 fprintf(temp, "current object as the first argument of the function\n");
355 fprintf(temp, "fn.\n\n");
356 #endif
357 test7A();
358 blexit();
359 /*--------------- EXIT BLOCK 6 ---------------------------------*/
360
361 /*---------------- ENTER BLOCK 7 --------------------------------*/
362 blenter();
363 #ifdef DEBUG
364 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
365 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
366 fprintf(temp, "depth, int flags) shall pass a pointer to a stat\n");
367 fprintf(temp, "structure containing information about the current\n");
368 fprintf(temp, "object as the second argument to fn.\n\n");
369 #endif
370 test8A();
371 blexit();
372 /*--------------- EXIT BLOCK 7 ---------------------------------*/
373
374 /*---------------- ENTER BLOCK 8 --------------------------------*/
375 blenter();
376 #ifdef DEBUG
377 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
378 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
379 fprintf(temp, "depth, int flags) shall pass FTW_F as the third\n");
380 fprintf(temp,
381 "argument of the function fn when the object is a file.\n\n");
382 #endif
383 test9A();
384 blexit();
385 /*--------------- EXIT BLOCK 8 ---------------------------------*/
386
387 /*---------------- ENTER BLOCK 9 --------------------------------*/
388 blenter();
389 #ifdef DEBUG
390 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
391 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
392 fprintf(temp, "depth, int flags) shall pass FTW_D as the third\n");
393 fprintf(temp, "argument of the function fn when the object is a\n");
394 fprintf(temp, "directory.\n\n");
395 #endif
396 test10A();
397 blexit();
398 /*--------------- EXIT BLOCK 9 ---------------------------------*/
399
400 /*---------------- ENTER BLOCK 10 --------------------------------*/
401 blenter();
402 #ifdef DEBUG
403 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
404 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
405 fprintf(temp, "depth, int flags) shall pass FTW_DP as the third\n");
406 fprintf(temp, "argument of the function fn when the object is a\n");
407 fprintf(temp, "directory and subdirectories have been visited.\n\n");
408 #endif
409 test11A();
410 blexit();
411 /*--------------- EXIT BLOCK 10 ---------------------------------*/
412
413 /*---------------- ENTER BLOCK 11 --------------------------------*/
414 blenter();
415 #ifdef DEBUG
416 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
417 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
418 fprintf(temp, "depth, int flags) shall pass FTW_SL as the third\n");
419 fprintf(temp, "argument of the function fn when the object is a\n");
420 fprintf(temp, "symbolic link.\n\n");
421 #endif
422 test12A();
423 blexit();
424 /*--------------- EXIT BLOCK 11 ---------------------------------*/
425
426 /*---------------- ENTER BLOCK 12 --------------------------------*/
427 blenter();
428 #ifdef DEBUG
429 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
430 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
431 fprintf(temp, "depth, int flags) shall pass FTW_SLN as the third\n");
432 fprintf(temp, "argument of the function fn when the object is a\n");
433 fprintf(temp, "symbolic link that does not name an existing file.\n\n");
434 #endif
435 test13A();
436 blexit();
437 /*--------------- EXIT BLOCK 12 ---------------------------------*/
438
439 /*---------------- ENTER BLOCK 13 --------------------------------*/
440 blenter();
441 #ifdef DEBUG
442 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
443 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
444 fprintf(temp, "depth, int flags) shall pass FTW_DNR as the third\n");
445 fprintf(temp, "argument of the function fn when the object is a\n");
446 fprintf(temp, "directory that cannot be read.\n\n");
447 #endif
448 test14A();
449 blexit();
450 /*--------------- EXIT BLOCK 13 ---------------------------------*/
451
452 /*---------------- ENTER BLOCK 14 --------------------------------*/
453 blenter();
454 #ifdef DEBUG
455 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
456 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
457 fprintf(temp, "depth, int flags) shall pass FTW_NS as the third\n");
458 fprintf(temp,
459 "argument of the function fn when stat() failed on the\n");
460 fprintf(temp, "object because of lack of appropriate permission.\n\n");
461 #endif
462 test15A();
463 blexit();
464 /*--------------- EXIT BLOCK 14 ---------------------------------*/
465
466 /*---------------- ENTER BLOCK 15 --------------------------------*/
467 blenter();
468 #ifdef DEBUG
469 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
470 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
471 fprintf(temp, "depth, int flags) shall pass a structure which\n");
472 fprintf(temp, "contains the offset into the pathname of the object\n");
473 fprintf(temp, "and the depth relative to the root of the walk\n");
474 fprintf(temp,
475 "starting from 0 as the fourth argument of the function\n");
476 fprintf(temp, "fn.\n\n");
477 #endif
478 test16A();
479 blexit();
480 /*--------------- EXIT BLOCK 15 ---------------------------------*/
481
482 /*---------------- ENTER BLOCK 16 --------------------------------*/
483 blenter();
484 #ifdef DEBUG
485 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
486 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
487 fprintf(temp, "depth, int flags) shall pass FTW_SL as the third\n");
488 fprintf(temp, "argument to the function fn if and only if the\n");
489 fprintf(temp, "FTW_PHYS flag is included in flags.\n\n");
490 #endif
491 test17A();
492 blexit();
493 /*--------------- EXIT BLOCK 16 ---------------------------------*/
494
495 /*---------------- ENTER BLOCK 17 --------------------------------*/
496 blenter();
497 #ifdef DEBUG
498 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
499 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
500 fprintf(temp, "depth, int flags) shall pass FTW_SLN as the third\n");
501 fprintf(temp, "argument to the function fn if and only if the\n");
502 fprintf(temp, "FTW_PHYS flag is not included in flags.\n\n");
503 #endif
504 test18A();
505 blexit();
506 /*--------------- EXIT BLOCK 17 ---------------------------------*/
507
508 /*---------------- ENTER BLOCK 18 --------------------------------*/
509 blenter();
510 #ifdef DEBUG
511 fprintf(temp, "On a call to int nftw(const char *path, int\n");
512 fprintf(temp, "(*fn)(const char *, const struct stat *, int, struct\n");
513 fprintf(temp,
514 "FTW *), int depth, int flags) when the third argument\n");
515 fprintf(temp, "passed to the function fn is FTW_DNR then the\n");
516 fprintf(temp,
517 "descendants of the directory shall not be processed.\n\n");
518 #endif
519 test19A();
520 blexit();
521 /*--------------- EXIT BLOCK 18 ---------------------------------*/
522
523 /*---------------- ENTER BLOCK 19 --------------------------------*/
524 blenter();
525 #ifdef DEBUG
526 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
527 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
528 fprintf(temp,
529 "depth, int flags) shall close any file descriptors or\n");
530 fprintf(temp,
531 "directory streams used to traverse the directory tree.\n\n");
532 #endif
533 test20A();
534 blexit();
535 /*--------------- EXIT BLOCK 19 ---------------------------------*/
536
537 /*---------------- ENTER BLOCK 20 --------------------------------*/
538 blenter();
539 #ifdef DEBUG
540 fprintf(temp, "On a call to int nftw(const char *path, int\n");
541 fprintf(temp, "(*fn)(const char *, const struct stat *, int, struct\n");
542 fprintf(temp, "FTW *), int depth, int flags) depth shall be the\n");
543 fprintf(temp,
544 "maximum number of file descriptors used for the search.\n\n");
545 #endif
546 test21A();
547 blexit();
548 /*--------------- EXIT BLOCK 20 ---------------------------------*/
549
550 /*---------------- ENTER BLOCK 21 --------------------------------*/
551 blenter();
552 #ifdef DEBUG
553 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
554 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
555 fprintf(temp, "depth, int flags) shall use at most one file\n");
556 fprintf(temp, "descriptor for each directory level.\n\n");
557 #endif
558 test22A();
559 blexit();
560 /*--------------- EXIT BLOCK 21 ---------------------------------*/
561
562 /*---------------- ENTER BLOCK 22 --------------------------------*/
563 blenter();
564 #ifdef DEBUG
565 fprintf(temp, "A call to int nftw(const char *path, int (*fn)(const\n");
566 fprintf(temp, "char *, const struct stat *, int, struct FTW *), int\n");
567 fprintf(temp, "depth, int flags) when the function fn returns a\n");
568 fprintf(temp, "non-zero value shall stop and return the value\n");
569 fprintf(temp, "returned by fn.\n\n");
570 #endif
571 test23A();
572 blexit();
573 /*--------------- EXIT BLOCK 22 ---------------------------------*/
574
575 /*---------------- ENTER BLOCK 23 --------------------------------*/
576 blenter();
577 #ifdef DEBUG
578 fprintf(temp, "ENAMETOOLONG in errno and return -1 on a call to int\n");
579 fprintf(temp, "nftw(const char *path, int (*fn)(const char *, const\n");
580 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n");
581 fprintf(temp, "flags) when the length of path exceeds PATH_MAX.\n\n");
582 #endif
583 test24A();
584 blexit();
585 /*--------------- EXIT BLOCK 23 ---------------------------------*/
586
587 /*---------------- ENTER BLOCK 24 --------------------------------*/
588 blenter();
589 #ifdef DEBUG
590 fprintf(temp, "ENAMETOOLONG in errno and return -1 on a call to int\n");
591 fprintf(temp, "nftw(const char *path, int (*fn)(const char *, const\n");
592 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n");
593 fprintf(temp, "flags) when a component of path exceeds NAME_MAX.\n\n");
594 #endif
595 test25A();
596 blexit();
597 /*--------------- EXIT BLOCK 24 ---------------------------------*/
598
599 /*---------------- ENTER BLOCK 25 --------------------------------*/
600 blenter();
601 #ifdef DEBUG
602 fprintf(temp, "ENOENT in errno and return -1 on a call to int\n");
603 fprintf(temp, "nftw(const char *path, int (*fn)(const char *, const\n");
604 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n");
605 fprintf(temp,
606 "flags) when path points to a file which does not exist.\n\n");
607 #endif
608 test26A();
609 blexit();
610 /*--------------- EXIT BLOCK 25 ---------------------------------*/
611
612 /*---------------- ENTER BLOCK 26 --------------------------------*/
613 blenter();
614 #ifdef DEBUG
615 fprintf(temp, "ENOENT in errno and return -1 on a call to int\n");
616 fprintf(temp, "nftw(const char *path, int (*fn)(const char *, const\n");
617 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n");
618 fprintf(temp, "flags) when path points to an empty string.\n\n");
619 #endif
620 test27A();
621 blexit();
622 /*--------------- EXIT BLOCK 26 ---------------------------------*/
623
624 /*---------------- ENTER BLOCK 27 --------------------------------*/
625 blenter();
626 #ifdef DEBUG
627 fprintf(temp, "ENOTDIR in errno and return -1 on a call to int\n");
628 fprintf(temp, "nftw(const char *path, int (*fn)(const char *, const\n");
629 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n");
630 fprintf(temp, "flags) when path is not a directory.\n\n");
631 #endif
632 test28A();
633 blexit();
634 /*--------------- EXIT BLOCK 27 ---------------------------------*/
635
636 /*---------------- ENTER BLOCK 28 --------------------------------*/
637 blenter();
638 #ifdef DEBUG
639 fprintf(temp, "EACCES in errno and return -1 on a call to int\n");
640 fprintf(temp, "nftw(const char *path, int (*fn)(const char *, const\n");
641 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n");
642 fprintf(temp, "flags) when search permission is denied for any\n");
643 fprintf(temp, "component of path.\n\n");
644 #endif
645 test29A();
646 blexit();
647 /*--------------- EXIT BLOCK 28 ---------------------------------*/
648
649 /*---------------- ENTER BLOCK 29 --------------------------------*/
650 blenter();
651 #ifdef DEBUG
652 fprintf(temp, "EACCES in errno and return -1 on a call to int\n");
653 fprintf(temp, "nftw(const char *path, int (*fn)(const char *, const\n");
654 fprintf(temp, "struct stat *, int, struct FTW *), int depth, int\n");
655 fprintf(temp, "flags) when read permission is denied for path.\n\n");
656 #endif
657 test30A();
658 blexit();
659 /*--------------- EXIT BLOCK 29 ---------------------------------*/
660
661 cleanup_function();
662
663 anyfail(); /* THIS CALL DOES NOT RETURN - EXITS!! */
664 tst_exit();
665 /*--------------------------------------------------------------*/
666 }
667
668 /** LTP Port **/
669 /*
670 * setup
671 *
672 * Do set up - here its a dummy function
673 */
setup(void)674 void setup(void)
675 {
676 /* Direct debug output to stderr */
677 temp = stderr;
678
679 /* Get the user id "nobody" */
680 if ((ltpuser = getpwnam("nobody")) == NULL) {
681 perror("nobody not found in /etc/passwd");
682 exit(1);
683 }
684
685 /* Switch to "nobody" */
686 setuid(ltpuser->pw_uid);
687
688 tst_tmpdir();
689 }
690
691 /*
692 * Function: blenter()
693 *
694 * Description: Print message on entering a new block
695 */
blenter(void)696 void blenter(void)
697 {
698 local_flag = PASSED;
699 return;
700 }
701
702 /*
703 * Function: blexit()
704 *
705 * Description: This function will exit a block, a block may be a logical unit
706 * of a test. It will report the status if the test ie fail or
707 * pass.
708 */
blexit(void)709 void blexit(void)
710 {
711 (local_flag == PASSED) ? tst_resm(TPASS, "Test block %d", block_number)
712 : tst_resm(TFAIL, "Test block %d", block_number);
713 block_number++;
714 return;
715 }
716
717 /*
718 *
719 * Function: anyfail()
720 *
721 * Description: Exit a test.
722 */
anyfail(void)723 void anyfail(void)
724 {
725 (local_flag == FAILED) ? tst_resm(TFAIL, "Test failed")
726 : tst_resm(TPASS, "Test passed");
727 tst_rmdir();
728 tst_exit();
729 }
730
731 /**************/
732