xref: /titanic_51/usr/src/cmd/ndmpd/include/traverse.h (revision 84bf06e9e5fd6d61897cc8c298a0f3e807b27094)
12654012fSReza Sabdar /*
2*84bf06e9SReza Sabdar  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
32654012fSReza Sabdar  * Use is subject to license terms.
42654012fSReza Sabdar  */
52654012fSReza Sabdar 
62654012fSReza Sabdar /*
72654012fSReza Sabdar  * BSD 3 Clause License
82654012fSReza Sabdar  *
92654012fSReza Sabdar  * Copyright (c) 2007, The Storage Networking Industry Association.
102654012fSReza Sabdar  *
112654012fSReza Sabdar  * Redistribution and use in source and binary forms, with or without
122654012fSReza Sabdar  * modification, are permitted provided that the following conditions
132654012fSReza Sabdar  * are met:
142654012fSReza Sabdar  * 	- Redistributions of source code must retain the above copyright
152654012fSReza Sabdar  *	  notice, this list of conditions and the following disclaimer.
162654012fSReza Sabdar  *
172654012fSReza Sabdar  * 	- Redistributions in binary form must reproduce the above copyright
182654012fSReza Sabdar  *	  notice, this list of conditions and the following disclaimer in
192654012fSReza Sabdar  *	  the documentation and/or other materials provided with the
202654012fSReza Sabdar  *	  distribution.
212654012fSReza Sabdar  *
222654012fSReza Sabdar  *	- Neither the name of The Storage Networking Industry Association (SNIA)
232654012fSReza Sabdar  *	  nor the names of its contributors may be used to endorse or promote
242654012fSReza Sabdar  *	  products derived from this software without specific prior written
252654012fSReza Sabdar  *	  permission.
262654012fSReza Sabdar  *
272654012fSReza Sabdar  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
282654012fSReza Sabdar  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
292654012fSReza Sabdar  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
302654012fSReza Sabdar  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
312654012fSReza Sabdar  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
322654012fSReza Sabdar  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
332654012fSReza Sabdar  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
342654012fSReza Sabdar  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
352654012fSReza Sabdar  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
362654012fSReza Sabdar  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
372654012fSReza Sabdar  * POSSIBILITY OF SUCH DAMAGE.
382654012fSReza Sabdar  */
392654012fSReza Sabdar 
402654012fSReza Sabdar /*
412654012fSReza Sabdar  * This file defines macros and constants related to traversing file
422654012fSReza Sabdar  * system hieratchy in post-order, pre-order and level-order ways.
432654012fSReza Sabdar  */
442654012fSReza Sabdar 
452654012fSReza Sabdar #ifndef _TRAVERSE_H_
462654012fSReza Sabdar #define	_TRAVERSE_H_
472654012fSReza Sabdar 
482654012fSReza Sabdar #ifdef __cplusplus
492654012fSReza Sabdar extern "C" {
502654012fSReza Sabdar #endif
512654012fSReza Sabdar 
522654012fSReza Sabdar /*
532654012fSReza Sabdar  * Library functions for traversing file system hierarchy in
542654012fSReza Sabdar  * post-order, pre-order and level-order.
552654012fSReza Sabdar  *
562654012fSReza Sabdar  * This example will be used in the following descriptions.
572654012fSReza Sabdar  * All alphabetical entries are directory and all the numerical
582654012fSReza Sabdar  * entries are non-directory entries.
592654012fSReza Sabdar  *
602654012fSReza Sabdar  * AAA
612654012fSReza Sabdar  * AAA/BBB
622654012fSReza Sabdar  * AAA/BBB/1
632654012fSReza Sabdar  * AAA/BBB/2
642654012fSReza Sabdar  * AAA/BBB/3
652654012fSReza Sabdar  * AAA/CCC
662654012fSReza Sabdar  * AAA/CCC/EEE
672654012fSReza Sabdar  * AAA/CCC/EEE/4
682654012fSReza Sabdar  * AAA/CCC/EEE/5
692654012fSReza Sabdar  * AAA/CCC/EEE/6
702654012fSReza Sabdar  * AAA/CCC/EEE/7
712654012fSReza Sabdar  * AAA/CCC/EEE/8
722654012fSReza Sabdar  * AAA/CCC/9
732654012fSReza Sabdar  * AAA/XXX
742654012fSReza Sabdar  * AAA/ZZZ
752654012fSReza Sabdar  * AAA/10
762654012fSReza Sabdar  * AAA/11
772654012fSReza Sabdar  * AAA/12
782654012fSReza Sabdar  * AAA/13
792654012fSReza Sabdar  *
802654012fSReza Sabdar  * Each traversing function gets an argument of 'struct fs_traverse *'
812654012fSReza Sabdar  * type.  The fields of this structure are explained below.
822654012fSReza Sabdar  *
832654012fSReza Sabdar  * For each entry while traversing, the callback function is
842654012fSReza Sabdar  * called and three arguments are passed to it.  The argument
852654012fSReza Sabdar  * specified in the struct fs_traverse, a struct fst_node for the
862654012fSReza Sabdar  * path and a struct fst_node for the entry.
872654012fSReza Sabdar  *
882654012fSReza Sabdar  * For the root of the traversing, the fields of struct fst_node
892654012fSReza Sabdar  * of the entry are all NULL.
902654012fSReza Sabdar  *
912654012fSReza Sabdar  * If the path to be traversed is not a directory, the callback
922654012fSReza Sabdar  * function is called on it.  The fields of the 'struct fst_node'
932654012fSReza Sabdar  * argument for entry are all NULL.
942654012fSReza Sabdar  *
952654012fSReza Sabdar  *
962654012fSReza Sabdar  * POST-ORDER:
972654012fSReza Sabdar  * Post-order means that the directory is processed after all
982654012fSReza Sabdar  * its children are processed.  Post-order traversing of the above
992654012fSReza Sabdar  * hierarchy will be like this:
1002654012fSReza Sabdar  *
1012654012fSReza Sabdar  * AAA/BBB, 1
1022654012fSReza Sabdar  * AAA/BBB, 2
1032654012fSReza Sabdar  * AAA/BBB, 3
1042654012fSReza Sabdar  * AAA, BBB
1052654012fSReza Sabdar  * AAA/CCC/EEE, 6
1062654012fSReza Sabdar  * AAA/CCC/EEE, 5
1072654012fSReza Sabdar  * AAA/CCC/EEE, 8
1082654012fSReza Sabdar  * AAA/CCC/EEE, 4
1092654012fSReza Sabdar  * AAA/CCC/EEE, 7
1102654012fSReza Sabdar  * AAA/CCC, EEE
1112654012fSReza Sabdar  * AAA/CCC, 9
1122654012fSReza Sabdar  * AAA, CCC
1132654012fSReza Sabdar  * AAA, XXX
1142654012fSReza Sabdar  * AAA, ZZZ
1152654012fSReza Sabdar  * AAA, 10
1162654012fSReza Sabdar  * AAA, 11
1172654012fSReza Sabdar  * AAA, 12
1182654012fSReza Sabdar  * AAA, 13
1192654012fSReza Sabdar  * AAA
1202654012fSReza Sabdar  *
1212654012fSReza Sabdar  * In post-order the callback function returns 0 on success
1222654012fSReza Sabdar  * or non-zero to stop further traversing the hierarchy.
1232654012fSReza Sabdar  *
1242654012fSReza Sabdar  * One of the applications of post-order traversing of a
1252654012fSReza Sabdar  * hierarchy can be deleting the hierarchy from the file system.
1262654012fSReza Sabdar  *
1272654012fSReza Sabdar  *
1282654012fSReza Sabdar  * PRE-ORDER:
1292654012fSReza Sabdar  * Pre-order means that the directory is processed before
1302654012fSReza Sabdar  * any of its children are processed.  Pre-order traversing of
1312654012fSReza Sabdar  * the above hierarchy will be like this:
1322654012fSReza Sabdar  *
1332654012fSReza Sabdar  * AAA
1342654012fSReza Sabdar  * AAA, BBB
1352654012fSReza Sabdar  * AAA/BBB, 1
1362654012fSReza Sabdar  * AAA/BBB, 2
1372654012fSReza Sabdar  * AAA/BBB, 3
1382654012fSReza Sabdar  * AAA, CCC
1392654012fSReza Sabdar  * AAA/CCC, EEE
1402654012fSReza Sabdar  * AAA/CCC/EEE, 6
1412654012fSReza Sabdar  * AAA/CCC/EEE, 5
1422654012fSReza Sabdar  * AAA/CCC/EEE, 8
1432654012fSReza Sabdar  * AAA/CCC/EEE, 4
1442654012fSReza Sabdar  * AAA/CCC/EEE, 7
1452654012fSReza Sabdar  * AAA/CCC, 9
1462654012fSReza Sabdar  * AAA, XXX
1472654012fSReza Sabdar  * AAA, ZZZ
1482654012fSReza Sabdar  * AAA, 10
1492654012fSReza Sabdar  * AAA, 11
1502654012fSReza Sabdar  * AAA, 12
1512654012fSReza Sabdar  * AAA, 13
1522654012fSReza Sabdar  *
1532654012fSReza Sabdar  * In pre-order, the callback function can return 3 values:
1542654012fSReza Sabdar  *     0: means that the traversing should continue.
1552654012fSReza Sabdar  *
1562654012fSReza Sabdar  *     < 0: means that the traversing should be stopped immediately.
1572654012fSReza Sabdar  *
1582654012fSReza Sabdar  *     FST_SKIP: means that no further entries of this directory
1592654012fSReza Sabdar  *         should be processed.  Traversing continues with the
1602654012fSReza Sabdar  *         next directory of the same level.  For example, if
1612654012fSReza Sabdar  *         callback returns FST_SKIP on AAA/BBB, the callback
1622654012fSReza Sabdar  *         will not be called on 1, 2, 3 and traversing will
1632654012fSReza Sabdar  *         continue with AAA/CCC.
1642654012fSReza Sabdar  *
1652654012fSReza Sabdar  *
1662654012fSReza Sabdar  * LEVEL-ORDER:
1672654012fSReza Sabdar  * This is a special case of pre-order.  In this method,
1682654012fSReza Sabdar  * all the non-directory entries of a directory are processed
1692654012fSReza Sabdar  * and then come the directory entries.  Level-order traversing
1702654012fSReza Sabdar  * of the above hierarchy will be like this:
1712654012fSReza Sabdar  *
1722654012fSReza Sabdar  * AAA
1732654012fSReza Sabdar  * AAA, 10
1742654012fSReza Sabdar  * AAA, 11
1752654012fSReza Sabdar  * AAA, 12
1762654012fSReza Sabdar  * AAA, 13
1772654012fSReza Sabdar  * AAA, BBB
1782654012fSReza Sabdar  * AAA/BBB, 1
1792654012fSReza Sabdar  * AAA/BBB, 2
1802654012fSReza Sabdar  * AAA/BBB, 3
1812654012fSReza Sabdar  * AAA, CCC
1822654012fSReza Sabdar  * AAA/CCC, 9
1832654012fSReza Sabdar  * AAA/CCC, EEE
1842654012fSReza Sabdar  * AAA/CCC/EEE, 6
1852654012fSReza Sabdar  * AAA/CCC/EEE, 5
1862654012fSReza Sabdar  * AAA/CCC/EEE, 8
1872654012fSReza Sabdar  * AAA/CCC/EEE, 4
1882654012fSReza Sabdar  * AAA/CCC/EEE, 7
1892654012fSReza Sabdar  * AAA, XXX
1902654012fSReza Sabdar  * AAA, ZZZ
1912654012fSReza Sabdar  *
1922654012fSReza Sabdar  * The rules of pre-order for the return value of callback
1932654012fSReza Sabdar  * function applies for level-order.
1942654012fSReza Sabdar  */
1952654012fSReza Sabdar 
1962654012fSReza Sabdar #include <sys/types.h>
1972654012fSReza Sabdar #include <sys/stat.h>
1982654012fSReza Sabdar #include "tlm.h"
1992654012fSReza Sabdar 
2002654012fSReza Sabdar /*
2012654012fSReza Sabdar  * To prune a directory when traversing it, this return
2022654012fSReza Sabdar  * value should be returned by the callback function in
2032654012fSReza Sabdar  * level-order and pre-order traversing.
2042654012fSReza Sabdar  *
2052654012fSReza Sabdar  * In level-order processing, this return value stops
2062654012fSReza Sabdar  * reading the rest of the directory and calling the callback
2072654012fSReza Sabdar  * function for them.  Traversing will continue with the next
2082654012fSReza Sabdar  * directory of the same level.  The children of the current
2092654012fSReza Sabdar  * directory will be pruned too.  For example on this ,
2102654012fSReza Sabdar  *
2112654012fSReza Sabdar  */
2122654012fSReza Sabdar #define	FST_SKIP	1
2132654012fSReza Sabdar 
2142654012fSReza Sabdar 
2152654012fSReza Sabdar #define	SKIP_ENTRY	2
2162654012fSReza Sabdar 
2172654012fSReza Sabdar 
2182654012fSReza Sabdar /*
2192654012fSReza Sabdar  * Directives for traversing file system.
2202654012fSReza Sabdar  *
2212654012fSReza Sabdar  * FST_STOP_ONERR: Stop travergins when stat fails on an entry.
2222654012fSReza Sabdar  * FST_STOP_ONLONG: Stop on detecting long path.
2232654012fSReza Sabdar  * FST_VERBOSE: Verbose running.
2242654012fSReza Sabdar  */
2252654012fSReza Sabdar #define	FST_STOP_ONERR		0x00000001
2262654012fSReza Sabdar #define	FST_STOP_ONLONG		0x00000002
2272654012fSReza Sabdar #define	FST_VERBOSE		0x80000000
2282654012fSReza Sabdar 
2292654012fSReza Sabdar 
2302654012fSReza Sabdar typedef void (*ft_log_t)();
2312654012fSReza Sabdar 
2322654012fSReza Sabdar 
2332654012fSReza Sabdar /*
2342654012fSReza Sabdar  * The arguments of traversing file system contains:
2352654012fSReza Sabdar  *     path: The physical path to be traversed.
2362654012fSReza Sabdar  *
2372654012fSReza Sabdar  *     lpath	The logical path to be passed to the callback
2382654012fSReza Sabdar  *         	function as path.
2392654012fSReza Sabdar  *         	If this is set to NULL, the default value will be
2402654012fSReza Sabdar  *         	the 'path'.
2412654012fSReza Sabdar  *
2422654012fSReza Sabdar  *         	For example, traversing '/v1.chkpnt/backup/home' as
2432654012fSReza Sabdar  *         	physical path can have a logical path of '/v1/home'.
2442654012fSReza Sabdar  *
2452654012fSReza Sabdar  *     flags	Show how the traversing should be done.
2462654012fSReza Sabdar  *         	Values of this field are of FST_ constants.
2472654012fSReza Sabdar  *
2482654012fSReza Sabdar  *     callbk	The callback function pointer.  The callback
2492654012fSReza Sabdar  *         	function is called like this:
2502654012fSReza Sabdar  *         	(*ft_callbk)(
2512654012fSReza Sabdar  *         		void *ft_arg,
2522654012fSReza Sabdar  *         		struct fst_node *path,
2532654012fSReza Sabdar  *         		struct fst_node *entry)
2542654012fSReza Sabdar  *
2552654012fSReza Sabdar  *     arg	The 'void *' argument to be passed to the call
2562654012fSReza Sabdar  *		back function.
2572654012fSReza Sabdar  *
2582654012fSReza Sabdar  *     logfp	The log function pointer.  This function
2592654012fSReza Sabdar  *         	is called to log the messages.
2602654012fSReza Sabdar  *         	Default is logf().
2612654012fSReza Sabdar  */
2622654012fSReza Sabdar typedef struct fs_traverse {
2632654012fSReza Sabdar 	char *ft_path;
2642654012fSReza Sabdar 	char *ft_lpath;
2652654012fSReza Sabdar 	unsigned int ft_flags;
2662654012fSReza Sabdar 	int (*ft_callbk)();
2672654012fSReza Sabdar 	void *ft_arg;
2682654012fSReza Sabdar 	ft_log_t ft_logfp;
2692654012fSReza Sabdar } fs_traverse_t;
2702654012fSReza Sabdar 
2712654012fSReza Sabdar /*
2722654012fSReza Sabdar  * Traversing Nodes.  For each path and node upon entry this
2732654012fSReza Sabdar  * structure is passed to the callback function.
2742654012fSReza Sabdar  */
2752654012fSReza Sabdar typedef struct fst_node {
2762654012fSReza Sabdar 	char *tn_path;
2772654012fSReza Sabdar 	fs_fhandle_t *tn_fh;
2782654012fSReza Sabdar 	struct stat64 *tn_st;
2792654012fSReza Sabdar } fst_node_t;
2802654012fSReza Sabdar 
2812654012fSReza Sabdar extern int traverse_post(fs_traverse_t *);
2822654012fSReza Sabdar extern int traverse_pre(fs_traverse_t *);
2832654012fSReza Sabdar extern int traverse_level(fs_traverse_t *);
2842654012fSReza Sabdar #undef	getdents
2852654012fSReza Sabdar extern int getdents(int, struct dirent *, size_t);
2862654012fSReza Sabdar #ifdef __cplusplus
2872654012fSReza Sabdar }
2882654012fSReza Sabdar #endif
2892654012fSReza Sabdar 
2902654012fSReza Sabdar #endif /* _TRAVERSE_H_ */
291