OSDN Git Service

LDP: Update original to LDP v3.68
[linuxjm/LDP_man-pages.git] / original / man3 / ftw.3
1 .\" Copyright (c) 1993 Michael Haardt (michael@moria.de)
2 .\" and copyright (c) 1999 Andries Brouwer (aeb@cwi.nl)
3 .\" and copyright (c) 2006 Justin Pryzby <justinpryzby@users.sf.net>
4 .\" and copyright (c) 2006 Michael Kerrisk <mtk.manpages@gmail.com>
5 .\"
6 .\" %%%LICENSE_START(GPLv2+_DOC_FULL)
7 .\" This is free documentation; you can redistribute it and/or
8 .\" modify it under the terms of the GNU General Public License as
9 .\" published by the Free Software Foundation; either version 2 of
10 .\" the License, or (at your option) any later version.
11 .\"
12 .\" The GNU General Public License's references to "object code"
13 .\" and "executables" are to be interpreted as the output of any
14 .\" document formatting or typesetting system, including
15 .\" intermediate and printed output.
16 .\"
17 .\" This manual is distributed in the hope that it will be useful,
18 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
19 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 .\" GNU General Public License for more details.
21 .\"
22 .\" You should have received a copy of the GNU General Public
23 .\" License along with this manual; if not, see
24 .\" <http://www.gnu.org/licenses/>.
25 .\" %%%LICENSE_END
26 .\"
27 .\" Modified Sun Jul 25 11:02:22 1993 by Rik Faith (faith@cs.unc.edu)
28 .\" 2006-05-24, Justin Pryzby <justinpryzby@users.sf.net>
29 .\"     document FTW_ACTIONRETVAL; include .SH "RETURN VALUE";
30 .\" 2006-05-24, Justin Pryzby <justinpryzby@users.sf.net> and
31 .\"     Michael Kerrisk <mtk.manpages@gmail.com>
32 .\"     reorganized and rewrote much of the page
33 .\" 2006-05-24, Michael Kerrisk <mtk.manpages@gmail.com>
34 .\"     Added an example program.
35 .TH FTW 3 2014-01-11 "Linux" "Linux Programmer's Manual"
36 .SH NAME
37 ftw, nftw \- file tree walk
38 .SH SYNOPSIS
39 .nf
40 .B #include <ftw.h>
41 .sp
42 .BI "int ftw(const char *" dirpath ,
43 .BI "        int (*" fn ") (const char *" fpath ", const struct stat *" sb ,
44 .BI "                   int " typeflag ),
45 .BI "        int " nopenfd );
46 .sp
47 .BR "#define _XOPEN_SOURCE 500" "   /* See feature_test_macros(7) */"
48 .B #include <ftw.h>
49 .sp
50 .BI "int nftw(const char *" dirpath ,
51 .BI "        int (*" fn ") (const char *" fpath ", const struct stat *" sb ,
52 .BI "                   int " typeflag ", struct FTW *" ftwbuf ),
53 .BI "        int " nopenfd ", int " flags );
54 .fi
55 .SH DESCRIPTION
56 .BR ftw ()
57 walks through the directory tree that is
58 located under the directory \fIdirpath\fP,
59 and calls \fIfn\fP() once for each entry in the tree.
60 By default, directories are handled before the files and
61 subdirectories they contain (preorder traversal).
62
63 To avoid using up all of the calling process's file descriptors,
64 \fInopenfd\fP specifies the maximum number of directories that
65 .BR ftw ()
66 will hold open simultaneously.
67 When
68 the search depth exceeds this,
69 .BR ftw ()
70 will become slower because
71 directories have to be closed and reopened.
72 .BR ftw ()
73 uses at most
74 one file descriptor for each level in the directory tree.
75
76 For each entry found in the tree,
77 .BR ftw ()
78 calls
79 \fIfn\fP() with three arguments:
80 .IR fpath ,
81 .IR sb ,
82 and
83 .IR typeflag .
84 .I fpath
85 is the pathname of the entry,
86 and is expressed either as a pathname relative to the calling process's
87 current working directory at the time of the call to
88 .BR ftw (),
89 if
90 .IR dirpath
91 was expressed as a relative pathname,
92 or as an absolute pathname, if
93 .I dirpath
94 was expressed as an absolute pathname.
95 .I sb
96 is a pointer to the
97 .I stat
98 structure returned by a call to
99 .BR stat (2)
100 for
101 .IR fpath .
102 .I typeflag
103 is an integer that has one of the following values:
104 .TP
105 .B FTW_F
106 .I fpath
107 is a regular file.
108 .TP
109 .B FTW_D
110 .I fpath
111 is a directory.
112 .TP
113 .B FTW_DNR
114 .I fpath
115 is a directory which can't be read.
116 .TP
117 .B FTW_NS
118 The
119 .BR stat (2)
120 call failed on
121 .IR fpath ,
122 which is not a symbolic link.
123 The probable cause for this is that the caller had read permission
124 on the parent directory, so that the filename
125 .I fpath
126 could be seen,
127 but did not have execute permission,
128 so that the file could not be reached for
129 .BR stat (2).
130 .sp
131 If
132 .I fpath
133 is a symbolic link and
134 .BR stat (2)
135 failed, POSIX.1-2001 states
136 that it is undefined whether \fBFTW_NS\fP or \fBFTW_SL\fP (see below)
137 is passed in
138 .IR typeflag .
139 .PP
140 To stop the tree walk, \fIfn\fP() returns a nonzero value; this
141 value will become the return value of
142 .BR ftw ().
143 As long as \fIfn\fP() returns 0,
144 .BR ftw ()
145 will continue either until it has traversed the entire tree,
146 in which case it will return zero,
147 or until it encounters an error (such as a
148 .BR malloc (3)
149 failure), in which case it will return \-1.
150 .PP
151 Because
152 .BR ftw ()
153 uses dynamic data structures, the only safe way to
154 exit out of a tree walk is to return a nonzero value from \fIfn\fP().
155 To allow a signal to terminate the walk without causing a memory leak,
156 have the handler set a global flag that is checked by \fIfn\fP().
157 \fIDon't\fP use
158 .BR longjmp (3)
159 unless the program is going to terminate.
160 .SS nftw()
161 The function
162 .BR nftw ()
163 is the same as
164 .BR ftw (),
165 except that it has one additional argument, \fIflags\fP,
166 and calls \fIfn\fP() with one more argument, \fIftwbuf\fP.
167
168 This \fIflags\fP argument is formed by ORing zero or more of the
169 following flags:
170 .TP
171 .BR FTW_ACTIONRETVAL " (since glibc 2.3.3)"
172 If this glibc-specific flag is set, then
173 .BR nftw ()
174 handles the return value from
175 .IR fn ()
176 differently.
177 .IR fn ()
178 should return one of the following values:
179 .RS
180 .TP
181 .B FTW_CONTINUE
182 Instructs
183 .BR nftw ()
184 to continue normally.
185 .TP
186 .B FTW_SKIP_SIBLINGS
187 If \fIfn\fP() returns this value, then
188 siblings of the current entry will be skipped,
189 and processing continues in the parent.
190 .\" If \fBFTW_DEPTH\fP
191 .\" is set, the entry's parent directory is processed next (with
192 .\" \fIflag\fP set to \fBFTW_DP\fP).
193 .TP
194 .B FTW_SKIP_SUBTREE
195 If \fIfn\fP() is called with an entry that is a directory
196 (\fItypeflag\fP is \fBFTW_D\fP), this return
197 value will prevent objects within that directory from being passed as
198 arguments to \fIfn\fP().
199 .BR nftw ()
200 continues processing with the next sibling of the directory.
201 .TP
202 .B FTW_STOP
203 Causes
204 .BR nftw ()
205 to return immediately with the return value
206 \fBFTW_STOP\fP.
207 .PP
208 Other return values could be associated with new actions in the future;
209 \fIfn\fP() should not return values other than those listed above.
210
211 The feature test macro
212 .B _GNU_SOURCE
213 must be defined
214 (before including
215 .I any
216 header files)
217 in order to
218 obtain the definition of \fBFTW_ACTIONRETVAL\fP from \fI<ftw.h>\fP.
219 .RE
220 .TP
221 .B FTW_CHDIR
222 If set, do a
223 .BR chdir (2)
224 to each directory before handling its contents.
225 This is useful if the program needs to perform some action
226 in the directory in which \fIfpath\fP resides.
227 .TP
228 .B FTW_DEPTH
229 If set, do a post-order traversal, that is, call \fIfn\fP() for
230 the directory itself \fIafter\fP handling the contents of the directory
231 and its subdirectories.
232 (By default, each directory is handled \fIbefore\fP its contents.)
233 .TP
234 .B FTW_MOUNT
235 If set, stay within the same filesystem
236 (i.e., do not cross mount points).
237 .TP
238 .B FTW_PHYS
239 If set, do not follow symbolic links.
240 (This is what you want.)
241 If not set, symbolic links are followed, but no file is reported twice.
242 .sp
243 If \fBFTW_PHYS\fP is not set, but \fBFTW_DEPTH\fP is set,
244 then the function
245 .IR fn ()
246 is never called for a directory that would be a descendant of itself.
247 .LP
248 For each entry in the directory tree,
249 .BR nftw ()
250 calls
251 .IR fn ()
252 with four arguments.
253 .I fpath
254 and
255 .I sb
256 are as for
257 .BR ftw ().
258 .I typeflag
259 may receive any of the same values as with
260 .BR ftw (),
261 or any of the following values:
262 .TP
263 .B FTW_DP
264 .I fpath
265 is a directory, and \fBFTW_DEPTH\fP was specified in \fIflags\fP.
266 (If
267 .B FTW_DEPTH
268 was not specified in
269 .IR flags ,
270 then directories will always be visited with
271 .I typeflag
272 set to
273 .BR FTW_D .)
274 All of the files
275 and subdirectories within \fIfpath\fP have been processed.
276 .TP
277 .B FTW_SL
278 .I fpath
279 is a symbolic link, and \fBFTW_PHYS\fP was set in \fIflags\fP.
280 .\" To obtain the definition of this constant from
281 .\" .IR <ftw.h> ,
282 .\" either
283 .\" .B _BSD_SOURCE
284 .\" must be defined, or
285 .\" .BR _XOPEN_SOURCE
286 .\" must be defined with a value of 500 or more.
287 .TP
288 .B FTW_SLN
289 .I fpath
290 is a symbolic link pointing to a nonexistent file.
291 (This occurs only if \fBFTW_PHYS\fP is not set.)
292 .LP
293 The fourth argument that
294 .BR nftw ()
295 supplies when calling
296 \fIfn\fP()
297 is a structure of type \fIFTW\fP:
298 .in +4n
299 .nf
300
301 struct FTW {
302     int base;
303     int level;
304 };
305
306 .fi
307 .in
308 .I base
309 is the offset of the filename (i.e., basename component)
310 in the pathname given in
311 .IR fpath .
312 .I level
313 is the depth of
314 .I fpath
315 in the directory tree, relative to the root of the tree
316 .RI ( dirpath ,
317 which has depth 0).
318 .SH RETURN VALUE
319 These functions return 0 on success, and \-1 if an error occurs.
320
321 If \fIfn\fP() returns nonzero,
322 then the tree walk is terminated and the value returned by \fIfn\fP()
323 is returned as the result of
324 .BR ftw ()
325 or
326 .BR nftw ().
327
328 If
329 .BR nftw ()
330 is called with the \fBFTW_ACTIONRETVAL\fP flag,
331 then the only nonzero value that should be used by \fIfn\fP()
332 to terminate the tree walk is \fBFTW_STOP\fP,
333 and that value is returned as the result of
334 .BR nftw ().
335 .SH CONFORMING TO
336 POSIX.1-2001, SVr4, SUSv1.
337 POSIX.1-2008 marks
338 .BR ftw ()
339 as obsolete.
340 .SH NOTES
341 POSIX.1-2001 note that the results are unspecified if
342 .I fn
343 does not preserve the current working directory.
344 .PP
345 The function
346 .BR nftw ()
347 and the use of \fBFTW_SL\fP with
348 .BR ftw ()
349 were introduced in SUSv1.
350 .LP
351 On some systems
352 .BR ftw ()
353 will never use \fBFTW_SL\fP, on other systems \fBFTW_SL\fP occurs only
354 for symbolic links that do not point to an existing file,
355 and again on other systems
356 .BR ftw ()
357 will use \fBFTW_SL\fP for each symbolic link.
358 For predictable control, use
359 .BR nftw ().
360 .LP
361 Under Linux, libc4 and libc5 and glibc 2.0.6 will
362 use \fBFTW_F\fP for all objects (files, symbolic links, FIFOs, etc.)
363 that can be stat'ed but are not a directory.
364
365 The function
366 .BR nftw ()
367 is available since glibc 2.1.
368
369 \fBFTW_ACTIONRETVAL\fP is glibc-specific.
370 .SH EXAMPLE
371 The following program traverses the directory tree under the path named
372 in its first command-line argument, or under the current directory
373 if no argument is supplied.
374 It displays various information about each file.
375 The second command-line argument can be used to specify characters that
376 control the value assigned to the \fIflags\fP
377 argument when calling
378 .BR nftw ().
379 .SS Program source
380 .nf
381 #define _XOPEN_SOURCE 500
382 #include <ftw.h>
383 #include <stdio.h>
384 #include <stdlib.h>
385 #include <string.h>
386 #include <stdint.h>
387
388 static int
389 display_info(const char *fpath, const struct stat *sb,
390              int tflag, struct FTW *ftwbuf)
391 {
392     printf("%\-3s %2d %7jd   %\-40s %d %s\\n",
393         (tflag == FTW_D) ?   "d"   : (tflag == FTW_DNR) ? "dnr" :
394         (tflag == FTW_DP) ?  "dp"  : (tflag == FTW_F) ?   "f" :
395         (tflag == FTW_NS) ?  "ns"  : (tflag == FTW_SL) ?  "sl" :
396         (tflag == FTW_SLN) ? "sln" : "???",
397         ftwbuf\->level, (intmax_t) sb\->st_size,
398         fpath, ftwbuf\->base, fpath + ftwbuf\->base);
399     return 0;           /* To tell nftw() to continue */
400 }
401
402 int
403 main(int argc, char *argv[])
404 {
405     int flags = 0;
406
407     if (argc > 2 && strchr(argv[2], \(aqd\(aq) != NULL)
408         flags |= FTW_DEPTH;
409     if (argc > 2 && strchr(argv[2], \(aqp\(aq) != NULL)
410         flags |= FTW_PHYS;
411
412     if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags)
413             == \-1) {
414         perror("nftw");
415         exit(EXIT_FAILURE);
416     }
417     exit(EXIT_SUCCESS);
418 }
419 .fi
420 .SH SEE ALSO
421 .BR stat (2),
422 .BR fts (3),
423 .BR readdir (3)
424 .SH COLOPHON
425 This page is part of release 3.68 of the Linux
426 .I man-pages
427 project.
428 A description of the project,
429 information about reporting bugs,
430 and the latest version of this page,
431 can be found at
432 \%http://www.kernel.org/doc/man\-pages/.