pkgsrc - initial commit
[pkgsrc.git] / archivers / libarchive / files / examples / minitar / tree.h
1 /*-
2  * Copyright (c) 2003-2004 Tim Kientzle
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer
10  *    in this position and unchanged.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 /*-
28  * A set of routines for traversing directory trees.
29  * Similar in concept to the fts library, but with a few
30  * important differences:
31  *    * Uses less memory.  In particular, fts stores an entire directory
32  *      in memory at a time.  This package only keeps enough subdirectory
33  *      information in memory to track the traversal.  Information
34  *      about non-directories is discarded as soon as possible.
35  *    * Supports very deep logical traversals.  The fts package
36  *      uses "non-chdir" approach for logical traversals.  This
37  *      package does use a chdir approach for logical traversals
38  *      and can therefore handle pathnames much longer than
39  *      PATH_MAX.
40  *    * Supports deep physical traversals "out of the box."
41  *      Due to the memory optimizations above, there's no need to
42  *      limit dir names to 32k.
43  */
44
45 #include <sys/stat.h>
46
47 struct tree;
48
49 struct tree *tree_open(const char *);
50 /* Returns TRUE if there is a next entry.  Zero if there is no next entry. */
51 int tree_next(struct tree *);
52 /* Return information about the current entry. */
53 int tree_current_depth(struct tree *);
54 /*
55  * The current full pathname, length of the full pathname,
56  * and a name that can be used to access the file.
57  * Because tree does use chdir extensively, the access path is
58  * almost never the same as the full current path.
59  */
60 const char *tree_current_path(struct tree *);
61 size_t tree_current_pathlen(struct tree *);
62 const char *tree_current_access_path(struct tree *);
63 /*
64  * Request the lstat() or stat() data for the current path.
65  * Since the tree package needs to do some of this anyway,
66  * you should take advantage of it here if you need it.
67  */
68 const struct stat *tree_current_stat(struct tree *);
69 const struct stat *tree_current_lstat(struct tree *);
70 /*
71  * Request that current entry be visited.  If you invoke it on every
72  * directory, you'll get a physical traversal.  This is ignored if the
73  * current entry isn't a directory or a link to a directory.  So, if
74  * you invoke this on every returned path, you'll get a full logical
75  * traversal.
76  */
77 void tree_descend(struct tree *);
78 void tree_close(struct tree *);