|
|
1.1 ! root 1: .TH FTWALK 3 ! 2: .SH NAME ! 3: \fBftwalk\fR \- file tree walker ! 4: .SH SYNOPSIS ! 5: .ta .75i 1.5i 2.25i 3i 3.75i 4.5i 5.25i 6i ! 6: .PP ! 7: .nf ! 8: \fB ! 9: #include <ftwalk.h> ! 10: ! 11: ftwalk(char* path, int (*userf)(struct FTW* ftw), int options, ! 12: int (*comparf)(struct FTW* ftw1, struct FTW* ftw2)) ! 13: \fR ! 14: .fi ! 15: .SH DESCRIPTION ! 16: .PP ! 17: \fIFtwalk\fR traverses a directory hierarchy using depth-first search. ! 18: Upon visiting each file or directory in the hierarchy, it calls ! 19: the user function \fIuserf\fP to process that file or directory. ! 20: On a directory object, \fIuserf\fR may be called twice, once in preorder ! 21: and once in postorder. ! 22: On a terminal object such as a file or an unreadable directory, ! 23: \fIuserf\fP is called only once. ! 24: Cycles due to hard links or symbolic links are detected ! 25: to avoid infinite loops. ! 26: .PP ! 27: \fIPath\fR is the starting point of the search. ! 28: It may be an absolute path name or a path name relative to ! 29: the current directory. ! 30: If \fIpath\fR is a null pointer or points to an empty string, it is treated ! 31: as if it points to the current (dot) directory. ! 32: .PP ! 33: \fIOptions\fR consists of zero or more of the following bits: ! 34: .IP ! 35: FTW_CHILDREN: ! 36: This implies preorder calls to \fIuserf\fR on directory objects. ! 37: On such a call to \fIuserf\fR, ! 38: the field \fIftw->link\fR (below) points to a link list of ! 39: the children of the respective directory. ! 40: Upon returning from \fIuserf\fP, ! 41: if the field \fIftw->status\fR of any child object ! 42: is set to FTW_SKIP (below), that child is pruned from the search. ! 43: .IP ! 44: FTW_DELAY: When \fBFTW_CHILDREN\fP is turned on, ! 45: the fields \fIftw->statb\fP (\fIstruct stat\fP) of children objects ! 46: remain undefined until these objects are visited. ! 47: .IP ! 48: FTW_DOT: Do not use \fIchdir\fR(2) during the traversal. ! 49: Normally \fIchdir\fR is used so that ! 50: the base name of the object about to be processed can be used ! 51: in accessing its data. ! 52: This can enhance \fIftwalk\fR efficiency but certain program effects ! 53: such as core dumps may be generated in unexpected places ! 54: or may not even be generated at all. ! 55: Whenever \fIchdir\fR generates an error, if possible, ! 56: the current directory is restored to the starting directory ! 57: (see FTW_NAME and FTW_PATH). ! 58: .IP ! 59: FTW_MULTIPLE: The \fIpath\fP argument is treated as a \fIchar**\fP ! 60: pointer to a null-terminated array of path names. ! 61: All hierarchies rooted at these paths will be searched ! 62: .IP ! 63: FTW_POST: Calls to the user function are issued only in postorder. ! 64: That is, \fIuserf\fP is called on a directory only after its descendants have ! 65: been processed. ! 66: The absence of this bit indicates that calls to the user functions ! 67: are issued in preorder. That is, \fIuserf\fP is ! 68: called on a directory before its descendants are processed. ! 69: .IP ! 70: FTW_PHYSICAL: Use \fIlstat\fR(2) instead of \fIstat\fR(2) to get ! 71: file status and allow detection of symbolic links. ! 72: In addition, if each component ! 73: of the absolute path to the starting object has search permission, ! 74: the absolute path is used for early detection of cycles. ! 75: .IP ! 76: FTW_TWICE: Calls to the user function are issued in both preorder and postorder ! 77: for directory objects. ! 78: .IP ! 79: FTW_USER: The first of 6 user defined option bits. ! 80: These bits are ignored by \fIftwalk\fP. ! 81: .PP ! 82: \fIUserf\fR is a user supplied function that is ! 83: called upon different visits of an object. ! 84: If the return value of \fIuserf\fR is non-zero, ! 85: \fIftwalk\fR returns immediately with the same value. ! 86: The \fIuserf\fP prototype is: ! 87: .PP ! 88: .nf ! 89: int userf(struct FTW* ftw) ! 90: .fi ! 91: .PP ! 92: \fBstruct FTW\fP contains at least the following elements: ! 93: .PP ! 94: .nf ! 95: struct FTW* link; /* link list of children */ ! 96: struct FTW* parent; /* parent object on the search path */ ! 97: union ! 98: { ! 99: long number; /* local number */ ! 100: void* pointer; /* local pointer */ ! 101: } local; /* user defined */ ! 102: struct stat statb; /* stat buffer of this object */ ! 103: char* path; /* full pathname */ ! 104: short pathlen; /* strlen(path) */ ! 105: unsigned short info; /* type of object */ ! 106: unsigned short status; /* status of object */ ! 107: short level; /* depth of object on the search path */ ! 108: short namelen; /* strlen(name) */ ! 109: char name[]; /* file name of object */ ! 110: .fi ! 111: .PP ! 112: The \fIlink\fR field is normally NULL. ! 113: If the option FTW_CHILDREN was turned on, ! 114: it points to the start of the list of children ! 115: of the directory being visited in preorder. ! 116: Finally, if the directory being visited causes a cycle, ! 117: \fIlink\fR points to the object on the search path that is ! 118: identical to this directory. Note that if FTW_PHYSICAL was turned on, ! 119: this may point to a directory that is an ancestor of the starting ! 120: object. ! 121: .PP ! 122: The \fIparent\fR field points to the parent object ! 123: on the search path. For convenience, a parent object is also supplied for ! 124: the starting object. ! 125: In this case, except for the \fIlocal\fR field which is initialized ! 126: to 0 and the \fIlevel\fR field which contains a negative number, ! 127: the rest of the structure may be undefined. ! 128: .PP ! 129: The \fIinfo\fR field indicates the type of the object ! 130: being visited and the type of the visit. The types are: ! 131: .IP ! 132: FTW_D: A directory being visited in preorder, i.e., ! 133: none of its children has been visited by the search. ! 134: .IP ! 135: FTW_DNX: A directory being visited in preorder that does not have ! 136: search permission. ! 137: .IP ! 138: FTW_DP: A directory being visited in postorder, i.e., all of its ! 139: descendants have been completely processed. ! 140: .IP ! 141: FTW_DC: A directory that causes cycles. This is a terminal object. ! 142: .IP ! 143: FTW_DNR: A directory that cannot be opened for reading. This is a terminal object. ! 144: .IP ! 145: FTW_F: An ordinary file. ! 146: .IP ! 147: FTW_SL: A symbolic link. ! 148: Unless FTW_FOLLOW (below) is issued by the user function, ! 149: this object is terminal. ! 150: .IP ! 151: FTW_NS: \fIStat\fR failed on this object. ! 152: The stat buffer \fIstatb\fR is undefined. ! 153: This object is terminal. ! 154: .PP ! 155: The \fIstatus\fR field of \fIstruct FTW\fR is used to communicate information ! 156: between \fIftwalk\fR and \fIuserf\fR. On calls to \fIuserf\fR, it has one of ! 157: two values: ! 158: .IP ! 159: FTW_NAME: The name of the object as defined in \fIftw->name\fR should be used for ! 160: accessing its file information. This is because \fIchdir\fR(2) has been used ! 161: to set the current directory to a suitable place (see FTW_CHDIR). ! 162: .IP ! 163: FTW_PATH: The argument \fIpath\fR of \fIuserf\fR should be used ! 164: for accessing the file information of the object. ! 165: .PP ! 166: Upon returning, \fIuserf\fR may set the \fIstatus\fR field ! 167: to one of the following values: ! 168: .IP ! 169: FTW_AGAIN: If this is a directory object being visited in postorder, ! 170: it will be processed \fIagain\fR as if it had not been visited. ! 171: .IP ! 172: FTW_NOPOST: If this is a directory object being visited in preorder, ! 173: the user function will not be called on its postorder visit. ! 174: .IP ! 175: FTW_SKIP: This object and its descendants are pruned from the search. ! 176: .IP ! 177: FTW_FOLLOW: If this object is a symbolic link, ! 178: follow the link to its physical counterpart. ! 179: .PP ! 180: \fIComparf\fR, if not NULL, is a pointer to a function ! 181: used to define a search ordering for children of a directory. ! 182: If FTW_CHILDREN is turned on, the ordering of the children of ! 183: a directory is done before the preorder call to \fIuserf\fR on that directory. ! 184: Therefore, in that case, \fIftw->link\fR will point to the smallest child. ! 185: .PP ! 186: The \fIcomparf\fP prototype is: ! 187: .PP ! 188: .nf ! 189: int comparf(struct FTW* ftw1, struct FTW* ftw2) ! 190: .fi ! 191: .PP ! 192: \fIComparf\fR should return a value <0, 0, or >0 to indicate whether ! 193: \fIftw1\fR is considered smaller, equal, or larger than \fIftw2\fR. ! 194: .PP ! 195: \fIFtwalk\fR normally returns 0. ! 196: On hard errors such as running out of memory, it returns -1. ! 197: \fIFtwalk\fR may also return other values as discussed with respect ! 198: to \fIuserf\fR. ! 199: .SH HISTORY ! 200: \fIFtwalk\fR performs similar functions as that of ! 201: the routine \fIftw\fR provided in System V. ! 202: However, it is more general than \fIftw\fR ! 203: and suitable for use as a base in implementing ! 204: popular tools such as \fIls, find, tar, du,\fR and \fIrm\fR. ! 205: \fIFtwalk\fR also handles symbolic links and hard links gracefully. ! 206: .SH AUTHORS ! 207: Phong Vo, Glenn Fowler, Dave Korn ! 208: .SH SEE ALSO ! 209: find(1), rm(1), du(1), ls(1), tar(1), stat(2), symlink(2), chdir(3), ftw(3).
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.