xref: /onnv-gate/usr/src/cmd/ndmpd/include/traverse.h (revision 9714:c2e4024f4670)
17917SReza.Sabdar@Sun.COM /*
2*9714SReza.Sabdar@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
37917SReza.Sabdar@Sun.COM  * Use is subject to license terms.
47917SReza.Sabdar@Sun.COM  */
57917SReza.Sabdar@Sun.COM 
67917SReza.Sabdar@Sun.COM /*
77917SReza.Sabdar@Sun.COM  * BSD 3 Clause License
87917SReza.Sabdar@Sun.COM  *
97917SReza.Sabdar@Sun.COM  * Copyright (c) 2007, The Storage Networking Industry Association.
107917SReza.Sabdar@Sun.COM  *
117917SReza.Sabdar@Sun.COM  * Redistribution and use in source and binary forms, with or without
127917SReza.Sabdar@Sun.COM  * modification, are permitted provided that the following conditions
137917SReza.Sabdar@Sun.COM  * are met:
147917SReza.Sabdar@Sun.COM  * 	- Redistributions of source code must retain the above copyright
157917SReza.Sabdar@Sun.COM  *	  notice, this list of conditions and the following disclaimer.
167917SReza.Sabdar@Sun.COM  *
177917SReza.Sabdar@Sun.COM  * 	- Redistributions in binary form must reproduce the above copyright
187917SReza.Sabdar@Sun.COM  *	  notice, this list of conditions and the following disclaimer in
197917SReza.Sabdar@Sun.COM  *	  the documentation and/or other materials provided with the
207917SReza.Sabdar@Sun.COM  *	  distribution.
217917SReza.Sabdar@Sun.COM  *
227917SReza.Sabdar@Sun.COM  *	- Neither the name of The Storage Networking Industry Association (SNIA)
237917SReza.Sabdar@Sun.COM  *	  nor the names of its contributors may be used to endorse or promote
247917SReza.Sabdar@Sun.COM  *	  products derived from this software without specific prior written
257917SReza.Sabdar@Sun.COM  *	  permission.
267917SReza.Sabdar@Sun.COM  *
277917SReza.Sabdar@Sun.COM  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
287917SReza.Sabdar@Sun.COM  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
297917SReza.Sabdar@Sun.COM  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
307917SReza.Sabdar@Sun.COM  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
317917SReza.Sabdar@Sun.COM  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
327917SReza.Sabdar@Sun.COM  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
337917SReza.Sabdar@Sun.COM  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
347917SReza.Sabdar@Sun.COM  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
357917SReza.Sabdar@Sun.COM  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
367917SReza.Sabdar@Sun.COM  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
377917SReza.Sabdar@Sun.COM  * POSSIBILITY OF SUCH DAMAGE.
387917SReza.Sabdar@Sun.COM  */
397917SReza.Sabdar@Sun.COM 
407917SReza.Sabdar@Sun.COM /*
417917SReza.Sabdar@Sun.COM  * This file defines macros and constants related to traversing file
427917SReza.Sabdar@Sun.COM  * system hieratchy in post-order, pre-order and level-order ways.
437917SReza.Sabdar@Sun.COM  */
447917SReza.Sabdar@Sun.COM 
457917SReza.Sabdar@Sun.COM #ifndef _TRAVERSE_H_
467917SReza.Sabdar@Sun.COM #define	_TRAVERSE_H_
477917SReza.Sabdar@Sun.COM 
487917SReza.Sabdar@Sun.COM #ifdef __cplusplus
497917SReza.Sabdar@Sun.COM extern "C" {
507917SReza.Sabdar@Sun.COM #endif
517917SReza.Sabdar@Sun.COM 
527917SReza.Sabdar@Sun.COM /*
537917SReza.Sabdar@Sun.COM  * Library functions for traversing file system hierarchy in
547917SReza.Sabdar@Sun.COM  * post-order, pre-order and level-order.
557917SReza.Sabdar@Sun.COM  *
567917SReza.Sabdar@Sun.COM  * This example will be used in the following descriptions.
577917SReza.Sabdar@Sun.COM  * All alphabetical entries are directory and all the numerical
587917SReza.Sabdar@Sun.COM  * entries are non-directory entries.
597917SReza.Sabdar@Sun.COM  *
607917SReza.Sabdar@Sun.COM  * AAA
617917SReza.Sabdar@Sun.COM  * AAA/BBB
627917SReza.Sabdar@Sun.COM  * AAA/BBB/1
637917SReza.Sabdar@Sun.COM  * AAA/BBB/2
647917SReza.Sabdar@Sun.COM  * AAA/BBB/3
657917SReza.Sabdar@Sun.COM  * AAA/CCC
667917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE
677917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE/4
687917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE/5
697917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE/6
707917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE/7
717917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE/8
727917SReza.Sabdar@Sun.COM  * AAA/CCC/9
737917SReza.Sabdar@Sun.COM  * AAA/XXX
747917SReza.Sabdar@Sun.COM  * AAA/ZZZ
757917SReza.Sabdar@Sun.COM  * AAA/10
767917SReza.Sabdar@Sun.COM  * AAA/11
777917SReza.Sabdar@Sun.COM  * AAA/12
787917SReza.Sabdar@Sun.COM  * AAA/13
797917SReza.Sabdar@Sun.COM  *
807917SReza.Sabdar@Sun.COM  * Each traversing function gets an argument of 'struct fs_traverse *'
817917SReza.Sabdar@Sun.COM  * type.  The fields of this structure are explained below.
827917SReza.Sabdar@Sun.COM  *
837917SReza.Sabdar@Sun.COM  * For each entry while traversing, the callback function is
847917SReza.Sabdar@Sun.COM  * called and three arguments are passed to it.  The argument
857917SReza.Sabdar@Sun.COM  * specified in the struct fs_traverse, a struct fst_node for the
867917SReza.Sabdar@Sun.COM  * path and a struct fst_node for the entry.
877917SReza.Sabdar@Sun.COM  *
887917SReza.Sabdar@Sun.COM  * For the root of the traversing, the fields of struct fst_node
897917SReza.Sabdar@Sun.COM  * of the entry are all NULL.
907917SReza.Sabdar@Sun.COM  *
917917SReza.Sabdar@Sun.COM  * If the path to be traversed is not a directory, the callback
927917SReza.Sabdar@Sun.COM  * function is called on it.  The fields of the 'struct fst_node'
937917SReza.Sabdar@Sun.COM  * argument for entry are all NULL.
947917SReza.Sabdar@Sun.COM  *
957917SReza.Sabdar@Sun.COM  *
967917SReza.Sabdar@Sun.COM  * POST-ORDER:
977917SReza.Sabdar@Sun.COM  * Post-order means that the directory is processed after all
987917SReza.Sabdar@Sun.COM  * its children are processed.  Post-order traversing of the above
997917SReza.Sabdar@Sun.COM  * hierarchy will be like this:
1007917SReza.Sabdar@Sun.COM  *
1017917SReza.Sabdar@Sun.COM  * AAA/BBB, 1
1027917SReza.Sabdar@Sun.COM  * AAA/BBB, 2
1037917SReza.Sabdar@Sun.COM  * AAA/BBB, 3
1047917SReza.Sabdar@Sun.COM  * AAA, BBB
1057917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 6
1067917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 5
1077917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 8
1087917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 4
1097917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 7
1107917SReza.Sabdar@Sun.COM  * AAA/CCC, EEE
1117917SReza.Sabdar@Sun.COM  * AAA/CCC, 9
1127917SReza.Sabdar@Sun.COM  * AAA, CCC
1137917SReza.Sabdar@Sun.COM  * AAA, XXX
1147917SReza.Sabdar@Sun.COM  * AAA, ZZZ
1157917SReza.Sabdar@Sun.COM  * AAA, 10
1167917SReza.Sabdar@Sun.COM  * AAA, 11
1177917SReza.Sabdar@Sun.COM  * AAA, 12
1187917SReza.Sabdar@Sun.COM  * AAA, 13
1197917SReza.Sabdar@Sun.COM  * AAA
1207917SReza.Sabdar@Sun.COM  *
1217917SReza.Sabdar@Sun.COM  * In post-order the callback function returns 0 on success
1227917SReza.Sabdar@Sun.COM  * or non-zero to stop further traversing the hierarchy.
1237917SReza.Sabdar@Sun.COM  *
1247917SReza.Sabdar@Sun.COM  * One of the applications of post-order traversing of a
1257917SReza.Sabdar@Sun.COM  * hierarchy can be deleting the hierarchy from the file system.
1267917SReza.Sabdar@Sun.COM  *
1277917SReza.Sabdar@Sun.COM  *
1287917SReza.Sabdar@Sun.COM  * PRE-ORDER:
1297917SReza.Sabdar@Sun.COM  * Pre-order means that the directory is processed before
1307917SReza.Sabdar@Sun.COM  * any of its children are processed.  Pre-order traversing of
1317917SReza.Sabdar@Sun.COM  * the above hierarchy will be like this:
1327917SReza.Sabdar@Sun.COM  *
1337917SReza.Sabdar@Sun.COM  * AAA
1347917SReza.Sabdar@Sun.COM  * AAA, BBB
1357917SReza.Sabdar@Sun.COM  * AAA/BBB, 1
1367917SReza.Sabdar@Sun.COM  * AAA/BBB, 2
1377917SReza.Sabdar@Sun.COM  * AAA/BBB, 3
1387917SReza.Sabdar@Sun.COM  * AAA, CCC
1397917SReza.Sabdar@Sun.COM  * AAA/CCC, EEE
1407917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 6
1417917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 5
1427917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 8
1437917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 4
1447917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 7
1457917SReza.Sabdar@Sun.COM  * AAA/CCC, 9
1467917SReza.Sabdar@Sun.COM  * AAA, XXX
1477917SReza.Sabdar@Sun.COM  * AAA, ZZZ
1487917SReza.Sabdar@Sun.COM  * AAA, 10
1497917SReza.Sabdar@Sun.COM  * AAA, 11
1507917SReza.Sabdar@Sun.COM  * AAA, 12
1517917SReza.Sabdar@Sun.COM  * AAA, 13
1527917SReza.Sabdar@Sun.COM  *
1537917SReza.Sabdar@Sun.COM  * In pre-order, the callback function can return 3 values:
1547917SReza.Sabdar@Sun.COM  *     0: means that the traversing should continue.
1557917SReza.Sabdar@Sun.COM  *
1567917SReza.Sabdar@Sun.COM  *     < 0: means that the traversing should be stopped immediately.
1577917SReza.Sabdar@Sun.COM  *
1587917SReza.Sabdar@Sun.COM  *     FST_SKIP: means that no further entries of this directory
1597917SReza.Sabdar@Sun.COM  *         should be processed.  Traversing continues with the
1607917SReza.Sabdar@Sun.COM  *         next directory of the same level.  For example, if
1617917SReza.Sabdar@Sun.COM  *         callback returns FST_SKIP on AAA/BBB, the callback
1627917SReza.Sabdar@Sun.COM  *         will not be called on 1, 2, 3 and traversing will
1637917SReza.Sabdar@Sun.COM  *         continue with AAA/CCC.
1647917SReza.Sabdar@Sun.COM  *
1657917SReza.Sabdar@Sun.COM  *
1667917SReza.Sabdar@Sun.COM  * LEVEL-ORDER:
1677917SReza.Sabdar@Sun.COM  * This is a special case of pre-order.  In this method,
1687917SReza.Sabdar@Sun.COM  * all the non-directory entries of a directory are processed
1697917SReza.Sabdar@Sun.COM  * and then come the directory entries.  Level-order traversing
1707917SReza.Sabdar@Sun.COM  * of the above hierarchy will be like this:
1717917SReza.Sabdar@Sun.COM  *
1727917SReza.Sabdar@Sun.COM  * AAA
1737917SReza.Sabdar@Sun.COM  * AAA, 10
1747917SReza.Sabdar@Sun.COM  * AAA, 11
1757917SReza.Sabdar@Sun.COM  * AAA, 12
1767917SReza.Sabdar@Sun.COM  * AAA, 13
1777917SReza.Sabdar@Sun.COM  * AAA, BBB
1787917SReza.Sabdar@Sun.COM  * AAA/BBB, 1
1797917SReza.Sabdar@Sun.COM  * AAA/BBB, 2
1807917SReza.Sabdar@Sun.COM  * AAA/BBB, 3
1817917SReza.Sabdar@Sun.COM  * AAA, CCC
1827917SReza.Sabdar@Sun.COM  * AAA/CCC, 9
1837917SReza.Sabdar@Sun.COM  * AAA/CCC, EEE
1847917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 6
1857917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 5
1867917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 8
1877917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 4
1887917SReza.Sabdar@Sun.COM  * AAA/CCC/EEE, 7
1897917SReza.Sabdar@Sun.COM  * AAA, XXX
1907917SReza.Sabdar@Sun.COM  * AAA, ZZZ
1917917SReza.Sabdar@Sun.COM  *
1927917SReza.Sabdar@Sun.COM  * The rules of pre-order for the return value of callback
1937917SReza.Sabdar@Sun.COM  * function applies for level-order.
1947917SReza.Sabdar@Sun.COM  */
1957917SReza.Sabdar@Sun.COM 
1967917SReza.Sabdar@Sun.COM #include <sys/types.h>
1977917SReza.Sabdar@Sun.COM #include <sys/stat.h>
1987917SReza.Sabdar@Sun.COM #include "tlm.h"
1997917SReza.Sabdar@Sun.COM 
2007917SReza.Sabdar@Sun.COM /*
2017917SReza.Sabdar@Sun.COM  * To prune a directory when traversing it, this return
2027917SReza.Sabdar@Sun.COM  * value should be returned by the callback function in
2037917SReza.Sabdar@Sun.COM  * level-order and pre-order traversing.
2047917SReza.Sabdar@Sun.COM  *
2057917SReza.Sabdar@Sun.COM  * In level-order processing, this return value stops
2067917SReza.Sabdar@Sun.COM  * reading the rest of the directory and calling the callback
2077917SReza.Sabdar@Sun.COM  * function for them.  Traversing will continue with the next
2087917SReza.Sabdar@Sun.COM  * directory of the same level.  The children of the current
2097917SReza.Sabdar@Sun.COM  * directory will be pruned too.  For example on this ,
2107917SReza.Sabdar@Sun.COM  *
2117917SReza.Sabdar@Sun.COM  */
2127917SReza.Sabdar@Sun.COM #define	FST_SKIP	1
2137917SReza.Sabdar@Sun.COM 
2147917SReza.Sabdar@Sun.COM 
2157917SReza.Sabdar@Sun.COM #define	SKIP_ENTRY	2
2167917SReza.Sabdar@Sun.COM 
2177917SReza.Sabdar@Sun.COM 
2187917SReza.Sabdar@Sun.COM /*
2197917SReza.Sabdar@Sun.COM  * Directives for traversing file system.
2207917SReza.Sabdar@Sun.COM  *
2217917SReza.Sabdar@Sun.COM  * FST_STOP_ONERR: Stop travergins when stat fails on an entry.
2227917SReza.Sabdar@Sun.COM  * FST_STOP_ONLONG: Stop on detecting long path.
2237917SReza.Sabdar@Sun.COM  * FST_VERBOSE: Verbose running.
2247917SReza.Sabdar@Sun.COM  */
2257917SReza.Sabdar@Sun.COM #define	FST_STOP_ONERR		0x00000001
2267917SReza.Sabdar@Sun.COM #define	FST_STOP_ONLONG		0x00000002
2277917SReza.Sabdar@Sun.COM #define	FST_VERBOSE		0x80000000
2287917SReza.Sabdar@Sun.COM 
2297917SReza.Sabdar@Sun.COM 
2307917SReza.Sabdar@Sun.COM typedef void (*ft_log_t)();
2317917SReza.Sabdar@Sun.COM 
2327917SReza.Sabdar@Sun.COM 
2337917SReza.Sabdar@Sun.COM /*
2347917SReza.Sabdar@Sun.COM  * The arguments of traversing file system contains:
2357917SReza.Sabdar@Sun.COM  *     path: The physical path to be traversed.
2367917SReza.Sabdar@Sun.COM  *
2377917SReza.Sabdar@Sun.COM  *     lpath	The logical path to be passed to the callback
2387917SReza.Sabdar@Sun.COM  *         	function as path.
2397917SReza.Sabdar@Sun.COM  *         	If this is set to NULL, the default value will be
2407917SReza.Sabdar@Sun.COM  *         	the 'path'.
2417917SReza.Sabdar@Sun.COM  *
2427917SReza.Sabdar@Sun.COM  *         	For example, traversing '/v1.chkpnt/backup/home' as
2437917SReza.Sabdar@Sun.COM  *         	physical path can have a logical path of '/v1/home'.
2447917SReza.Sabdar@Sun.COM  *
2457917SReza.Sabdar@Sun.COM  *     flags	Show how the traversing should be done.
2467917SReza.Sabdar@Sun.COM  *         	Values of this field are of FST_ constants.
2477917SReza.Sabdar@Sun.COM  *
2487917SReza.Sabdar@Sun.COM  *     callbk	The callback function pointer.  The callback
2497917SReza.Sabdar@Sun.COM  *         	function is called like this:
2507917SReza.Sabdar@Sun.COM  *         	(*ft_callbk)(
2517917SReza.Sabdar@Sun.COM  *         		void *ft_arg,
2527917SReza.Sabdar@Sun.COM  *         		struct fst_node *path,
2537917SReza.Sabdar@Sun.COM  *         		struct fst_node *entry)
2547917SReza.Sabdar@Sun.COM  *
2557917SReza.Sabdar@Sun.COM  *     arg	The 'void *' argument to be passed to the call
2567917SReza.Sabdar@Sun.COM  *		back function.
2577917SReza.Sabdar@Sun.COM  *
2587917SReza.Sabdar@Sun.COM  *     logfp	The log function pointer.  This function
2597917SReza.Sabdar@Sun.COM  *         	is called to log the messages.
2607917SReza.Sabdar@Sun.COM  *         	Default is logf().
2617917SReza.Sabdar@Sun.COM  */
2627917SReza.Sabdar@Sun.COM typedef struct fs_traverse {
2637917SReza.Sabdar@Sun.COM 	char *ft_path;
2647917SReza.Sabdar@Sun.COM 	char *ft_lpath;
2657917SReza.Sabdar@Sun.COM 	unsigned int ft_flags;
2667917SReza.Sabdar@Sun.COM 	int (*ft_callbk)();
2677917SReza.Sabdar@Sun.COM 	void *ft_arg;
2687917SReza.Sabdar@Sun.COM 	ft_log_t ft_logfp;
2697917SReza.Sabdar@Sun.COM } fs_traverse_t;
2707917SReza.Sabdar@Sun.COM 
2717917SReza.Sabdar@Sun.COM /*
2727917SReza.Sabdar@Sun.COM  * Traversing Nodes.  For each path and node upon entry this
2737917SReza.Sabdar@Sun.COM  * structure is passed to the callback function.
2747917SReza.Sabdar@Sun.COM  */
2757917SReza.Sabdar@Sun.COM typedef struct fst_node {
2767917SReza.Sabdar@Sun.COM 	char *tn_path;
2777917SReza.Sabdar@Sun.COM 	fs_fhandle_t *tn_fh;
2787917SReza.Sabdar@Sun.COM 	struct stat64 *tn_st;
2797917SReza.Sabdar@Sun.COM } fst_node_t;
2807917SReza.Sabdar@Sun.COM 
2817917SReza.Sabdar@Sun.COM extern int traverse_post(fs_traverse_t *);
2827917SReza.Sabdar@Sun.COM extern int traverse_pre(fs_traverse_t *);
2837917SReza.Sabdar@Sun.COM extern int traverse_level(fs_traverse_t *);
2847917SReza.Sabdar@Sun.COM #undef	getdents
2857917SReza.Sabdar@Sun.COM extern int getdents(int, struct dirent *, size_t);
2867917SReza.Sabdar@Sun.COM #ifdef __cplusplus
2877917SReza.Sabdar@Sun.COM }
2887917SReza.Sabdar@Sun.COM #endif
2897917SReza.Sabdar@Sun.COM 
2907917SReza.Sabdar@Sun.COM #endif /* _TRAVERSE_H_ */
291