Splint fiddles.
[tools/librpm-tizen.git] / rpmio / fts.h
1 /*
2  * Copyright (c) 1989, 1993
3  *      The Regents of the University of California.  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  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 4. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *      @(#)fts.h       8.3 (Berkeley) 8/14/94
30  */
31
32 #ifndef _FTS_H
33 #define _FTS_H 1
34
35 #if defined(__GLIBC__)
36 #include <features.h>
37 #else
38
39 #   define __THROW
40 #ifdef  __cplusplus
41 # define __BEGIN_DECLS  extern "C" {
42 # define __END_DECLS    }
43 #else
44 # define __BEGIN_DECLS
45 # define __END_DECLS
46 #endif
47
48 #if defined(hpux)
49 # define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
50 # define        _INCLUDE_POSIX_SOURCE
51 # define        _LARGEFILE64_SOURCE
52 #endif
53
54 #if defined(sun)
55 # define _D_EXACT_NAMLEN(d) ((d)->d_reclen)
56 #endif
57
58 #endif
59
60 #include <sys/types.h>
61 #include <sys/stat.h>
62 #include <dirent.h>
63
64 typedef struct {
65 /*@owned@*/ /*@relnull@*/
66         struct _ftsent *fts_cur;        /*!< current node */
67 /*@owned@*/ /*@null@*/
68         struct _ftsent *fts_child;      /*!< linked list of children */
69 /*@owned@*/ /*@null@*/
70         struct _ftsent **fts_array;     /*!< sort array */
71         dev_t fts_dev;                  /*!< starting device # */
72 /*@owned@*/ /*@relnull@*/
73         char *fts_path;                 /*!< path for this descent */
74         int fts_rfd;                    /*!< fd for root */
75         int fts_pathlen;                /*!< sizeof(path) */
76         int fts_nitems;                 /*!< elements in the sort array */
77 /*@null@*/
78         int (*fts_compar) (const void *, const void *)
79                 /*@*/;                  /*!< compare fn */
80
81         DIR * (*fts_opendir) (const char * path)
82                 /*@globals fileSystem @*/
83                 /*@modifies fileSystem @*/;
84         struct dirent * (*fts_readdir) (DIR * dir)
85                 /*@globals fileSystem @*/
86                 /*@modifies *dir, fileSystem @*/;
87         int (*fts_closedir) (/*@only@*/ DIR * dir)
88                 /*@globals fileSystem @*/
89                 /*@modifies *dir, fileSystem @*/;
90         int (*fts_stat) (const char * path, /*@out@*/ struct stat * st)
91                 /*@globals fileSystem @*/
92                 /*@modifies *st, fileSystem @*/;
93         int (*fts_lstat) (const char * path, /*@out@*/ struct stat * st)
94                 /*@globals fileSystem @*/
95                 /*@modifies *st, fileSystem @*/;
96
97 #define FTS_COMFOLLOW   0x0001          /*!< follow command line symlinks */
98 #define FTS_LOGICAL     0x0002          /*!< logical walk */
99 #define FTS_NOCHDIR     0x0004          /*!< don't change directories */
100 #define FTS_NOSTAT      0x0008          /*!< don't get stat info */
101 #define FTS_PHYSICAL    0x0010          /*!< physical walk */
102 #define FTS_SEEDOT      0x0020          /*!< return dot and dot-dot */
103 #define FTS_XDEV        0x0040          /*!< don't cross devices */
104 #define FTS_WHITEOUT    0x0080          /*!< return whiteout information */
105 #define FTS_OPTIONMASK  0x00ff          /*!< valid user option mask */
106
107 #define FTS_NAMEONLY    0x0100          /*!< (private) child names only */
108 #define FTS_STOP        0x0200          /*!< (private) unrecoverable error */
109         int fts_options;                /*!< fts_open options, global flags */
110 } FTS;
111
112 typedef struct _ftsent {
113 /*@dependent@*/
114         struct _ftsent *fts_cycle;      /*!< cycle node */
115 /*@dependent@*/ /*@relnull@*/
116         struct _ftsent *fts_parent;     /*!< parent directory */
117 /*@dependent@*/ /*@null@*/
118         struct _ftsent *fts_link;       /*!< next file in directory */
119         long fts_number;                /*!< local numeric value */
120 /*@null@*/
121         void *fts_pointer;              /*!< local address value */
122 /*@dependent@*/
123         char *fts_accpath;              /*!< access path */
124 /*@dependent@*/
125         char *fts_path;                 /*!< root path */
126         int fts_errno;                  /*!< errno for this node */
127         int fts_symfd;                  /*!< fd for symlink */
128         u_short fts_pathlen;            /*!< strlen(fts_path) */
129         u_short fts_namelen;            /*!< strlen(fts_name) */
130
131         ino_t fts_ino;                  /*!< inode */
132         dev_t fts_dev;                  /*!< device */
133         nlink_t fts_nlink;              /*!< link count */
134
135 #define FTS_ROOTPARENTLEVEL     -1
136 #define FTS_ROOTLEVEL            0
137         short fts_level;                /*!< depth (-1 to N) */
138
139 #define FTS_D            1              /*!< preorder directory */
140 #define FTS_DC           2              /*!< directory that causes cycles */
141 #define FTS_DEFAULT      3              /*!< none of the above */
142 #define FTS_DNR          4              /*!< unreadable directory */
143 #define FTS_DOT          5              /*!< dot or dot-dot */
144 #define FTS_DP           6              /*!< postorder directory */
145 #define FTS_ERR          7              /*!< error; errno is set */
146 #define FTS_F            8              /*!< regular file */
147 #define FTS_INIT         9              /*!< initialized only */
148 #define FTS_NS          10              /*!< stat(2) failed */
149 #define FTS_NSOK        11              /*!< no stat(2) requested */
150 #define FTS_SL          12              /*!< symbolic link */
151 #define FTS_SLNONE      13              /*!< symbolic link without target */
152 #define FTS_W           14              /*!< whiteout object */
153         u_short fts_info;               /*!< user flags for FTSENT structure */
154
155 #define FTS_DONTCHDIR    0x01           /*!< don't chdir .. to the parent */
156 #define FTS_SYMFOLLOW    0x02           /*!< followed a symlink to get here */
157         u_short fts_flags;              /*!< private flags for FTSENT structure */
158
159 #define FTS_AGAIN        1              /*!< read node again */
160 #define FTS_FOLLOW       2              /*!< follow symbolic link */
161 #define FTS_NOINSTR      3              /*!< no instructions */
162 #define FTS_SKIP         4              /*!< discard node */
163         u_short fts_instr;              /*!< fts_set() instructions */
164
165 /*@dependent@*/
166         struct stat *fts_statp;         /*!< stat(2) information */
167         char fts_name[1];               /*!< file name */
168 } FTSENT;
169
170 __BEGIN_DECLS
171
172 /**
173  * Return list of children of the current node.
174  * @param sp            file hierarchy state
175  * @param instr
176  * @return              file set member
177  */
178 /*@dependent@*/ /*@null@*/
179 FTSENT  *Fts_children (FTS * sp, int instr) __THROW
180         /*@globals fileSystem, internalState @*/
181         /*@modifies *sp, fileSystem, internalState @*/;
182
183 /**
184  * Destroy a file hierarchy traversal handle.
185  * @param sp            file hierarchy state
186  * @return              0 on sucess, -1 on error
187  */
188 int      Fts_close (/*@only@*/ /*@null@*/ FTS * sp) __THROW
189         /*@globals fileSystem, internalState @*/
190         /*@modifies *sp, fileSystem, internalState @*/;
191
192 /**
193  * Create a handle for file hierarchy traversal.
194  * @param argv          paths that compose a logical file hierarchy
195  * @param options       traversal options
196  * @param compar        traversal ordering (or NULL)
197  * @return              file hierarchy state (or NULL on error)
198  */
199 /*@only@*/ /*@null@*/
200 FTS     *Fts_open (char * const * argv, int options,
201                    /*@null@*/
202                    int (*compar) (const FTSENT **, const FTSENT **)) __THROW
203         /*@*/;
204
205 /**
206  * Return next node in the file hierarchy traversal.
207  * @param sp            file hierarchy state
208  * @return              file set member
209  */
210 /*@null@*/
211 FTSENT  *Fts_read (/*@null@*/ FTS * sp) __THROW
212         /*@globals fileSystem, internalState @*/
213         /*@modifies *sp, fileSystem, internalState @*/;
214
215 /**
216  * Modify the traversal for a file set member.
217  * @param sp            file hierarchy state
218  * @param p             file set member
219  * @param instr         new disposition for file set member
220  * @return              0 on sucess, -1 on error
221  */
222 int      Fts_set (FTS * sp, FTSENT * p, int instr) __THROW
223         /*@modifies *p @*/;
224
225 __END_DECLS
226
227 #endif /* fts.h */