• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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