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