]> git.saurik.com Git - apple/libc.git/blame - gen/fts.3
Libc-997.1.1.tar.gz
[apple/libc.git] / gen / fts.3
CommitLineData
5b2abdfb
A
1.\" Copyright (c) 1989, 1991, 1993, 1994
2.\" The Regents of the University of California. All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\" notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\" notice, this list of conditions and the following disclaimer in the
11.\" documentation and/or other materials provided with the distribution.
12.\" 3. All advertising materials mentioning features or use of this software
13.\" must display the following acknowledgement:
14.\" This product includes software developed by the University of
15.\" California, Berkeley and its contributors.
16.\" 4. Neither the name of the University nor the names of its contributors
17.\" may be used to endorse or promote products derived from this software
18.\" without specific prior written permission.
19.\"
20.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30.\" SUCH DAMAGE.
31.\"
32.\" @(#)fts.3 8.5 (Berkeley) 4/16/94
33.\" $FreeBSD: src/lib/libc/gen/fts.3,v 1.13 2001/09/20 12:32:45 ru Exp $
34.\"
6465356a 35.Dd Sept 24, 2012
5b2abdfb
A
36.Dt FTS 3
37.Os
38.Sh NAME
39.Nm fts
40.Nd traverse a file hierarchy
41.Sh LIBRARY
42.Lb libc
43.Sh SYNOPSIS
44.In sys/types.h
45.In sys/stat.h
46.In fts.h
47.Ft FTS *
48.Fn fts_open "char * const *path_argv" "int options" "int (*compar)(const FTSENT **, const FTSENT **)"
34e8f829
A
49.Ft FTS *
50.Fn fts_open_b "char * const *path_argv" "int options" "int (^compar)(const FTSENT **, const FTSENT **)"
5b2abdfb
A
51.Ft FTSENT *
52.Fn fts_read "FTS *ftsp"
53.Ft FTSENT *
54.Fn fts_children "FTS *ftsp" "int options"
55.Ft int
56.Fn fts_set "FTS *ftsp" "FTSENT *f" "int options"
57.Ft int
58.Fn fts_close "FTS *ftsp"
59.Sh DESCRIPTION
60The
61.Nm
62functions are provided for traversing
63.Tn UNIX
64file hierarchies.
65A simple overview is that the
66.Fn fts_open
34e8f829
A
67and
68.Fn fts_open_b
69functions return a
5b2abdfb
A
70.Dq handle
71on a file hierarchy, which is then supplied to
72the other
73.Nm
74functions.
75The function
76.Fn fts_read
77returns a pointer to a structure describing one of the files in the file
78hierarchy.
79The function
80.Fn fts_children
81returns a pointer to a linked list of structures, each of which describes
82one of the files contained in a directory in the hierarchy.
83In general, directories are visited two distinguishable times; in pre-order
84(before any of their descendants are visited) and in post-order (after all
85of their descendants have been visited).
86Files are visited once.
87It is possible to walk the hierarchy
88.Dq logically
89(ignoring symbolic links)
90or physically (visiting symbolic links), order the walk of the hierarchy or
91prune and/or re-visit portions of the hierarchy.
92.Pp
93Two structures are defined (and typedef'd) in the include file
94.Aq Pa fts.h .
95The first is
96.Fa FTS ,
97the structure that represents the file hierarchy itself.
98The second is
99.Fa FTSENT ,
100the structure that represents a file in the file
101hierarchy.
102Normally, an
103.Fa FTSENT
104structure is returned for every file in the file
105hierarchy.
106In this manual page,
107.Dq file
108and
109.Dq Fa FTSENT No structure
110are generally
111interchangeable.
112The
113.Fa FTSENT
114structure contains at least the following fields, which are
115described in greater detail below:
116.Bd -literal
117typedef struct _ftsent {
118 u_short fts_info; /* flags for FTSENT structure */
119 char *fts_accpath; /* access path */
120 char *fts_path; /* root path */
121 u_short fts_pathlen; /* strlen(fts_path) */
122 char *fts_name; /* file name */
123 u_short fts_namelen; /* strlen(fts_name) */
124 short fts_level; /* depth (\-1 to N) */
125 int fts_errno; /* file errno */
126 long fts_number; /* local numeric value */
127 void *fts_pointer; /* local address value */
128 struct ftsent *fts_parent; /* parent directory */
129 struct ftsent *fts_link; /* next file structure */
130 struct ftsent *fts_cycle; /* cycle structure */
131 struct stat *fts_statp; /* stat(2) information */
132} FTSENT;
133.Ed
134.Pp
135These fields are defined as follows:
136.Bl -tag -width "fts_namelen"
137.It Fa fts_info
138One of the following values describing the returned
139.Fa FTSENT
140structure and
141the file it represents.
142With the exception of directories without errors
143.Pq Dv FTS_D ,
144all of these
145entries are terminal, that is, they will not be revisited, nor will any
146of their descendants be visited.
147.Bl -tag -width FTS_DEFAULT
148.It Dv FTS_D
149A directory being visited in pre-order.
150.It Dv FTS_DC
151A directory that causes a cycle in the tree.
152(The
153.Fa fts_cycle
154field of the
155.Fa FTSENT
156structure will be filled in as well.)
157.It Dv FTS_DEFAULT
158Any
159.Fa FTSENT
160structure that represents a file type not explicitly described
161by one of the other
162.Fa fts_info
163values.
164.It Dv FTS_DNR
165A directory which cannot be read.
166This is an error return, and the
167.Fa fts_errno
168field will be set to indicate what caused the error.
169.It Dv FTS_DOT
170A file named
171.Ql .\&
172or
173.Ql ..\&
174which was not specified as a file name to
175.Fn fts_open
34e8f829
A
176or
177.Fn fts_open_b
5b2abdfb
A
178(see
179.Dv FTS_SEEDOT ) .
180.It Dv FTS_DP
181A directory being visited in post-order.
182The contents of the
183.Fa FTSENT
184structure will be unchanged from when
185it was returned in pre-order, i.e. with the
186.Fa fts_info
187field set to
188.Dv FTS_D .
189.It Dv FTS_ERR
190This is an error return, and the
191.Fa fts_errno
192field will be set to indicate what caused the error.
193.It Dv FTS_F
194A regular file.
195.It Dv FTS_NS
196A file for which no
197.Xr stat 2
198information was available.
199The contents of the
200.Fa fts_statp
201field are undefined.
202This is an error return, and the
203.Fa fts_errno
204field will be set to indicate what caused the error.
205.It Dv FTS_NSOK
206A file for which no
207.Xr stat 2
208information was requested.
209The contents of the
210.Fa fts_statp
211field are undefined.
212.It Dv FTS_SL
213A symbolic link.
214.It Dv FTS_SLNONE
215A symbolic link with a non-existent target.
216The contents of the
217.Fa fts_statp
218field reference the file characteristic information for the symbolic link
219itself.
220.El
221.It Fa fts_accpath
222A path for accessing the file from the current directory.
223.It Fa fts_path
224The path for the file relative to the root of the traversal.
225This path contains the path specified to
226.Fn fts_open
34e8f829
A
227or
228.Fn fts_open_b
5b2abdfb
A
229as a prefix.
230.It Fa fts_pathlen
231The length of the string referenced by
232.Fa fts_path .
233.It Fa fts_name
234The name of the file.
235.It Fa fts_namelen
236The length of the string referenced by
237.Fa fts_name .
238.It Fa fts_level
239The depth of the traversal, numbered from \-1 to N, where this file
240was found.
241The
242.Fa FTSENT
243structure representing the parent of the starting point (or root)
244of the traversal is numbered
245.Dv FTS_ROOTPARENTLEVEL
246(\-1), and the
247.Fa FTSENT
248structure for the root
249itself is numbered
250.Dv FTS_ROOTLEVEL
251(0).
252.It Fa fts_errno
253Upon return of a
254.Fa FTSENT
255structure from the
256.Fn fts_children
257or
258.Fn fts_read
259functions, with its
260.Fa fts_info
261field set to
262.Dv FTS_DNR ,
263.Dv FTS_ERR
264or
265.Dv FTS_NS ,
266the
267.Fa fts_errno
268field contains the value of the external variable
269.Va errno
270specifying the cause of the error.
271Otherwise, the contents of the
272.Fa fts_errno
273field are undefined.
274.It Fa fts_number
275This field is provided for the use of the application program and is
276not modified by the
277.Nm
278functions.
279It is initialized to 0.
280.It Fa fts_pointer
281This field is provided for the use of the application program and is
282not modified by the
283.Nm
284functions.
285It is initialized to
286.Dv NULL .
287.It Fa fts_parent
288A pointer to the
289.Fa FTSENT
290structure referencing the file in the hierarchy
291immediately above the current file, i.e. the directory of which this
292file is a member.
293A parent structure for the initial entry point is provided as well,
294however, only the
295.Fa fts_level ,
296.Fa fts_number
297and
298.Fa fts_pointer
299fields are guaranteed to be initialized.
300.It Fa fts_link
301Upon return from the
302.Fn fts_children
303function, the
304.Fa fts_link
305field points to the next structure in the NULL-terminated linked list of
306directory members.
307Otherwise, the contents of the
308.Fa fts_link
309field are undefined.
310.It Fa fts_cycle
311If a directory causes a cycle in the hierarchy (see
312.Dv FTS_DC ) ,
313either because
314of a hard link between two directories, or a symbolic link pointing to a
315directory, the
316.Fa fts_cycle
317field of the structure will point to the
318.Fa FTSENT
319structure in the hierarchy that references the same file as the current
320.Fa FTSENT
321structure.
322Otherwise, the contents of the
323.Fa fts_cycle
324field are undefined.
325.It Fa fts_statp
326A pointer to
327.Xr stat 2
328information for the file.
329.El
330.Pp
331A single buffer is used for all of the paths of all of the files in the
332file hierarchy.
333Therefore, the
334.Fa fts_path
335and
336.Fa fts_accpath
337fields are guaranteed to be
338.Dv NUL Ns -terminated
339.Em only
340for the file most recently returned by
341.Fn fts_read .
342To use these fields to reference any files represented by other
343.Fa FTSENT
344structures will require that the path buffer be modified using the
345information contained in that
346.Fa FTSENT
347structure's
348.Fa fts_pathlen
349field.
350Any such modifications should be undone before further calls to
351.Fn fts_read
352are attempted.
353The
354.Fa fts_name
355field is always
356.Dv NUL Ns -terminated .
357.Sh FTS_OPEN
358The
359.Fn fts_open
360function takes a pointer to an array of character pointers naming one
361or more paths which make up a logical file hierarchy to be traversed.
362The array must be terminated by a
363.Dv NULL
364pointer.
365.Pp
366There are
367a number of options, at least one of which (either
368.Dv FTS_LOGICAL
369or
370.Dv FTS_PHYSICAL )
371must be specified.
372The options are selected by
373.Em or Ns 'ing
374the following values:
6465356a 375.Bl -tag -width "FTS_NOSTAT_TYPE"
5b2abdfb
A
376.It Dv FTS_COMFOLLOW
377This option causes any symbolic link specified as a root path to be
378followed immediately whether or not
379.Dv FTS_LOGICAL
380is also specified.
381.It Dv FTS_LOGICAL
382This option causes the
383.Nm
384routines to return
385.Fa FTSENT
386structures for the targets of symbolic links
387instead of the symbolic links themselves.
388If this option is set, the only symbolic links for which
389.Fa FTSENT
390structures
391are returned to the application are those referencing non-existent files.
392Either
393.Dv FTS_LOGICAL
394or
395.Dv FTS_PHYSICAL
396.Em must
397be provided to the
398.Fn fts_open
399function.
400.It Dv FTS_NOCHDIR
401As a performance optimization, the
402.Nm
403functions change directories as they walk the file hierarchy.
404This has the side-effect that an application cannot rely on being
405in any particular directory during the traversal.
406The
407.Dv FTS_NOCHDIR
408option turns off this optimization, and the
409.Nm
410functions will not change the current directory.
411Note that applications should not themselves change their current directory
412and try to access files unless
413.Dv FTS_NOCHDIR
414is specified and absolute
415pathnames were provided as arguments to
416.Fn fts_open .
417.It Dv FTS_NOSTAT
418By default, returned
419.Fa FTSENT
420structures reference file characteristic information (the
421.Fa statp
422field) for each file visited.
423This option relaxes that requirement as a performance optimization,
6465356a
A
424not calling
425.Xr stat 2
426whenever possible.
427If
428.Xr stat 2
429doesn't need to be called, the
5b2abdfb 430.Nm
6465356a 431functions will set the
5b2abdfb
A
432.Fa fts_info
433field to
6465356a
A
434.Dv FTS_NSOK ;
435otherwise
436.Fa fts_info
437will be set to the correct file information value corresponding to the
438.Xr stat 2
439information.
440In any case, the
5b2abdfb 441.Fa statp
6465356a
A
442field will always be undefined.
443Note that because
444.Nm
445detects directory cycles and dangling symbolic links,
446.Xr stat 2
447is always called for directories and is called for symbolic links when
448.Dv FTS_LOGICAL
449is set.
450.It Dv FTS_NOSTAT_TYPE
451Like
452.Dv FTS_NOSTAT
453but if the file type is returned by
454.Xr readdir 3 ,
455the corresponding file information value is returned in
456.Fa fts_info
457instead of
458.Dv FTS_NSOK .
5b2abdfb
A
459.It Dv FTS_PHYSICAL
460This option causes the
461.Nm
462routines to return
463.Fa FTSENT
464structures for symbolic links themselves instead
465of the target files they point to.
466If this option is set,
467.Fa FTSENT
468structures for all symbolic links in the
469hierarchy are returned to the application.
470Either
471.Dv FTS_LOGICAL
472or
473.Dv FTS_PHYSICAL
474.Em must
475be provided to the
476.Fn fts_open
477function.
478.It Dv FTS_SEEDOT
479By default, unless they are specified as path arguments to
480.Fn fts_open ,
481any files named
482.Ql .\&
483or
484.Ql ..\&
485encountered in the file hierarchy are ignored.
486This option causes the
487.Nm
488routines to return
489.Fa FTSENT
490structures for them.
491.It Dv FTS_XDEV
492This option prevents
493.Nm
494from descending into directories that have a different device number
495than the file from which the descent began.
496.El
497.Pp
498The argument
499.Fn compar
500specifies a user-defined function which may be used to order the traversal
501of the hierarchy.
502It
503takes two pointers to pointers to
504.Fa FTSENT
505structures as arguments and
506should return a negative value, zero, or a positive value to indicate
507if the file referenced by its first argument comes before, in any order
508with respect to, or after, the file referenced by its second argument.
509The
510.Fa fts_accpath ,
511.Fa fts_path
512and
513.Fa fts_pathlen
514fields of the
515.Fa FTSENT
516structures may
517.Em never
518be used in this comparison.
519If the
520.Fa fts_info
521field is set to
522.Dv FTS_NS
523or
524.Dv FTS_NSOK ,
525the
526.Fa fts_statp
527field may not either.
528If the
529.Fn compar
530argument is
531.Dv NULL ,
532the directory traversal order is in the order listed in
533.Fa path_argv
534for the root paths, and in the order listed in the directory for
535everything else.
34e8f829
A
536.Sh FTS_OPEN_B
537The
538.Fn fts_open_b
539function is like
540.Fn fts_open
541except
542.Fa compar
543is a block pointer instead of a function pointer.
544This block is passed to
545.Xr qsort_b 3
546(whereas
547.Fn fts_open
548passes its function pointer to
549.Xr qsort 3 ) .
550.Bd -ragged -offset indent
551Note: The
552.Fn Block_copy
553function (defined in
554.In Blocks.h )
555is used by
556.Fn fts_open_b
557to make a copy of the block, especially for the case when a stack-based
558block might go out of scope when the subroutine returns.
559.Ed
5b2abdfb
A
560.Sh FTS_READ
561The
562.Fn fts_read
563function returns a pointer to an
564.Fa FTSENT
565structure describing a file in
566the hierarchy.
567Directories (that are readable and do not cause cycles) are visited at
568least twice, once in pre-order and once in post-order.
569All other files are visited at least once.
570(Hard links between directories that do not cause cycles or symbolic
571links to symbolic links may cause files to be visited more than once,
572or directories more than twice.)
573.Pp
574If all the members of the hierarchy have been returned,
575.Fn fts_read
576returns
577.Dv NULL
578and sets the external variable
579.Va errno
580to 0.
581If an error unrelated to a file in the hierarchy occurs,
582.Fn fts_read
583returns
584.Dv NULL
585and sets
586.Va errno
587appropriately.
588If an error related to a returned file occurs, a pointer to an
589.Fa FTSENT
590structure is returned, and
591.Va errno
592may or may not have been set (see
593.Fa fts_info ) .
594.Pp
595The
596.Fa FTSENT
597structures returned by
598.Fn fts_read
599may be overwritten after a call to
600.Fn fts_close
601on the same file hierarchy stream, or, after a call to
602.Fn fts_read
603on the same file hierarchy stream unless they represent a file of type
604directory, in which case they will not be overwritten until after a call to
605.Fn fts_read
606after the
607.Fa FTSENT
608structure has been returned by the function
609.Fn fts_read
610in post-order.
611.Sh FTS_CHILDREN
612The
613.Fn fts_children
614function returns a pointer to an
615.Fa FTSENT
616structure describing the first entry in a NULL-terminated linked list of
617the files in the directory represented by the
618.Fa FTSENT
619structure most recently returned by
620.Fn fts_read .
621The list is linked through the
622.Fa fts_link
623field of the
624.Fa FTSENT
625structure, and is ordered by the user-specified comparison function, if any.
626Repeated calls to
627.Fn fts_children
628will recreate this linked list.
629.Pp
630As a special case, if
631.Fn fts_read
632has not yet been called for a hierarchy,
633.Fn fts_children
634will return a pointer to the files in the logical directory specified to
635.Fn fts_open ,
636i.e. the arguments specified to
637.Fn fts_open .
638Otherwise, if the
639.Fa FTSENT
640structure most recently returned by
641.Fn fts_read
642is not a directory being visited in pre-order,
643or the directory does not contain any files,
644.Fn fts_children
645returns
646.Dv NULL
647and sets
648.Va errno
649to zero.
650If an error occurs,
651.Fn fts_children
652returns
653.Dv NULL
654and sets
655.Va errno
656appropriately.
657.Pp
658The
659.Fa FTSENT
660structures returned by
661.Fn fts_children
662may be overwritten after a call to
663.Fn fts_children ,
664.Fn fts_close
665or
666.Fn fts_read
667on the same file hierarchy stream.
668.Pp
669.Em Option
670may be set to the following value:
671.Bl -tag -width FTS_NAMEONLY
672.It Dv FTS_NAMEONLY
673Only the names of the files are needed.
674The contents of all the fields in the returned linked list of structures
675are undefined with the exception of the
676.Fa fts_name
677and
678.Fa fts_namelen
679fields.
680.El
681.Sh FTS_SET
682The function
683.Fn fts_set
684allows the user application to determine further processing for the
685file
686.Fa f
687of the stream
688.Fa ftsp .
689The
690.Fn fts_set
691function
692returns 0 on success, and \-1 if an error occurs.
693.Em Option
694must be set to one of the following values:
695.Bl -tag -width FTS_PHYSICAL
696.It Dv FTS_AGAIN
697Re-visit the file; any file type may be re-visited.
698The next call to
699.Fn fts_read
700will return the referenced file.
701The
702.Fa fts_stat
703and
704.Fa fts_info
705fields of the structure will be reinitialized at that time,
706but no other fields will have been changed.
707This option is meaningful only for the most recently returned
708file from
709.Fn fts_read .
710Normal use is for post-order directory visits, where it causes the
711directory to be re-visited (in both pre and post-order) as well as all
712of its descendants.
713.It Dv FTS_FOLLOW
714The referenced file must be a symbolic link.
715If the referenced file is the one most recently returned by
716.Fn fts_read ,
717the next call to
718.Fn fts_read
719returns the file with the
720.Fa fts_info
721and
722.Fa fts_statp
723fields reinitialized to reflect the target of the symbolic link instead
724of the symbolic link itself.
725If the file is one of those most recently returned by
726.Fn fts_children ,
727the
728.Fa fts_info
729and
730.Fa fts_statp
731fields of the structure, when returned by
732.Fn fts_read ,
733will reflect the target of the symbolic link instead of the symbolic link
734itself.
735In either case, if the target of the symbolic link does not exist the
736fields of the returned structure will be unchanged and the
737.Fa fts_info
738field will be set to
739.Dv FTS_SLNONE .
740.Pp
741If the target of the link is a directory, the pre-order return, followed
742by the return of all of its descendants, followed by a post-order return,
743is done.
744.It Dv FTS_SKIP
745No descendants of this file are visited.
746The file may be one of those most recently returned by either
747.Fn fts_children
748or
749.Fn fts_read .
750.El
751.Sh FTS_CLOSE
752The
753.Fn fts_close
754function closes a file hierarchy stream
755.Fa ftsp
756and restores the current directory to the directory from which
757.Fn fts_open
758was called to open
759.Fa ftsp .
760The
761.Fn fts_close
762function
763returns 0 on success, and \-1 if an error occurs.
764.Sh ERRORS
765The function
766.Fn fts_open
767may fail and set
768.Va errno
769for any of the errors specified for the library functions
770.Xr open 2
771and
772.Xr malloc 3 .
773.Pp
774The function
775.Fn fts_close
776may fail and set
777.Va errno
778for any of the errors specified for the library functions
779.Xr chdir 2
780and
781.Xr close 2 .
782.Pp
783The functions
784.Fn fts_read
785and
786.Fn fts_children
787may fail and set
788.Va errno
789for any of the errors specified for the library functions
790.Xr chdir 2 ,
791.Xr malloc 3 ,
792.Xr opendir 3 ,
793.Xr readdir 3
794and
795.Xr stat 2 .
796.Pp
797In addition,
798.Fn fts_children ,
799.Fn fts_open
800and
801.Fn fts_set
802may fail and set
803.Va errno
804as follows:
805.Bl -tag -width Er
806.It Bq Er EINVAL
807The options were invalid.
808.El
809.Sh SEE ALSO
810.Xr find 1 ,
811.Xr chdir 2 ,
812.Xr stat 2 ,
34e8f829
A
813.Xr qsort 3 ,
814.Xr qsort_b 3
5b2abdfb
A
815.Sh STANDARDS
816The
817.Nm
818utility is expected to be included in a future
819.St -p1003.1-88
820revision.