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