Annotation of 43BSDReno/lib/libc/gen/fts.3, revision 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.