1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12da2e3ebdSchin *                                                                      *
13da2e3ebdSchin *              Information and Software Systems Research               *
14da2e3ebdSchin *                            AT&T Research                             *
15da2e3ebdSchin *                           Florham Park NJ                            *
16da2e3ebdSchin *                                                                      *
17da2e3ebdSchin *                 Glenn Fowler <gsf@research.att.com>                  *
18da2e3ebdSchin *                  David Korn <dgk@research.att.com>                   *
19da2e3ebdSchin *                   Phong Vo <kpv@research.att.com>                    *
20da2e3ebdSchin *                                                                      *
21da2e3ebdSchin ***********************************************************************/
22da2e3ebdSchin #pragma prototyped
23da2e3ebdSchin /*
24da2e3ebdSchin  * Glenn Fowler
25da2e3ebdSchin  * David Korn
26da2e3ebdSchin  * Phong Vo
27da2e3ebdSchin  * AT&T Research
28da2e3ebdSchin  *
29da2e3ebdSchin  * fts interface definitions
30da2e3ebdSchin  */
31da2e3ebdSchin 
32da2e3ebdSchin #ifndef	_FTS_H
33da2e3ebdSchin #define _FTS_H
34da2e3ebdSchin 
353e14f97fSRoger A. Faulkner #include <ast_std.h>
363e14f97fSRoger A. Faulkner #include <ast_fs.h>
373e14f97fSRoger A. Faulkner #include <ast_mode.h>
38da2e3ebdSchin 
39da2e3ebdSchin /*
40da2e3ebdSchin  * fts_open flags
41da2e3ebdSchin  */
42da2e3ebdSchin 
43da2e3ebdSchin #define FTS_LOGICAL	0	/* logical traversal, follow symlinks	*/
44da2e3ebdSchin #define FTS_META	(1<<0)	/* follow top dir symlinks even if phys	*/
45da2e3ebdSchin #define FTS_NOCHDIR	(1<<1)	/* don't chdir				*/
46da2e3ebdSchin #define FTS_NOPOSTORDER	(1<<2)	/* no postorder visits			*/
47da2e3ebdSchin #define FTS_NOPREORDER	(1<<3)	/* no preorder visits			*/
48da2e3ebdSchin #define FTS_NOSEEDOTDIR	(1<<11)	/* never retain leading . dir		*/
49da2e3ebdSchin #define FTS_NOSTAT	(1<<4)	/* don't stat children			*/
50da2e3ebdSchin #define FTS_ONEPATH	(1<<5)	/* pathnames arg is one const char*	*/
51da2e3ebdSchin #define FTS_PHYSICAL	(1<<6)	/* physical traversal, don't follow	*/
52da2e3ebdSchin #define FTS_SEEDOT	(1<<7)	/* return . and ..			*/
53da2e3ebdSchin #define FTS_SEEDOTDIR	(1<<10)	/* always retain leading . dir		*/
54da2e3ebdSchin #define FTS_TOP		(1<<8)	/* don't traverse subdirectories	*/
55da2e3ebdSchin #define FTS_XDEV	(1<<9)	/* don't cross mount points		*/
56da2e3ebdSchin 
57da2e3ebdSchin #define FTS_USER	(1<<12)	/* first user flag bit			*/
58da2e3ebdSchin 
59da2e3ebdSchin #define FTS_COMFOLLOW	FTS_META
60da2e3ebdSchin 
61da2e3ebdSchin /*
62da2e3ebdSchin  * fts_info flags
63da2e3ebdSchin  */
64da2e3ebdSchin 
65da2e3ebdSchin #define FTS_DEFAULT	0	/* ok, someone must have wanted this	*/
66da2e3ebdSchin 
67da2e3ebdSchin #define FTS_NS		(1<<0)	/* stat failed				*/
68da2e3ebdSchin #define FTS_F		(1<<1)	/* file - not directory or symbolic link*/
69da2e3ebdSchin #define FTS_SL		(1<<2)	/* symbolic link			*/
70da2e3ebdSchin #define FTS_D		(1<<3)	/* directory - pre-order visit		*/
71da2e3ebdSchin 
72da2e3ebdSchin #define FTS_C		(1<<4)	/* causes cycle				*/
73da2e3ebdSchin #define FTS_ERR		(1<<5)	/* some other error			*/
74da2e3ebdSchin #define FTS_DD		(1<<6)	/* . or ..				*/
75da2e3ebdSchin #define FTS_NR		(1<<7)	/* cannot read				*/
76da2e3ebdSchin #define FTS_NX		(1<<8)	/* cannot search			*/
77da2e3ebdSchin #define FTS_OK		(1<<9)	/* no info but otherwise ok		*/
78da2e3ebdSchin #define FTS_P		(1<<10)	/* post-order visit			*/
79da2e3ebdSchin 
80da2e3ebdSchin #define FTS_DC		(FTS_D|FTS_C)	/* dir - would cause cycle	*/
81da2e3ebdSchin #define FTS_DNR		(FTS_D|FTS_NR)	/* dir - no read permission	*/
82da2e3ebdSchin #define FTS_DNX		(FTS_D|FTS_NX)	/* dir - no search permission	*/
83da2e3ebdSchin #define FTS_DOT		(FTS_D|FTS_DD)	/* . or ..			*/
84da2e3ebdSchin #define FTS_DP		(FTS_D|FTS_P)	/* dir - post-order visit	*/
85da2e3ebdSchin #define FTS_NSOK	(FTS_NS|FTS_OK)	/* no stat (because you asked)	*/
86da2e3ebdSchin #define FTS_SLNONE	(FTS_SL|FTS_NS)	/* symlink - to nowhere		*/
87da2e3ebdSchin 
88da2e3ebdSchin /*
89da2e3ebdSchin  * fts_set flags
90da2e3ebdSchin  */
91da2e3ebdSchin 
92da2e3ebdSchin #define FTS_AGAIN	FTS_TOP		/* process entry again		*/
93da2e3ebdSchin #define FTS_FOLLOW	FTS_META	/* follow FTS_SL symlink	*/
94da2e3ebdSchin #define FTS_SKIP	FTS_NOSTAT	/* skip FTS_D directory		*/
95da2e3ebdSchin #define FTS_STAT	FTS_PHYSICAL	/* stat() done by user		*/
96da2e3ebdSchin 
97da2e3ebdSchin typedef struct Fts FTS;
98da2e3ebdSchin typedef struct Ftsent FTSENT;
99da2e3ebdSchin 
100da2e3ebdSchin struct Ftsent
101da2e3ebdSchin {
102da2e3ebdSchin 	char*		fts_accpath;	/* path relative to .		*/
103da2e3ebdSchin 	char*		fts_name;	/* file name			*/
104da2e3ebdSchin 	char*		fts_path;	/* path relative to top dir	*/
105da2e3ebdSchin 	FTSENT*		fts_cycle;	/* offender if cycle		*/
106da2e3ebdSchin 	FTSENT*		fts_link;	/* next child			*/
107da2e3ebdSchin 	FTSENT*		fts_parent;	/* parent directory		*/
108da2e3ebdSchin 	struct stat*	fts_statp;	/* stat info			*/
109da2e3ebdSchin #ifdef _FTSENT_LOCAL_PRIVATE_
110da2e3ebdSchin 	_FTSENT_LOCAL_PRIVATE_
111da2e3ebdSchin #else
112da2e3ebdSchin 	void*		fts_pointer;	/* local pointer value		*/
113da2e3ebdSchin #endif
114da2e3ebdSchin 	long		fts_number;	/* local numeric value		*/
115da2e3ebdSchin 	int		fts_errno;	/* errno for this entry		*/
116da2e3ebdSchin 	unsigned short	fts_info;	/* info flags			*/
11734f9b3eeSRoland Mainz 
11834f9b3eeSRoland Mainz 	unsigned short	_fts_namelen;	/* old fts_namelen		*/
11934f9b3eeSRoland Mainz 	unsigned short	_fts_pathlen;	/* old fts_pathlen		*/
12034f9b3eeSRoland Mainz 	short		_fts_level;	/* old fts_level		*/
12134f9b3eeSRoland Mainz 
12234f9b3eeSRoland Mainz 	short		_fts_status;	/* <ftwalk.h> compatibility	*/
12334f9b3eeSRoland Mainz 	struct stat	_fts_statb;	/* <ftwalk.h> compatibility	*/
12434f9b3eeSRoland Mainz 
12534f9b3eeSRoland Mainz 	FTS*		fts;		/* fts_open() handle		*/
12634f9b3eeSRoland Mainz 	size_t		fts_namelen;	/* strlen(fts_name)		*/
12734f9b3eeSRoland Mainz 	size_t		fts_pathlen;	/* strlen(fts_path)		*/
12834f9b3eeSRoland Mainz 	ssize_t		fts_level;	/* file tree depth, 0 at top	*/
129da2e3ebdSchin 
130da2e3ebdSchin #ifdef _FTSENT_PRIVATE_
131da2e3ebdSchin 	_FTSENT_PRIVATE_
132da2e3ebdSchin #endif
133da2e3ebdSchin 
134da2e3ebdSchin };
135da2e3ebdSchin 
136da2e3ebdSchin struct Fts
137da2e3ebdSchin {
138da2e3ebdSchin 	int		fts_errno;	/* last errno			*/
1397c2fbfb3SApril Chin 	void*		fts_handle;	/* user defined handle		*/
140da2e3ebdSchin 
141da2e3ebdSchin #ifdef _FTS_PRIVATE_
142da2e3ebdSchin 	_FTS_PRIVATE_
143da2e3ebdSchin #endif
144da2e3ebdSchin 
145da2e3ebdSchin };
146da2e3ebdSchin 
147da2e3ebdSchin #if _BLD_ast && defined(__EXPORT__)
148da2e3ebdSchin #define extern		__EXPORT__
149da2e3ebdSchin #endif
150da2e3ebdSchin 
151da2e3ebdSchin extern FTSENT*	fts_children(FTS*, int);
152da2e3ebdSchin extern int	fts_close(FTS*);
153da2e3ebdSchin extern int	fts_flags(void);
1547c2fbfb3SApril Chin extern int	fts_local(FTSENT*);
155da2e3ebdSchin extern int	fts_notify(int(*)(FTS*, FTSENT*, void*), void*);
156da2e3ebdSchin extern FTS*	fts_open(char* const*, int, int(*)(FTSENT* const*, FTSENT* const*));
157da2e3ebdSchin extern FTSENT*	fts_read(FTS*);
158da2e3ebdSchin extern int	fts_set(FTS*, FTSENT*, int);
159da2e3ebdSchin 
160da2e3ebdSchin #undef	extern
161da2e3ebdSchin 
162da2e3ebdSchin #endif
163