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