xref: /freebsd/lib/libc/gen/ftw.3 (revision fa9896e082a1046ff4fbc75fcba4d18d1f2efc19)
1c8f7bbe3SDavid Schultz.\"	$OpenBSD: ftw.3,v 1.5 2004/01/25 14:48:32 jmc Exp $
2c8f7bbe3SDavid Schultz.\"
3c8f7bbe3SDavid Schultz.\" Copyright (c) 2003 Todd C. Miller <Todd.Miller@courtesan.com>
4c8f7bbe3SDavid Schultz.\"
5c8f7bbe3SDavid Schultz.\" Permission to use, copy, modify, and distribute this software for any
6c8f7bbe3SDavid Schultz.\" purpose with or without fee is hereby granted, provided that the above
7c8f7bbe3SDavid Schultz.\" copyright notice and this permission notice appear in all copies.
8c8f7bbe3SDavid Schultz.\"
9c8f7bbe3SDavid Schultz.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10c8f7bbe3SDavid Schultz.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11c8f7bbe3SDavid Schultz.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12c8f7bbe3SDavid Schultz.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13c8f7bbe3SDavid Schultz.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14c8f7bbe3SDavid Schultz.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15c8f7bbe3SDavid Schultz.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16c8f7bbe3SDavid Schultz.\"
17c8f7bbe3SDavid Schultz.\" Sponsored in part by the Defense Advanced Research Projects
18c8f7bbe3SDavid Schultz.\" Agency (DARPA) and Air Force Research Laboratory, Air Force
19c8f7bbe3SDavid Schultz.\" Materiel Command, USAF, under agreement number F39502-99-1-0512.
20c8f7bbe3SDavid Schultz.\"
21*18a9889fSMateusz Piotrowski.Dd March 12, 2020
22c8f7bbe3SDavid Schultz.Dt FTW 3
23c8f7bbe3SDavid Schultz.Os
24c8f7bbe3SDavid Schultz.Sh NAME
25c8f7bbe3SDavid Schultz.Nm ftw , nftw
26c8f7bbe3SDavid Schultz.Nd traverse (walk) a file tree
27c8f7bbe3SDavid Schultz.Sh SYNOPSIS
281c5f1e7aSRuslan Ermilov.In ftw.h
29c8f7bbe3SDavid Schultz.Ft int
30c8f7bbe3SDavid Schultz.Fo ftw
31c8f7bbe3SDavid Schultz.Fa "const char *path"
321c5f1e7aSRuslan Ermilov.Fa "int \*[lp]*fn\*[rp]\*[lp]const char *, const struct stat *, int\*[rp]"
33c8f7bbe3SDavid Schultz.Fa "int maxfds"
34c8f7bbe3SDavid Schultz.Fc
35c8f7bbe3SDavid Schultz.Ft int
36c8f7bbe3SDavid Schultz.Fo nftw
37c8f7bbe3SDavid Schultz.Fa "const char *path"
3816a97b85SRuslan Ermilov.Fa "int \*[lp]*fn\*[rp]\*[lp]const char *, const struct stat *, int, struct FTW *\*[rp]"
39c8f7bbe3SDavid Schultz.Fa "int maxfds"
40c8f7bbe3SDavid Schultz.Fa "int flags"
41c8f7bbe3SDavid Schultz.Fc
42c8f7bbe3SDavid Schultz.Sh DESCRIPTION
43c8f7bbe3SDavid SchultzThe
44c8f7bbe3SDavid Schultz.Fn ftw
45c8f7bbe3SDavid Schultzand
46c8f7bbe3SDavid Schultz.Fn nftw
47c8f7bbe3SDavid Schultzfunctions traverse (walk) the directory hierarchy rooted in
48c8f7bbe3SDavid Schultz.Fa path .
49c8f7bbe3SDavid SchultzFor each object in the hierarchy, these functions call the function
50c8f7bbe3SDavid Schultzpointed to by
51c8f7bbe3SDavid Schultz.Fa fn .
52c8f7bbe3SDavid SchultzThe
53c8f7bbe3SDavid Schultz.Fn ftw
541c5f1e7aSRuslan Ermilovfunction passes this function a pointer to a
551c5f1e7aSRuslan Ermilov.Dv NUL Ns
561c5f1e7aSRuslan Ermilov-terminated string containing
571c5f1e7aSRuslan Ermilovthe name of the object, a pointer to a
581c5f1e7aSRuslan Ermilov.Vt stat
591c5f1e7aSRuslan Ermilovstructure corresponding to the
60c8f7bbe3SDavid Schultzobject, and an integer flag.
61c8f7bbe3SDavid SchultzThe
62c8f7bbe3SDavid Schultz.Fn nftw
63c8f7bbe3SDavid Schultzfunction passes the aforementioned arguments plus a pointer to a
641c5f1e7aSRuslan Ermilov.Vt FTW
65c8f7bbe3SDavid Schultzstructure as defined by
661c5f1e7aSRuslan Ermilov.In ftw.h
67c8f7bbe3SDavid Schultz(shown below):
68c8f7bbe3SDavid Schultz.Bd -literal
69c8f7bbe3SDavid Schultzstruct FTW {
70c8f7bbe3SDavid Schultz    int base;	/* offset of basename into pathname */
71c8f7bbe3SDavid Schultz    int level;	/* directory depth relative to starting point */
72c8f7bbe3SDavid Schultz};
73c8f7bbe3SDavid Schultz.Ed
74c8f7bbe3SDavid Schultz.Pp
75c8f7bbe3SDavid SchultzPossible values for the flag passed to
76c8f7bbe3SDavid Schultz.Fa fn
77c8f7bbe3SDavid Schultzare:
781c5f1e7aSRuslan Ermilov.Bl -tag -width ".Dv FTW_DNR"
79c8f7bbe3SDavid Schultz.It Dv FTW_F
80c8f7bbe3SDavid SchultzA regular file.
81c8f7bbe3SDavid Schultz.It Dv FTW_D
82c8f7bbe3SDavid SchultzA directory being visited in pre-order.
83c8f7bbe3SDavid Schultz.It Dv FTW_DNR
84c8f7bbe3SDavid SchultzA directory which cannot be read.
85c8f7bbe3SDavid SchultzThe directory will not be descended into.
86c8f7bbe3SDavid Schultz.It Dv FTW_DP
87c8f7bbe3SDavid SchultzA directory being visited in post-order
880aee91e1SChristian Brueffer.Po Fn nftw
890aee91e1SChristian Bruefferonly
900aee91e1SChristian Brueffer.Pc .
91c8f7bbe3SDavid Schultz.It Dv FTW_NS
92c8f7bbe3SDavid SchultzA file for which no
93c8f7bbe3SDavid Schultz.Xr stat 2
94c8f7bbe3SDavid Schultzinformation was available.
951c5f1e7aSRuslan ErmilovThe contents of the
961c5f1e7aSRuslan Ermilov.Vt stat
971c5f1e7aSRuslan Ermilovstructure are undefined.
98c8f7bbe3SDavid Schultz.It Dv FTW_SL
99c8f7bbe3SDavid SchultzA symbolic link.
100c8f7bbe3SDavid Schultz.It Dv FTW_SLN
101c8f7bbe3SDavid SchultzA symbolic link with a non-existent target
1020aee91e1SChristian Brueffer.Po Fn nftw
1030aee91e1SChristian Bruefferonly
1040aee91e1SChristian Brueffer.Pc .
105c8f7bbe3SDavid Schultz.El
106c8f7bbe3SDavid Schultz.Pp
107c8f7bbe3SDavid SchultzThe
108c8f7bbe3SDavid Schultz.Fn ftw
109c8f7bbe3SDavid Schultzfunction traverses the tree in pre-order.
110c8f7bbe3SDavid SchultzThat is, it processes the directory before the directory's contents.
111c8f7bbe3SDavid Schultz.Pp
112c8f7bbe3SDavid SchultzThe
113c8f7bbe3SDavid Schultz.Fa maxfds
114c8f7bbe3SDavid Schultzargument specifies the maximum number of file descriptors
115c8f7bbe3SDavid Schultzto keep open while traversing the tree.
116c8f7bbe3SDavid SchultzIt has no effect in this implementation.
117c8f7bbe3SDavid Schultz.Pp
118c8f7bbe3SDavid SchultzThe
119c8f7bbe3SDavid Schultz.Fn nftw
120c8f7bbe3SDavid Schultzfunction has an additional
121c8f7bbe3SDavid Schultz.Fa flags
122c8f7bbe3SDavid Schultzargument with the following possible values:
1231c5f1e7aSRuslan Ermilov.Bl -tag -width ".Dv FTW_MOUNT"
124c8f7bbe3SDavid Schultz.It Dv FTW_PHYS
1251c5f1e7aSRuslan ErmilovPhysical walk, do not follow symbolic links.
126c8f7bbe3SDavid Schultz.It Dv FTW_MOUNT
127c8f7bbe3SDavid SchultzThe walk will not cross a mount point.
128c8f7bbe3SDavid Schultz.It FTW_DEPTH
129c8f7bbe3SDavid SchultzProcess directories in post-order.
130c8f7bbe3SDavid SchultzContents of a directory are visited before the directory itself.
131c8f7bbe3SDavid SchultzBy default,
132c8f7bbe3SDavid Schultz.Fn nftw
133c8f7bbe3SDavid Schultztraverses the tree in pre-order.
134c8f7bbe3SDavid Schultz.It FTW_CHDIR
135c8f7bbe3SDavid SchultzChange to a directory before reading it.
136c8f7bbe3SDavid SchultzBy default,
137c8f7bbe3SDavid Schultz.Fn nftw
138c8f7bbe3SDavid Schultzwill change its starting directory.
139c8f7bbe3SDavid SchultzThe current working directory will be restored to its original value before
140c8f7bbe3SDavid Schultz.Fn nftw
141c8f7bbe3SDavid Schultzreturns.
142c8f7bbe3SDavid Schultz.El
143c8f7bbe3SDavid Schultz.Sh RETURN VALUES
144c8f7bbe3SDavid SchultzIf the tree was traversed successfully, the
145c8f7bbe3SDavid Schultz.Fn ftw
146c8f7bbe3SDavid Schultzand
147c8f7bbe3SDavid Schultz.Fn nftw
148c8f7bbe3SDavid Schultzfunctions return 0.
149c8f7bbe3SDavid SchultzIf the function pointed to by
150c8f7bbe3SDavid Schultz.Fa fn
151c8f7bbe3SDavid Schultzreturns a non-zero value,
152c8f7bbe3SDavid Schultz.Fn ftw
153c8f7bbe3SDavid Schultzand
154c8f7bbe3SDavid Schultz.Fn nftw
155c8f7bbe3SDavid Schultzwill stop processing the tree and return the value from
156c8f7bbe3SDavid Schultz.Fa fn .
157c8f7bbe3SDavid SchultzBoth functions return \-1 if an error is detected.
158d4d63c89SMateusz Piotrowski.Sh EXAMPLES
159d4d63c89SMateusz PiotrowskiFollowing there is an example that shows how
160d4d63c89SMateusz Piotrowski.Nm nftw
161d4d63c89SMateusz Piotrowskican be used.
162d4d63c89SMateusz PiotrowskiIt traverses the file tree starting at the directory pointed
163d4d63c89SMateusz Piotrowskiby the only program argument and shows the complete path and a brief
164d4d63c89SMateusz Piotrowskiindicator about the file type.
165d4d63c89SMateusz Piotrowski.Bd -literal -offset 2n
166d4d63c89SMateusz Piotrowski#include <ftw.h>
167d4d63c89SMateusz Piotrowski#include <stdio.h>
168d4d63c89SMateusz Piotrowski#include <sysexits.h>
169d4d63c89SMateusz Piotrowski
170d4d63c89SMateusz Piotrowskiint
171d4d63c89SMateusz Piotrowskinftw_callback(const char *path, const struct stat *sb, int typeflag, struct FTW *ftw)
172d4d63c89SMateusz Piotrowski{
173d4d63c89SMateusz Piotrowski	char type;
174d4d63c89SMateusz Piotrowski
175d4d63c89SMateusz Piotrowski	switch(typeflag) {
176d4d63c89SMateusz Piotrowski	case FTW_F:
177d4d63c89SMateusz Piotrowski		type = 'F';
178d4d63c89SMateusz Piotrowski		break;
179d4d63c89SMateusz Piotrowski	case FTW_D:
180d4d63c89SMateusz Piotrowski		type = 'D';
181d4d63c89SMateusz Piotrowski		break;
182d4d63c89SMateusz Piotrowski	case FTW_DNR:
183d4d63c89SMateusz Piotrowski		type = '-';
184d4d63c89SMateusz Piotrowski		break;
185d4d63c89SMateusz Piotrowski	case FTW_DP:
186d4d63c89SMateusz Piotrowski		type = 'd';
187d4d63c89SMateusz Piotrowski		break;
188d4d63c89SMateusz Piotrowski	case FTW_NS:
189d4d63c89SMateusz Piotrowski		type = 'X';
190d4d63c89SMateusz Piotrowski		break;
191d4d63c89SMateusz Piotrowski	case FTW_SL:
192d4d63c89SMateusz Piotrowski		type = 'S';
193d4d63c89SMateusz Piotrowski		break;
194d4d63c89SMateusz Piotrowski	case FTW_SLN:
195d4d63c89SMateusz Piotrowski		type = 's';
196d4d63c89SMateusz Piotrowski		break;
197d4d63c89SMateusz Piotrowski	default:
198d4d63c89SMateusz Piotrowski		type = '?';
199d4d63c89SMateusz Piotrowski		break;
200d4d63c89SMateusz Piotrowski	}
201d4d63c89SMateusz Piotrowski
202d4d63c89SMateusz Piotrowski	printf("[%c] %s\\n", type, path);
203d4d63c89SMateusz Piotrowski
204d4d63c89SMateusz Piotrowski	return (0);
205d4d63c89SMateusz Piotrowski}
206d4d63c89SMateusz Piotrowski
207d4d63c89SMateusz Piotrowskiint
208d4d63c89SMateusz Piotrowskimain(int argc, char **argv)
209d4d63c89SMateusz Piotrowski{
210*18a9889fSMateusz Piotrowski
211d4d63c89SMateusz Piotrowski	if (argc != 2) {
212d4d63c89SMateusz Piotrowski		printf("Usage %s <directory>\\n", argv[0]);
213d4d63c89SMateusz Piotrowski		return (EX_USAGE);
214d4d63c89SMateusz Piotrowski	} else
215d4d63c89SMateusz Piotrowski		return (nftw(argv[1], nftw_callback, /* UNUSED */ 1, 0));
216d4d63c89SMateusz Piotrowski}
217d4d63c89SMateusz Piotrowski.Ed
218c8f7bbe3SDavid Schultz.Sh ERRORS
219c8f7bbe3SDavid SchultzThe
220c8f7bbe3SDavid Schultz.Fn ftw
221c8f7bbe3SDavid Schultzand
222c8f7bbe3SDavid Schultz.Fn nftw
223c8f7bbe3SDavid Schultzfunctions may fail and set
224c8f7bbe3SDavid Schultz.Va errno
225c8f7bbe3SDavid Schultzfor any of the errors specified for the library functions
226c8f7bbe3SDavid Schultz.Xr close 2 ,
227c8f7bbe3SDavid Schultz.Xr open 2 ,
228c8f7bbe3SDavid Schultz.Xr stat 2 ,
229c8f7bbe3SDavid Schultz.Xr malloc 3 ,
230c8f7bbe3SDavid Schultz.Xr opendir 3
231c8f7bbe3SDavid Schultzand
232c8f7bbe3SDavid Schultz.Xr readdir 3 .
233c8f7bbe3SDavid SchultzIf the
234c8f7bbe3SDavid Schultz.Dv FTW_CHDIR
235c8f7bbe3SDavid Schultzflag is set, the
236c8f7bbe3SDavid Schultz.Fn nftw
237c8f7bbe3SDavid Schultzfunction may fail and set
238c8f7bbe3SDavid Schultz.Va errno
239c8f7bbe3SDavid Schultzfor any of the errors specified for
240c8f7bbe3SDavid Schultz.Xr chdir 2 .
241c8f7bbe3SDavid SchultzIn addition, either function may fail and set
242c8f7bbe3SDavid Schultz.Va errno
243c8f7bbe3SDavid Schultzas follows:
244c8f7bbe3SDavid Schultz.Bl -tag -width Er
245c8f7bbe3SDavid Schultz.It Bq Er EINVAL
246c8f7bbe3SDavid SchultzThe
247c8f7bbe3SDavid Schultz.Fa maxfds
248c8f7bbe3SDavid Schultzargument is less than 1.
249c8f7bbe3SDavid Schultz.El
250c8f7bbe3SDavid Schultz.Sh SEE ALSO
251c8f7bbe3SDavid Schultz.Xr chdir 2 ,
252c8f7bbe3SDavid Schultz.Xr close 2 ,
253c8f7bbe3SDavid Schultz.Xr open 2 ,
254c8f7bbe3SDavid Schultz.Xr stat 2 ,
255c8f7bbe3SDavid Schultz.Xr fts 3 ,
256c8f7bbe3SDavid Schultz.Xr malloc 3 ,
257c8f7bbe3SDavid Schultz.Xr opendir 3 ,
258c8f7bbe3SDavid Schultz.Xr readdir 3
259c8f7bbe3SDavid Schultz.Sh STANDARDS
260c8f7bbe3SDavid SchultzThe
261c8f7bbe3SDavid Schultz.Fn ftw
262c8f7bbe3SDavid Schultzand
263c8f7bbe3SDavid Schultz.Fn nftw
264c8f7bbe3SDavid Schultzfunctions conform to
265c8f7bbe3SDavid Schultz.St -p1003.1-2001 .
266c8f7bbe3SDavid Schultz.Sh HISTORY
2671c5f1e7aSRuslan ErmilovThese functions first appeared in
2681c5f1e7aSRuslan Ermilov.At V.3 .
269c8f7bbe3SDavid SchultzTheir first
270c8f7bbe3SDavid Schultz.Fx
271c8f7bbe3SDavid Schultzappearance was in
272c8f7bbe3SDavid Schultz.Fx 5.3 .
273c8f7bbe3SDavid Schultz.Sh BUGS
274c8f7bbe3SDavid SchultzThe
275c8f7bbe3SDavid Schultz.Fa maxfds
276c8f7bbe3SDavid Schultzargument is currently ignored.
277