Annotation of 43BSDReno/lib/libc/gen/fts.3, revision 1.1.1.1

1.1       root        1: .\" Copyright (c) 1989 The Regents of the University of California.
                      2: .\" All rights reserved.
                      3: .\"
                      4: .\" Redistribution and use in source and binary forms are permitted provided
                      5: .\" that: (1) source distributions retain this entire copyright notice and
                      6: .\" comment, and (2) distributions including binaries display the following
                      7: .\" acknowledgement:  ``This product includes software developed by the
                      8: .\" University of California, Berkeley and its contributors'' in the
                      9: .\" documentation or other materials provided with the distribution and in
                     10: .\" all advertising materials mentioning features or use of this software.
                     11: .\" Neither the name of the University nor the names of its contributors may
                     12: .\" be used to endorse or promote products derived from this software without
                     13: .\" specific prior written permission.
                     14: .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
                     15: .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
                     16: .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     17: .\"
                     18: .\"    @(#)fts.3       5.6 (Berkeley) 6/23/90
                     19: .\"
                     20: .TH FTS 3 "June 23, 1990"
                     21: .UC 7
                     22: .SH NAME
                     23: fts \- traverse a file hierarchy
                     24: .SH SYNOPSIS
                     25: .nf
                     26: .ft B
                     27: #include <sys/types.h>
                     28: #include <sys/stat.h>
                     29: #include <fts.h>
                     30: 
                     31: FTS *
                     32: ftsopen(path_argv, options, compar)
                     33: char *path_argv[];
                     34: int options, (*compar)();
                     35: 
                     36: FTSENT *
                     37: ftsread(ftsp);
                     38: FTS *ftsp;
                     39: 
                     40: FTSENT *
                     41: ftschildren(ftsp)
                     42: FTS *ftsp;
                     43: 
                     44: ftsset(ftsp, f, options)
                     45: FTS *ftsp;
                     46: FTSENT *f;
                     47: int options;
                     48: 
                     49: ftsclose(ftsp)
                     50: FTS *ftsp;
                     51: .ft R
                     52: .fi
                     53: .SH DESCRIPTION
                     54: The
                     55: .IR fts (3)
                     56: utilities are provided for traversing UNIX file hierarchies.
                     57: Two structures are defined (and typedef'd) in the include file <\fIfts.h\fP>.
                     58: The first is FTS, the structure that defines the file hierarchy stream.
                     59: The second is FTSENT, the structure that defines a file in the file
                     60: hierarchy.
                     61: .PP
                     62: The
                     63: .I ftsopen
                     64: routine takes a pointer to an array of character pointers (``argv'')
                     65: naming the file hierarchies to be traversed.
                     66: The array must be terminated by a pointer to a NULL string.
                     67: .PP
                     68: The 
                     69: .I options
                     70: specified are formed by
                     71: .IR or 'ing
                     72: one or more of the following values:
                     73: .TP
                     74: FTS_LOGICAL
                     75: This option causes 
                     76: .I ftsread
                     77: to use the function
                     78: .IR stat (2),
                     79: by default, to determine the status of each file.
                     80: If this option is set, the only symbolic links returned to the application
                     81: are those referencing non-existent files.
                     82: Either FTS_LOGICAL or FTS_PHYSICAL
                     83: .B must
                     84: be provided to the 
                     85: .I ftsopen
                     86: routine.
                     87: .TP
                     88: FTS_NOCHDIR
                     89: As a performance optimization,
                     90: .I ftsread
                     91: changes directories as it descends the hierarchy.
                     92: This has the side-effect that applications cannot rely on being
                     93: in any particular directory.
                     94: The FTS_NOCHDIR option turns off this optimization.
                     95: Note that applications should not change the current directory
                     96: (even if FTS_NOCHDIR is specified) unless absolute pathnames were
                     97: provided as arguments to
                     98: .IR ftsopen .
                     99: .TP
                    100: FTS_NOSTAT
                    101: By default,
                    102: .I ftsread
                    103: and
                    104: .I ftschildren
                    105: provide file characteristic information (the
                    106: .I statb
                    107: field) for each file they return.
                    108: This option relaxes that requirement; the contents of the
                    109: .I statb
                    110: field may be undefined, and the
                    111: .I info
                    112: field may be set to FTS_NS.
                    113: .TP
                    114: FTS_PHYSICAL
                    115: This option causes 
                    116: .I ftsread
                    117: to use the function
                    118: .IR lstat (2),
                    119: by default, to determine the status of each file.
                    120: If this option is set, all symbolic links are returned to the application
                    121: program.
                    122: Either FTS_LOGICAL or FTS_PHYSICAL
                    123: .B must
                    124: be provided to the 
                    125: .I ftsopen
                    126: routine.
                    127: .TP
                    128: FTS_SEEDOT
                    129: This option causes the routine
                    130: .I ftsread
                    131: to return structures for the directory entries ``.'' and ``..''.
                    132: By default they are ignored unless specified as an argument to
                    133: .IR ftsopen .
                    134: .TP
                    135: FTS_XDEV
                    136: This option keeps
                    137: .I fts
                    138: from descending into directories that have a different device number
                    139: than the file the descent began from.
                    140: .PP
                    141: The argument
                    142: .I compar
                    143: specifies a user-defined routine which is used to order the traversal
                    144: of directories.
                    145: .I Compar
                    146: takes two pointers to pointers to FTSENT structures as arguments and
                    147: should return a negative value, zero, or a positive value to indicate
                    148: if the file referenced by its first argument comes before, in any order
                    149: with respect to, or after, the file referenced by its second argument.
                    150: .PP
                    151: The
                    152: .I fts_accpath
                    153: and
                    154: .I fts_path
                    155: fields of the FTSENT structures may not be used in this comparison.
                    156: If the option
                    157: .I FTS_NOSTAT
                    158: is specified, the
                    159: .I fts_stab
                    160: field may not be used as well.
                    161: If the
                    162: .I compar
                    163: argument is NULL the directory traversal order is unspecified except
                    164: for the root paths which are traversed in the order listed in
                    165: .IR path_argv .
                    166: .PP
                    167: The
                    168: .I ftsclose
                    169: routine closes a file hierarchy stream and changes the current
                    170: directory to the directory
                    171: .I ftsopen
                    172: was called from.
                    173: .I Ftsclose
                    174: returns 0 on success, and -1 if an error occurs.
                    175: .PP
                    176: Each call to the
                    177: .I ftsread 
                    178: routine returns a pointer to an FTSENT structure describing a file in
                    179: the hierarchy.
                    180: Directories (that are readable, searchable and do not cause cycles)
                    181: are visited at least twice, before any of their descendants have been
                    182: visited (pre-order) and after all their descendants have been visited
                    183: (post-order).
                    184: All other files are visited at least once.
                    185: .PP
                    186: The FTSENT structure contains at least the following fields:
                    187: .sp
                    188: .RS
                    189: .nf
                    190: .ta .5i +.5i +\w'struct ftsent *parent;\0\0\0'u
                    191: typedef struct ftsent {
                    192:        struct ftsent *fts_parent;              /* parent structure */
                    193:        struct ftsent *fts_link;                /* cycle or file structure */
                    194:        union {
                    195:                long number;            /* local numeric value */
                    196:                void *pointer;          /* local address value */
                    197:        } fts_local;
                    198:        char *fts_accpath;                      /* path from current directory */
                    199:        char *fts_path;                 /* path from starting directory */
                    200:        char *fts_name;                 /* file name */
                    201:        short fts_pathlen;                      /* strlen(path) */
                    202:        short fts_namelen;                      /* strlen(name) */
                    203:        short fts_level;                        /* depth (\-1 to N) */
                    204:        unsigned short fts_info;                /* flags for entry */
                    205:        struct stat fts_statb;                  /* stat(2) information */
                    206: } FTSENT;
                    207: .fi
                    208: .RE
                    209: .PP
                    210: The fields are as follows:
                    211: .TP
                    212: fts_parent
                    213: A pointer to a structure referencing the file in the hierarchy
                    214: immediately above the current file/structure.
                    215: A parent structure for the initial entry point is provided as well,
                    216: however, only the
                    217: .I fts_local
                    218: and
                    219: .I fts_level
                    220: fields are guaranteed to be initialized.
                    221: .TP
                    222: fts_link
                    223: If a directory causes a cycle in the hierarchy, either because of a
                    224: hard link between two directories, or a symbolic link pointing to a
                    225: directory, the
                    226: .I fts_link
                    227: field of the structure will point to the structure in the hierarchy 
                    228: that references the same file as the current structure.
                    229: Upon return from the
                    230: .I ftschildren
                    231: routine, the
                    232: .I fts_link
                    233: field points to the next structure in the linked list of entries
                    234: from the directory.
                    235: Otherwise, the contents of the
                    236: .I fts_link
                    237: field are undefined.
                    238: .TP
                    239: fts_local
                    240: This field is provided for the use of the application program.
                    241: It can be used to store either a long value or an address.
                    242: .TP
                    243: fts_accpath
                    244: A path that can be used to access the file.
                    245: .TP
                    246: fts_path
                    247: The path for the file relative to the root of the traversal.
                    248: .TP
                    249: fts_name
                    250: The basename of the file.
                    251: .TP
                    252: fts_pathlen
                    253: The length of the string referenced by
                    254: .IR fts_path .
                    255: .TP
                    256: fts_namelen
                    257: The length of the string referenced by
                    258: .IR fts_name .
                    259: .TP 
                    260: fts_level
                    261: The depth of the traversal, numbered from \-1 to N.
                    262: The parent structure of the root of the traversal is numbered \-1, and
                    263: the structure for the root of the traversal is numbered 0.
                    264: .TP 
                    265: fts_info
                    266: Information describing the file.
                    267: With the exception of directories (FTS_D), all of these entries are
                    268: terminal, i.e. they will not be revisited, nor will their descendants
                    269: be visited (if they have not been visited already).
                    270: .RS
                    271: .TP
                    272: FTS_D
                    273: A directory being visited in pre-order.
                    274: .TP
                    275: FTS_DC
                    276: A directory that causes a cycle.
                    277: The 
                    278: .I fts_link
                    279: field of the structure will be filled in as well.
                    280: .TP
                    281: FTS_DEFAULT
                    282: Anything that's not one of the others.
                    283: .TP
                    284: FTS_DNR
                    285: A directory that cannot be read.
                    286: .TP
                    287: FTS_DNX
                    288: A directory that cannot be searched.
                    289: .TP
                    290: FTS_DOT
                    291: A file named ``.'' or ``..'' with a
                    292: .I fts_level
                    293: field not equal to zero, i.e. one not specified as an argument to
                    294: .IR ftsopen .
                    295: (See FTS_SEEDOT.)
                    296: .TP
                    297: FTS_DP
                    298: A directory that is being visited in post-order.
                    299: The contents of the structure will be unchanged from when the
                    300: directory was visited in pre-order.
                    301: .TP
                    302: FTS_ERR
                    303: An error indicator; the external variable
                    304: .I errno
                    305: contains an error number indicating the reason for the error.
                    306: .TP
                    307: FTS_F
                    308: A regular file.
                    309: .TP
                    310: FTS_NS
                    311: No
                    312: .IR stat (2)
                    313: information is available at this time (see FTS_NOSTAT); the
                    314: contents of the
                    315: .I fts_statb
                    316: field are undefined.
                    317: .TP
                    318: FTS_SL
                    319: A symbolic link.
                    320: .TP
                    321: FTS_SLNONE
                    322: A symbolic link with a non-existent target.
                    323: .RE
                    324: .TP
                    325: fts_statb
                    326: .IR Stat (2)
                    327: information for the file.
                    328: .PP
                    329: The
                    330: .I fts_accpath
                    331: and
                    332: .I fts_path
                    333: fields are guaranteed to be NULL-terminated
                    334: .B only
                    335: for the file most recently returned by
                    336: .IR ftsread .
                    337: The
                    338: .I fts_name
                    339: field is always NULL-terminated.
                    340: To use these fields to reference any other active files may require
                    341: that they be modified using the information contained in the
                    342: .I fts_pathlen
                    343: field.
                    344: Any such modifications should be undone before further calls to
                    345: .I ftsread
                    346: are attempted.
                    347: .PP
                    348: If all the members of the hierarchy have been returned,
                    349: .I ftsread
                    350: returns NULL and sets the external variable
                    351: .I errno
                    352: to 0.
                    353: If an error unrelated to a file in the hierarchy occurs,
                    354: .I ftsread
                    355: returns NULL and sets errno appropriately.
                    356: Otherwise, a pointer to an FTSENT structure is returned, and an
                    357: error may or may not have occurred; see FTS_ERR above.
                    358: .PP
                    359: When the most recently returned file from 
                    360: .I ftsread
                    361: is a directory being visited in pre-order, 
                    362: .I ftschildren
                    363: returns a pointer to the first entry in a linked list (sorted by
                    364: the comparison routine, if provided) of the directory entries
                    365: it contains.
                    366: The linked list is linked through the
                    367: .I fts_link
                    368: field of the FTSENT structure.
                    369: Each call to
                    370: .I ftschildren
                    371: recreates the list.
                    372: Note, cycles are not detected until a directory is actually visited,
                    373: therefore
                    374: .I ftschildren
                    375: will never return a structure with an
                    376: .I fts_info
                    377: field set to FTS_DC.
                    378: If the current file is not a directory being visited in pre-order,
                    379: or if an error occurs, or the file does not contain any entries
                    380: .I ftschildren
                    381: returns NULL.
                    382: If an error occurs,
                    383: .I ftschildren
                    384: sets errno appropriately, otherwise it sets errno to zero.
                    385: .PP
                    386: The pointers returned by
                    387: .I ftsread
                    388: and
                    389: .I ftschildren
                    390: point to structures which may be overwritten.
                    391: Structures returned by
                    392: .I ftschildren
                    393: and
                    394: .I ftsread
                    395: may be overwritten after a call to
                    396: .I ftsclose
                    397: on the same file hierarchy.
                    398: Otherwise, structures returned by
                    399: .I ftschildren
                    400: will not be overwritten until a subsequent call to either
                    401: .I ftschildren
                    402: or
                    403: .I ftsread
                    404: on the same file hierarchy.
                    405: Structures returned by
                    406: .I ftsread
                    407: will not not be overwritten until a subsequent call to
                    408: .I ftsread
                    409: on the same file hierarchy stream, unless it represents a file of type
                    410: directory, in which case it will not be overwritten until after a
                    411: subsequent call to
                    412: .I ftsread
                    413: after it has been returned by the function
                    414: .I ftsread
                    415: in post-order.
                    416: .PP
                    417: The routine
                    418: .I ftsset
                    419: allows the user application to determine further processing for the
                    420: file
                    421: .I f
                    422: of the stream
                    423: .IR ftsp .
                    424: .I Ftsset
                    425: returns 0 on success, and -1 if an error occurs.
                    426: .I Option
                    427: may be set to any one of the following values.
                    428: .TP
                    429: FTS_AGAIN
                    430: Re-visit the file; any file type may be re-visited.
                    431: The next call to
                    432: .I ftsread
                    433: will return the referenced file.
                    434: The 
                    435: .I fts_stat
                    436: and
                    437: .I fts_info
                    438: fields of the structure will be reinitialized at that time,
                    439: but no other fields will have been modified.
                    440: This option is meaningful only for the most recently returned
                    441: file from
                    442: .IR ftsread .
                    443: Normal use is for post-order directory visits, where it causes the
                    444: directory to be re-visited (in both pre and post-order) as well as all
                    445: of its descendants.
                    446: .TP
                    447: FTS_FOLLOW
                    448: The referenced file must be a symbolic link.
                    449: If the referenced file is the one most recently returned by
                    450: .IR ftsread ,
                    451: the next call to
                    452: .I ftsread
                    453: returns the file with the
                    454: .I fts_info
                    455: and
                    456: .I fts_statb
                    457: fields reinitialized to reflect the target of the symbolic link instead
                    458: of the symbolic link itself.
                    459: If the file is one of those most recently returned by
                    460: .IR ftschildren ,
                    461: the
                    462: .I fts_info
                    463: and
                    464: .I fts_statb
                    465: fields of the structure, when returned by
                    466: .IR ftsread ,
                    467: will reflect the target of the symbolic link instead of the symbolic link
                    468: itself.
                    469: In either case, if the target of the link is a directory, the pre-order
                    470: return, followed by the return of all of its descendants, followed by a
                    471: post-order return, is done.
                    472: .TP
                    473: FTS_SKIP
                    474: No descendants of this file are visited.
                    475: .PP
                    476: Hard links between directories that do not cause cycles or symbolic
                    477: links to symbolic links may cause files to be visited more than once,
                    478: or directories more than twice.
                    479: .SH ERRORS
                    480: .I Ftsopen
                    481: may fail and set errno for any of the errors specified for the library
                    482: routine
                    483: .IR malloc (3).
                    484: .PP
                    485: .I Ftsclose
                    486: may fail and set errno for any of the errors specified for the library
                    487: routine
                    488: .IR chdir (2).
                    489: .PP
                    490: .I Ftsread
                    491: and
                    492: .I ftschildren
                    493: may fail and set errno for any of the errors specified for the library
                    494: routines
                    495: .IR chdir (2),
                    496: .IR getgroups (2),
                    497: .IR malloc (3),
                    498: .IR opendir (3),
                    499: .IR readdir (3)
                    500: and
                    501: .IR stat (2).
                    502: .SH SEE ALSO
                    503: find(1), chdir(2), stat(2), qsort(3)
                    504: .SH STANDARDS
                    505: The
                    506: .I fts
                    507: utility is expected to be a superset of the POSIX 1003.1 specification.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.