nftw64.c revision c57fba5535abf457e33dd7a986b6c512d95cdef6
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 *	nftw64.c - Test of nftw64()
26 */
27
28#include <pwd.h>
29#include "nftw64.h"
30
31void setup(void);
32void blenter(void);
33void blexit(void);
34void anyfail(void);
35
36char progname[] = "nftw64.c";
37
38/** LTP Port **/
39#define FAILED 0
40#define PASSED 1
41
42int local_flag = PASSED;
43int block_number;
44
45FILE *temp;
46char *TCID = "nftw6401";
47int TST_TOTAL = 10;
48
49struct passwd *ltpuser;		/* password struct for ltpuser */
50/**************/
51
52/* Used for error return for some library routines */
53int s2;
54
55/* error messages formatted here. */
56char ebuf[ERR_BUF_SIZ];
57
58/*
59 * Local data declarations.
60 */
61char *dirlist[NDIRLISTENTS];
62
63int visit;
64int next_fd[4];
65
66pathdata 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
215char *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
225struct 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
237struct 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
247int npathdats, ngoods, nbads, nmnem;
248
249/*--------------------------------------------------------------*/
250int main(void)
251{
252	setup();		/* temp file is now open        */
253
254	npathdats = (sizeof(pathdat) / sizeof(pathdat[0]));
255	ngoods = (sizeof(goodlist) / sizeof(goodlist[0]));
256	nbads = (sizeof(badlist) / sizeof(badlist[0]));
257	nmnem = (sizeof(mnem) / sizeof(mnem[0]));
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 */
701void 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 */
723void 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 */
736void 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 */
750void 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