aboutsummaryrefslogtreecommitdiffstats
path: root/extension/fts.3
blob: 9131d04fbe136a12632dd6516a11c24a10c2bb9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
FTS(3)                             BSD Library Functions Manual                            FTS(3)

NAME
     fts, fts_open, fts_read, fts_children, fts_set, fts_close -- traverse a file hierarchy

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <sys/types.h>
     #include <sys/stat.h>
     #include <fts.h>

     FTS *
     fts_open(char * const *path_argv, int options,
         int (*compar)(const FTSENT **, const FTSENT **));

     FTSENT *
     fts_read(FTS *ftsp);

     FTSENT *
     fts_children(FTS *ftsp, int options);

     int
     fts_set(FTS *ftsp, FTSENT *f, int options);

     int
     fts_close(FTS *ftsp);

DESCRIPTION
     The fts functions are provided for traversing UNIX file hierarchies.  A simple overview is
     that the fts_open() function returns a "handle" on a file hierarchy, which is then supplied
     to the other fts functions.  The function fts_read() returns a pointer to a structure de-
     scribing one of the files in the file hierarchy.  The function fts_children() returns a
     pointer to a linked list of structures, each of which describes one of the files contained
     in a directory in the hierarchy.  In general, directories are visited two distinguishable
     times; in pre-order (before any of their descendants are visited) and in post-order (after
     all of their descendants have been visited).  Files are visited once.  It is possible to
     walk the hierarchy "logically" (ignoring symbolic links) or physically (visiting symbolic
     links), order the walk of the hierarchy or prune and/or re-visit portions of the hierarchy.

     Two structures are defined (and typedef'd) in the include file <fts.h>.  The first is FTS,
     the structure that represents the file hierarchy itself.  The second is FTSENT, the struc-
     ture that represents a file in the file hierarchy.  Normally, an FTSENT structure is re-
     turned for every file in the file hierarchy.  In this manual page, "file" and "FTSENT
     structure" are generally interchangeable.  The FTSENT structure contains at least the fol-
     lowing fields, which are described in greater detail below:

       typedef struct _ftsent {
               u_short fts_info;               /* flags for FTSENT structure */
               char *fts_accpath;              /* access path */
               char *fts_path;                 /* root path */
               short fts_pathlen;              /* strlen(fts_path) */
               char *fts_name;                 /* file name */
               short fts_namelen;              /* strlen(fts_name) */
               short fts_level;                /* depth (-1 to N) */
               int fts_errno;                  /* file errno */
               long fts_number;                /* local numeric value */
               void *fts_pointer;              /* local address value */
               struct ftsent *fts_parent;      /* parent directory */
               struct ftsent *fts_link;        /* next file structure */
               struct ftsent *fts_cycle;       /* cycle structure */
               struct stat *fts_statp;         /* stat(2) information */
       } FTSENT;

     These fields are defined as follows:

     fts_info     One of the following flags describing the returned FTSENT structure and the
                  file it represents.  With the exception of directories without errors (FTS_D),
                  all of these entries are terminal, that is, they will not be revisited, nor
                  will any of their descendants be visited.

                  FTS_D        A directory being visited in pre-order.

                  FTS_DC       A directory that causes a cycle in the tree.  (The fts_cycle field
                               of the FTSENT structure will be filled in as well).

                  FTS_DEFAULT  Any FTSENT structure that represents a file type not explicitly
                               described by one of the other fts_info values.

                  FTS_DNR      A directory which cannot be read.  This is an error return, and
                               the fts_errno field will be set to indicate what caused the error.

                  FTS_DOT      A file named '.' or '..' which was not specified as a file name to
                               fts_open() (see FTS_SEEDOT).

                  FTS_DP       A directory being visited in post-order.  The contents of the
                               FTSENT structure will be unchanged from when it was returned in
                               pre-order, i.e., with the fts_info field set to FTS_D.

                  FTS_ERR      This is an error return, and the fts_errno field will be set to
                               indicate what caused the error.

                  FTS_F        A regular file.

                  FTS_NS       A file for which no stat(2) information was available.  The con-
                               tents of the fts_statp field are undefined.  This is an error re-
                               turn, and the fts_errno field will be set to indicate what caused
                               the error.

                  FTS_NSOK     A file for which no stat(2) information was requested.  The con-
                               tents of the fts_statp field are undefined.

                  FTS_SL       A symbolic link.

                  FTS_SLNONE   A symbolic link with a non-existent target.  The contents of the
                               fts_statp field reference the file characteristic information for
                               the symbolic link itself.

                  FTS_W        A whiteout object.

     fts_accpath  A path for accessing the file from the current directory.

     fts_path     The path for the file relative to the root of the traversal.  This path con-
                  tains the path specified to fts_open() as a prefix.

     fts_pathlen  The length of the string referenced by fts_path.

     fts_name     The name of the file.

     fts_namelen  The length of the string referenced by fts_name.

     fts_level    The depth of the traversal, numbered from -1 to N, where this file was found.
                  The FTSENT structure representing the parent of the starting point (or root) of
                  the traversal is numbered -1, and the FTSENT structure for the root itself is
                  numbered 0.

     fts_errno    Upon return of a FTSENT structure from the fts_children() or fts_read() func-
                  tions, with its fts_info field set to FTS_DNR, FTS_ERR or FTS_NS, the fts_errno
                  field contains the value of the external variable errno specifying the cause of
                  the error.  Otherwise, the contents of the fts_errno field are undefined.

     fts_number   This field is provided for the use of the application program and is not modi-
                  fied by the fts functions.  It is initialized to 0.

     fts_pointer  This field is provided for the use of the application program and is not modi-
                  fied by the fts functions.  It is initialized to NULL.

     fts_parent   A pointer to the FTSENT structure referencing the file in the hierarchy immedi-
                  ately above the current file, i.e., the directory of which this file is a mem-
                  ber.  A parent structure for the initial entry point is provided as well, how-
                  ever, only the fts_level, fts_number and fts_pointer fields are guaranteed to
                  be initialized.

     fts_link     Upon return from the fts_children() function, the fts_link field points to the
                  next structure in the NULL-terminated linked list of directory members.  Other-
                  wise, the contents of the fts_link field are undefined.

     fts_cycle    If a directory causes a cycle in the hierarchy (see FTS_DC), either because of
                  a hard link between two directories, or a symbolic link pointing to a direc-
                  tory, the fts_cycle field of the structure will point to the FTSENT structure
                  in the hierarchy that references the same file as the current FTSENT structure.
                  Otherwise, the contents of the fts_cycle field are undefined.

     fts_statp    A pointer to stat(2) information for the file.

     A single buffer is used for all of the paths of all of the files in the file hierarchy.
     Therefore, the fts_path and fts_accpath fields are guaranteed to be NULL-terminated only for
     the file most recently returned by fts_read().  To use these fields to reference any files
     represented by other FTSENT structures will require that the path buffer be modified using
     the information contained in that FTSENT structure's fts_pathlen field.  Any such modifica-
     tions should be undone before further calls to fts_read() are attempted.  The fts_name field
     is always NULL-terminated.

FTS_OPEN
     The fts_open() function takes a pointer to an array of character pointers naming one or more
     paths which make up a logical file hierarchy to be traversed.  The array must be terminated
     by a NULL pointer.

     There are a number of options, at least one of which (either FTS_LOGICAL or FTS_PHYSICAL)
     must be specified.  The options are selected by or'ing the following values:

     FTS_COMFOLLOW   This option causes any symbolic link specified as a root path to be followed
                     immediately whether or not FTS_LOGICAL is also specified.

     FTS_LOGICAL     This option causes the fts routines to return FTSENT structures for the tar-
                     gets of symbolic links instead of the symbolic links themselves.  If this
                     option is set, the only symbolic links for which FTSENT structures are re-
                     turned to the application are those referencing non-existent files.  Either
                     FTS_LOGICAL or FTS_PHYSICAL must be provided to the fts_open() function.

     FTS_NOCHDIR     As a performance optimization, the fts functions change directories as they
                     walk the file hierarchy.  This has the side-effect that an application can-
                     not rely on being in any particular directory during the traversal.  The
                     FTS_NOCHDIR option turns off this optimization, and the fts functions will
                     not change the current directory.  Note that applications should not them-
                     selves change their current directory and try to access files unless
                     FTS_NOCHDIR is specified and absolute pathnames were provided as arguments
                     to fts_open().

     FTS_NOSTAT      By default, returned FTSENT structures reference file characteristic infor-
                     mation (the statp field) for each file visited.  This option relaxes that
                     requirement as a performance optimization, allowing the fts functions to set
                     the fts_info field to FTS_NSOK and leave the contents of the statp field un-
                     defined.

     FTS_PHYSICAL    This option causes the fts routines to return FTSENT structures for symbolic
                     links themselves instead of the target files they point to.  If this option
                     is set, FTSENT structures for all symbolic links in the hierarchy are re-
                     turned to the application.  Either FTS_LOGICAL or FTS_PHYSICAL must be pro-
                     vided to the fts_open() function.

     FTS_SEEDOT      By default, unless they are specified as path arguments to fts_open(), any
                     files named '.' or '..' encountered in the file hierarchy are ignored.  This
                     option causes the fts routines to return FTSENT structures for them.

     FTS_WHITEOUT    Return whiteout entries, which are normally hidden.

     FTS_XDEV        This option prevents fts from descending into directories that have a dif-
                     ferent device number than the file from which the descent began.

     The argument compar() specifies a user-defined function which may be used to order the tra-
     versal of the hierarchy.  It takes two pointers to pointers to FTSENT structures as argu-
     ments and should return a negative value, zero, or a positive value to indicate if the file
     referenced by its first argument comes before, in any order with respect to, or after, the
     file referenced by its second argument.  The fts_accpath, fts_path and fts_pathlen fields of
     the FTSENT structures may never be used in this comparison.  If the fts_info field is set to
     FTS_NS or FTS_NSOK, the fts_statp field may not either.  If the compar() argument is NULL,
     the directory traversal order is in the order listed in path_argv for the root paths, and in
     the order listed in the directory for everything else.

FTS_READ
     The fts_read() function returns a pointer to an FTSENT structure describing a file in the
     hierarchy.  Directories (that are readable and do not cause cycles) are visited at least
     twice, once in pre-order and once in post-order.  All other files are visited at least once.
     (Hard links between directories that do not cause cycles or symbolic links to symbolic links
     may cause files to be visited more than once, or directories more than twice.)

     If all the members of the hierarchy have been returned, fts_read() returns NULL and sets the
     external variable errno to 0.  If an error unrelated to a file in the hierarchy occurs,
     fts_read() returns NULL and sets errno appropriately.  If an error related to a returned
     file occurs, a pointer to an FTSENT structure is returned, and errno may or may not have
     been set (see fts_info).

     The FTSENT structures returned by fts_read() may be overwritten after a call to fts_close()
     on the same file hierarchy stream, or, after a call to fts_read() on the same file hierarchy
     stream unless they represent a file of type directory, in which case they will not be over-
     written until after a call to fts_read() after the FTSENT structure has been returned by the
     function fts_read() in post-order.

FTS_CHILDREN
     The fts_children() function returns a pointer to an FTSENT structure describing the first
     entry in a NULL-terminated linked list of the files in the directory represented by the
     FTSENT structure most recently returned by fts_read().  The list is linked through the
     fts_link field of the FTSENT structure, and is ordered by the user-specified comparison
     function, if any.  Repeated calls to fts_children() will recreate this linked list.

     As a special case, if fts_read() has not yet been called for a hierarchy, fts_children()
     will return a pointer to the files in the logical directory specified to fts_open(), i.e.,
     the arguments specified to fts_open().  Otherwise, if the FTSENT structure most recently re-
     turned by fts_read() is not a directory being visited in pre-order, or the directory does
     not contain any files, fts_children() returns NULL and sets errno to zero.  If an error oc-
     curs, fts_children() returns NULL and sets errno appropriately.

     The FTSENT structures returned by fts_children() may be overwritten after a call to
     fts_children(), fts_close() or fts_read() on the same file hierarchy stream.

     Option may be set to the following value:

     FTS_NAMEONLY    Only the names of the files are needed.  The contents of all the fields in
                     the returned linked list of structures are undefined with the exception of
                     the fts_name and fts_namelen fields.

FTS_SET
     The function fts_set() allows the user application to determine further processing for the
     file f of the stream ftsp.  The fts_set() function returns 0 on success, and -1 if an error
     occurs.  Option must be set to one of the following values:

     FTS_AGAIN       Re-visit the file; any file type may be re-visited.  The next call to
                     fts_read() will return the referenced file.  The fts_stat and fts_info
                     fields of the structure will be reinitialized at that time, but no other
                     fields will have been changed.  This option is meaningful only for the most
                     recently returned file from fts_read().  Normal use is for post-order direc-
                     tory visits, where it causes the directory to be re-visited (in both pre and
                     post-order) as well as all of its descendants.

     FTS_FOLLOW      The referenced file must be a symbolic link.  If the referenced file is the
                     one most recently returned by fts_read(), the next call to fts_read() re-
                     turns the file with the fts_info and fts_statp fields reinitialized to re-
                     flect the target of the symbolic link instead of the symbolic link itself.
                     If the file is one of those most recently returned by fts_children(), the
                     fts_info and fts_statp fields of the structure, when returned by fts_read(),
                     will reflect the target of the symbolic link instead of the symbolic link
                     itself.  In either case, if the target of the symbolic link does not exist
                     the fields of the returned structure will be unchanged and the fts_info
                     field will be set to FTS_SLNONE.

                     If the target of the link is a directory, the pre-order return, followed by
                     the return of all of its descendants, followed by a post-order return, is
                     done.

     FTS_SKIP        No descendants of this file are visited.  The file may be one of those most
                     recently returned by either fts_children() or fts_read().

FTS_CLOSE
     The fts_close() function closes a file hierarchy stream ftsp and restores the current direc-
     tory to the directory from which fts_open() was called to open ftsp.  The fts_close() func-
     tion returns 0 on success, and -1 if an error occurs.

ERRORS
     The function fts_open() may fail and set errno for any of the errors specified for the li-
     brary functions open(2) and malloc(3).

     The function fts_close() may fail and set errno for any of the errors specified for the li-
     brary functions chdir(2) and close(2).

     The functions fts_read() and fts_children() may fail and set errno for any of the errors
     specified for the library functions chdir(2), malloc(3), opendir(3), readdir(3) and stat(2).

     In addition, fts_children(), fts_open() and fts_set() may fail and set errno as follows:

     [EINVAL]           The options were invalid.

SEE ALSO
     find(1), chdir(2), stat(2), qsort(3), symlink(7)

STANDARDS
     The fts utility was expected to be included in the IEEE Std 1003.1-1988 ("POSIX.1") revi-
     sion.  But twenty years later, it still was not included in the IEEE Std 1003.1-2008
     ("POSIX.1") revision.

BSD                                       March 30, 2011                                      BSD