8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / cmd / ndmpd / include / traverse.h
blob02d84a3c23851b28609e31a5b096747cc3454c0f
1 /*
2 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
4 */
6 /*
7 * BSD 3 Clause License
9 * Copyright (c) 2007, The Storage Networking Industry Association.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * - Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
17 * - Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in
19 * the documentation and/or other materials provided with the
20 * distribution.
22 * - Neither the name of The Storage Networking Industry Association (SNIA)
23 * nor the names of its contributors may be used to endorse or promote
24 * products derived from this software without specific prior written
25 * permission.
27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
41 * This file defines macros and constants related to traversing file
42 * system hieratchy in post-order, pre-order and level-order ways.
45 #ifndef _TRAVERSE_H_
46 #define _TRAVERSE_H_
48 #ifdef __cplusplus
49 extern "C" {
50 #endif
53 * Library functions for traversing file system hierarchy in
54 * post-order, pre-order and level-order.
56 * This example will be used in the following descriptions.
57 * All alphabetical entries are directory and all the numerical
58 * entries are non-directory entries.
60 * AAA
61 * AAA/BBB
62 * AAA/BBB/1
63 * AAA/BBB/2
64 * AAA/BBB/3
65 * AAA/CCC
66 * AAA/CCC/EEE
67 * AAA/CCC/EEE/4
68 * AAA/CCC/EEE/5
69 * AAA/CCC/EEE/6
70 * AAA/CCC/EEE/7
71 * AAA/CCC/EEE/8
72 * AAA/CCC/9
73 * AAA/XXX
74 * AAA/ZZZ
75 * AAA/10
76 * AAA/11
77 * AAA/12
78 * AAA/13
80 * Each traversing function gets an argument of 'struct fs_traverse *'
81 * type. The fields of this structure are explained below.
83 * For each entry while traversing, the callback function is
84 * called and three arguments are passed to it. The argument
85 * specified in the struct fs_traverse, a struct fst_node for the
86 * path and a struct fst_node for the entry.
88 * For the root of the traversing, the fields of struct fst_node
89 * of the entry are all NULL.
91 * If the path to be traversed is not a directory, the callback
92 * function is called on it. The fields of the 'struct fst_node'
93 * argument for entry are all NULL.
96 * POST-ORDER:
97 * Post-order means that the directory is processed after all
98 * its children are processed. Post-order traversing of the above
99 * hierarchy will be like this:
101 * AAA/BBB, 1
102 * AAA/BBB, 2
103 * AAA/BBB, 3
104 * AAA, BBB
105 * AAA/CCC/EEE, 6
106 * AAA/CCC/EEE, 5
107 * AAA/CCC/EEE, 8
108 * AAA/CCC/EEE, 4
109 * AAA/CCC/EEE, 7
110 * AAA/CCC, EEE
111 * AAA/CCC, 9
112 * AAA, CCC
113 * AAA, XXX
114 * AAA, ZZZ
115 * AAA, 10
116 * AAA, 11
117 * AAA, 12
118 * AAA, 13
119 * AAA
121 * In post-order the callback function returns 0 on success
122 * or non-zero to stop further traversing the hierarchy.
124 * One of the applications of post-order traversing of a
125 * hierarchy can be deleting the hierarchy from the file system.
128 * PRE-ORDER:
129 * Pre-order means that the directory is processed before
130 * any of its children are processed. Pre-order traversing of
131 * the above hierarchy will be like this:
133 * AAA
134 * AAA, BBB
135 * AAA/BBB, 1
136 * AAA/BBB, 2
137 * AAA/BBB, 3
138 * AAA, CCC
139 * AAA/CCC, EEE
140 * AAA/CCC/EEE, 6
141 * AAA/CCC/EEE, 5
142 * AAA/CCC/EEE, 8
143 * AAA/CCC/EEE, 4
144 * AAA/CCC/EEE, 7
145 * AAA/CCC, 9
146 * AAA, XXX
147 * AAA, ZZZ
148 * AAA, 10
149 * AAA, 11
150 * AAA, 12
151 * AAA, 13
153 * In pre-order, the callback function can return 3 values:
154 * 0: means that the traversing should continue.
156 * < 0: means that the traversing should be stopped immediately.
158 * FST_SKIP: means that no further entries of this directory
159 * should be processed. Traversing continues with the
160 * next directory of the same level. For example, if
161 * callback returns FST_SKIP on AAA/BBB, the callback
162 * will not be called on 1, 2, 3 and traversing will
163 * continue with AAA/CCC.
166 * LEVEL-ORDER:
167 * This is a special case of pre-order. In this method,
168 * all the non-directory entries of a directory are processed
169 * and then come the directory entries. Level-order traversing
170 * of the above hierarchy will be like this:
172 * AAA
173 * AAA, 10
174 * AAA, 11
175 * AAA, 12
176 * AAA, 13
177 * AAA, BBB
178 * AAA/BBB, 1
179 * AAA/BBB, 2
180 * AAA/BBB, 3
181 * AAA, CCC
182 * AAA/CCC, 9
183 * AAA/CCC, EEE
184 * AAA/CCC/EEE, 6
185 * AAA/CCC/EEE, 5
186 * AAA/CCC/EEE, 8
187 * AAA/CCC/EEE, 4
188 * AAA/CCC/EEE, 7
189 * AAA, XXX
190 * AAA, ZZZ
192 * The rules of pre-order for the return value of callback
193 * function applies for level-order.
196 #include <sys/types.h>
197 #include <sys/stat.h>
198 #include "tlm.h"
201 * To prune a directory when traversing it, this return
202 * value should be returned by the callback function in
203 * level-order and pre-order traversing.
205 * In level-order processing, this return value stops
206 * reading the rest of the directory and calling the callback
207 * function for them. Traversing will continue with the next
208 * directory of the same level. The children of the current
209 * directory will be pruned too. For example on this ,
212 #define FST_SKIP 1
215 #define SKIP_ENTRY 2
219 * Directives for traversing file system.
221 * FST_STOP_ONERR: Stop travergins when stat fails on an entry.
222 * FST_STOP_ONLONG: Stop on detecting long path.
223 * FST_VERBOSE: Verbose running.
225 #define FST_STOP_ONERR 0x00000001
226 #define FST_STOP_ONLONG 0x00000002
227 #define FST_VERBOSE 0x80000000
230 typedef void (*ft_log_t)();
234 * The arguments of traversing file system contains:
235 * path: The physical path to be traversed.
237 * lpath The logical path to be passed to the callback
238 * function as path.
239 * If this is set to NULL, the default value will be
240 * the 'path'.
242 * For example, traversing '/v1.chkpnt/backup/home' as
243 * physical path can have a logical path of '/v1/home'.
245 * flags Show how the traversing should be done.
246 * Values of this field are of FST_ constants.
248 * callbk The callback function pointer. The callback
249 * function is called like this:
250 * (*ft_callbk)(
251 * void *ft_arg,
252 * struct fst_node *path,
253 * struct fst_node *entry)
255 * arg The 'void *' argument to be passed to the call
256 * back function.
258 * logfp The log function pointer. This function
259 * is called to log the messages.
260 * Default is logf().
262 typedef struct fs_traverse {
263 char *ft_path;
264 char *ft_lpath;
265 unsigned int ft_flags;
266 int (*ft_callbk)();
267 void *ft_arg;
268 ft_log_t ft_logfp;
269 } fs_traverse_t;
272 * Traversing Nodes. For each path and node upon entry this
273 * structure is passed to the callback function.
275 typedef struct fst_node {
276 char *tn_path;
277 fs_fhandle_t *tn_fh;
278 struct stat64 *tn_st;
279 } fst_node_t;
281 extern int traverse_post(fs_traverse_t *);
282 extern int traverse_pre(fs_traverse_t *);
283 extern int traverse_level(fs_traverse_t *);
284 #undef getdents
285 extern int getdents(int, struct dirent *, size_t);
286 #ifdef __cplusplus
288 #endif
290 #endif /* _TRAVERSE_H_ */