1c8f7bbe3SDavid Schultz.\" $OpenBSD: ftw.3,v 1.5 2004/01/25 14:48:32 jmc Exp $ 2c8f7bbe3SDavid Schultz.\" 3c8f7bbe3SDavid Schultz.\" Copyright (c) 2003 Todd C. Miller <Todd.Miller@courtesan.com> 4c8f7bbe3SDavid Schultz.\" 5c8f7bbe3SDavid Schultz.\" Permission to use, copy, modify, and distribute this software for any 6c8f7bbe3SDavid Schultz.\" purpose with or without fee is hereby granted, provided that the above 7c8f7bbe3SDavid Schultz.\" copyright notice and this permission notice appear in all copies. 8c8f7bbe3SDavid Schultz.\" 9c8f7bbe3SDavid Schultz.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10c8f7bbe3SDavid Schultz.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11c8f7bbe3SDavid Schultz.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12c8f7bbe3SDavid Schultz.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13c8f7bbe3SDavid Schultz.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14c8f7bbe3SDavid Schultz.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15c8f7bbe3SDavid Schultz.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16c8f7bbe3SDavid Schultz.\" 17c8f7bbe3SDavid Schultz.\" Sponsored in part by the Defense Advanced Research Projects 18c8f7bbe3SDavid Schultz.\" Agency (DARPA) and Air Force Research Laboratory, Air Force 19c8f7bbe3SDavid Schultz.\" Materiel Command, USAF, under agreement number F39502-99-1-0512. 20c8f7bbe3SDavid Schultz.\" 21*18a9889fSMateusz Piotrowski.Dd March 12, 2020 22c8f7bbe3SDavid Schultz.Dt FTW 3 23c8f7bbe3SDavid Schultz.Os 24c8f7bbe3SDavid Schultz.Sh NAME 25c8f7bbe3SDavid Schultz.Nm ftw , nftw 26c8f7bbe3SDavid Schultz.Nd traverse (walk) a file tree 27c8f7bbe3SDavid Schultz.Sh SYNOPSIS 281c5f1e7aSRuslan Ermilov.In ftw.h 29c8f7bbe3SDavid Schultz.Ft int 30c8f7bbe3SDavid Schultz.Fo ftw 31c8f7bbe3SDavid Schultz.Fa "const char *path" 321c5f1e7aSRuslan Ermilov.Fa "int \*[lp]*fn\*[rp]\*[lp]const char *, const struct stat *, int\*[rp]" 33c8f7bbe3SDavid Schultz.Fa "int maxfds" 34c8f7bbe3SDavid Schultz.Fc 35c8f7bbe3SDavid Schultz.Ft int 36c8f7bbe3SDavid Schultz.Fo nftw 37c8f7bbe3SDavid Schultz.Fa "const char *path" 3816a97b85SRuslan Ermilov.Fa "int \*[lp]*fn\*[rp]\*[lp]const char *, const struct stat *, int, struct FTW *\*[rp]" 39c8f7bbe3SDavid Schultz.Fa "int maxfds" 40c8f7bbe3SDavid Schultz.Fa "int flags" 41c8f7bbe3SDavid Schultz.Fc 42c8f7bbe3SDavid Schultz.Sh DESCRIPTION 43c8f7bbe3SDavid SchultzThe 44c8f7bbe3SDavid Schultz.Fn ftw 45c8f7bbe3SDavid Schultzand 46c8f7bbe3SDavid Schultz.Fn nftw 47c8f7bbe3SDavid Schultzfunctions traverse (walk) the directory hierarchy rooted in 48c8f7bbe3SDavid Schultz.Fa path . 49c8f7bbe3SDavid SchultzFor each object in the hierarchy, these functions call the function 50c8f7bbe3SDavid Schultzpointed to by 51c8f7bbe3SDavid Schultz.Fa fn . 52c8f7bbe3SDavid SchultzThe 53c8f7bbe3SDavid Schultz.Fn ftw 541c5f1e7aSRuslan Ermilovfunction passes this function a pointer to a 551c5f1e7aSRuslan Ermilov.Dv NUL Ns 561c5f1e7aSRuslan Ermilov-terminated string containing 571c5f1e7aSRuslan Ermilovthe name of the object, a pointer to a 581c5f1e7aSRuslan Ermilov.Vt stat 591c5f1e7aSRuslan Ermilovstructure corresponding to the 60c8f7bbe3SDavid Schultzobject, and an integer flag. 61c8f7bbe3SDavid SchultzThe 62c8f7bbe3SDavid Schultz.Fn nftw 63c8f7bbe3SDavid Schultzfunction passes the aforementioned arguments plus a pointer to a 641c5f1e7aSRuslan Ermilov.Vt FTW 65c8f7bbe3SDavid Schultzstructure as defined by 661c5f1e7aSRuslan Ermilov.In ftw.h 67c8f7bbe3SDavid Schultz(shown below): 68c8f7bbe3SDavid Schultz.Bd -literal 69c8f7bbe3SDavid Schultzstruct FTW { 70c8f7bbe3SDavid Schultz int base; /* offset of basename into pathname */ 71c8f7bbe3SDavid Schultz int level; /* directory depth relative to starting point */ 72c8f7bbe3SDavid Schultz}; 73c8f7bbe3SDavid Schultz.Ed 74c8f7bbe3SDavid Schultz.Pp 75c8f7bbe3SDavid SchultzPossible values for the flag passed to 76c8f7bbe3SDavid Schultz.Fa fn 77c8f7bbe3SDavid Schultzare: 781c5f1e7aSRuslan Ermilov.Bl -tag -width ".Dv FTW_DNR" 79c8f7bbe3SDavid Schultz.It Dv FTW_F 80c8f7bbe3SDavid SchultzA regular file. 81c8f7bbe3SDavid Schultz.It Dv FTW_D 82c8f7bbe3SDavid SchultzA directory being visited in pre-order. 83c8f7bbe3SDavid Schultz.It Dv FTW_DNR 84c8f7bbe3SDavid SchultzA directory which cannot be read. 85c8f7bbe3SDavid SchultzThe directory will not be descended into. 86c8f7bbe3SDavid Schultz.It Dv FTW_DP 87c8f7bbe3SDavid SchultzA directory being visited in post-order 880aee91e1SChristian Brueffer.Po Fn nftw 890aee91e1SChristian Bruefferonly 900aee91e1SChristian Brueffer.Pc . 91c8f7bbe3SDavid Schultz.It Dv FTW_NS 92c8f7bbe3SDavid SchultzA file for which no 93c8f7bbe3SDavid Schultz.Xr stat 2 94c8f7bbe3SDavid Schultzinformation was available. 951c5f1e7aSRuslan ErmilovThe contents of the 961c5f1e7aSRuslan Ermilov.Vt stat 971c5f1e7aSRuslan Ermilovstructure are undefined. 98c8f7bbe3SDavid Schultz.It Dv FTW_SL 99c8f7bbe3SDavid SchultzA symbolic link. 100c8f7bbe3SDavid Schultz.It Dv FTW_SLN 101c8f7bbe3SDavid SchultzA symbolic link with a non-existent target 1020aee91e1SChristian Brueffer.Po Fn nftw 1030aee91e1SChristian Bruefferonly 1040aee91e1SChristian Brueffer.Pc . 105c8f7bbe3SDavid Schultz.El 106c8f7bbe3SDavid Schultz.Pp 107c8f7bbe3SDavid SchultzThe 108c8f7bbe3SDavid Schultz.Fn ftw 109c8f7bbe3SDavid Schultzfunction traverses the tree in pre-order. 110c8f7bbe3SDavid SchultzThat is, it processes the directory before the directory's contents. 111c8f7bbe3SDavid Schultz.Pp 112c8f7bbe3SDavid SchultzThe 113c8f7bbe3SDavid Schultz.Fa maxfds 114c8f7bbe3SDavid Schultzargument specifies the maximum number of file descriptors 115c8f7bbe3SDavid Schultzto keep open while traversing the tree. 116c8f7bbe3SDavid SchultzIt has no effect in this implementation. 117c8f7bbe3SDavid Schultz.Pp 118c8f7bbe3SDavid SchultzThe 119c8f7bbe3SDavid Schultz.Fn nftw 120c8f7bbe3SDavid Schultzfunction has an additional 121c8f7bbe3SDavid Schultz.Fa flags 122c8f7bbe3SDavid Schultzargument with the following possible values: 1231c5f1e7aSRuslan Ermilov.Bl -tag -width ".Dv FTW_MOUNT" 124c8f7bbe3SDavid Schultz.It Dv FTW_PHYS 1251c5f1e7aSRuslan ErmilovPhysical walk, do not follow symbolic links. 126c8f7bbe3SDavid Schultz.It Dv FTW_MOUNT 127c8f7bbe3SDavid SchultzThe walk will not cross a mount point. 128c8f7bbe3SDavid Schultz.It FTW_DEPTH 129c8f7bbe3SDavid SchultzProcess directories in post-order. 130c8f7bbe3SDavid SchultzContents of a directory are visited before the directory itself. 131c8f7bbe3SDavid SchultzBy default, 132c8f7bbe3SDavid Schultz.Fn nftw 133c8f7bbe3SDavid Schultztraverses the tree in pre-order. 134c8f7bbe3SDavid Schultz.It FTW_CHDIR 135c8f7bbe3SDavid SchultzChange to a directory before reading it. 136c8f7bbe3SDavid SchultzBy default, 137c8f7bbe3SDavid Schultz.Fn nftw 138c8f7bbe3SDavid Schultzwill change its starting directory. 139c8f7bbe3SDavid SchultzThe current working directory will be restored to its original value before 140c8f7bbe3SDavid Schultz.Fn nftw 141c8f7bbe3SDavid Schultzreturns. 142c8f7bbe3SDavid Schultz.El 143c8f7bbe3SDavid Schultz.Sh RETURN VALUES 144c8f7bbe3SDavid SchultzIf the tree was traversed successfully, the 145c8f7bbe3SDavid Schultz.Fn ftw 146c8f7bbe3SDavid Schultzand 147c8f7bbe3SDavid Schultz.Fn nftw 148c8f7bbe3SDavid Schultzfunctions return 0. 149c8f7bbe3SDavid SchultzIf the function pointed to by 150c8f7bbe3SDavid Schultz.Fa fn 151c8f7bbe3SDavid Schultzreturns a non-zero value, 152c8f7bbe3SDavid Schultz.Fn ftw 153c8f7bbe3SDavid Schultzand 154c8f7bbe3SDavid Schultz.Fn nftw 155c8f7bbe3SDavid Schultzwill stop processing the tree and return the value from 156c8f7bbe3SDavid Schultz.Fa fn . 157c8f7bbe3SDavid SchultzBoth functions return \-1 if an error is detected. 158d4d63c89SMateusz Piotrowski.Sh EXAMPLES 159d4d63c89SMateusz PiotrowskiFollowing there is an example that shows how 160d4d63c89SMateusz Piotrowski.Nm nftw 161d4d63c89SMateusz Piotrowskican be used. 162d4d63c89SMateusz PiotrowskiIt traverses the file tree starting at the directory pointed 163d4d63c89SMateusz Piotrowskiby the only program argument and shows the complete path and a brief 164d4d63c89SMateusz Piotrowskiindicator about the file type. 165d4d63c89SMateusz Piotrowski.Bd -literal -offset 2n 166d4d63c89SMateusz Piotrowski#include <ftw.h> 167d4d63c89SMateusz Piotrowski#include <stdio.h> 168d4d63c89SMateusz Piotrowski#include <sysexits.h> 169d4d63c89SMateusz Piotrowski 170d4d63c89SMateusz Piotrowskiint 171d4d63c89SMateusz Piotrowskinftw_callback(const char *path, const struct stat *sb, int typeflag, struct FTW *ftw) 172d4d63c89SMateusz Piotrowski{ 173d4d63c89SMateusz Piotrowski char type; 174d4d63c89SMateusz Piotrowski 175d4d63c89SMateusz Piotrowski switch(typeflag) { 176d4d63c89SMateusz Piotrowski case FTW_F: 177d4d63c89SMateusz Piotrowski type = 'F'; 178d4d63c89SMateusz Piotrowski break; 179d4d63c89SMateusz Piotrowski case FTW_D: 180d4d63c89SMateusz Piotrowski type = 'D'; 181d4d63c89SMateusz Piotrowski break; 182d4d63c89SMateusz Piotrowski case FTW_DNR: 183d4d63c89SMateusz Piotrowski type = '-'; 184d4d63c89SMateusz Piotrowski break; 185d4d63c89SMateusz Piotrowski case FTW_DP: 186d4d63c89SMateusz Piotrowski type = 'd'; 187d4d63c89SMateusz Piotrowski break; 188d4d63c89SMateusz Piotrowski case FTW_NS: 189d4d63c89SMateusz Piotrowski type = 'X'; 190d4d63c89SMateusz Piotrowski break; 191d4d63c89SMateusz Piotrowski case FTW_SL: 192d4d63c89SMateusz Piotrowski type = 'S'; 193d4d63c89SMateusz Piotrowski break; 194d4d63c89SMateusz Piotrowski case FTW_SLN: 195d4d63c89SMateusz Piotrowski type = 's'; 196d4d63c89SMateusz Piotrowski break; 197d4d63c89SMateusz Piotrowski default: 198d4d63c89SMateusz Piotrowski type = '?'; 199d4d63c89SMateusz Piotrowski break; 200d4d63c89SMateusz Piotrowski } 201d4d63c89SMateusz Piotrowski 202d4d63c89SMateusz Piotrowski printf("[%c] %s\\n", type, path); 203d4d63c89SMateusz Piotrowski 204d4d63c89SMateusz Piotrowski return (0); 205d4d63c89SMateusz Piotrowski} 206d4d63c89SMateusz Piotrowski 207d4d63c89SMateusz Piotrowskiint 208d4d63c89SMateusz Piotrowskimain(int argc, char **argv) 209d4d63c89SMateusz Piotrowski{ 210*18a9889fSMateusz Piotrowski 211d4d63c89SMateusz Piotrowski if (argc != 2) { 212d4d63c89SMateusz Piotrowski printf("Usage %s <directory>\\n", argv[0]); 213d4d63c89SMateusz Piotrowski return (EX_USAGE); 214d4d63c89SMateusz Piotrowski } else 215d4d63c89SMateusz Piotrowski return (nftw(argv[1], nftw_callback, /* UNUSED */ 1, 0)); 216d4d63c89SMateusz Piotrowski} 217d4d63c89SMateusz Piotrowski.Ed 218c8f7bbe3SDavid Schultz.Sh ERRORS 219c8f7bbe3SDavid SchultzThe 220c8f7bbe3SDavid Schultz.Fn ftw 221c8f7bbe3SDavid Schultzand 222c8f7bbe3SDavid Schultz.Fn nftw 223c8f7bbe3SDavid Schultzfunctions may fail and set 224c8f7bbe3SDavid Schultz.Va errno 225c8f7bbe3SDavid Schultzfor any of the errors specified for the library functions 226c8f7bbe3SDavid Schultz.Xr close 2 , 227c8f7bbe3SDavid Schultz.Xr open 2 , 228c8f7bbe3SDavid Schultz.Xr stat 2 , 229c8f7bbe3SDavid Schultz.Xr malloc 3 , 230c8f7bbe3SDavid Schultz.Xr opendir 3 231c8f7bbe3SDavid Schultzand 232c8f7bbe3SDavid Schultz.Xr readdir 3 . 233c8f7bbe3SDavid SchultzIf the 234c8f7bbe3SDavid Schultz.Dv FTW_CHDIR 235c8f7bbe3SDavid Schultzflag is set, the 236c8f7bbe3SDavid Schultz.Fn nftw 237c8f7bbe3SDavid Schultzfunction may fail and set 238c8f7bbe3SDavid Schultz.Va errno 239c8f7bbe3SDavid Schultzfor any of the errors specified for 240c8f7bbe3SDavid Schultz.Xr chdir 2 . 241c8f7bbe3SDavid SchultzIn addition, either function may fail and set 242c8f7bbe3SDavid Schultz.Va errno 243c8f7bbe3SDavid Schultzas follows: 244c8f7bbe3SDavid Schultz.Bl -tag -width Er 245c8f7bbe3SDavid Schultz.It Bq Er EINVAL 246c8f7bbe3SDavid SchultzThe 247c8f7bbe3SDavid Schultz.Fa maxfds 248c8f7bbe3SDavid Schultzargument is less than 1. 249c8f7bbe3SDavid Schultz.El 250c8f7bbe3SDavid Schultz.Sh SEE ALSO 251c8f7bbe3SDavid Schultz.Xr chdir 2 , 252c8f7bbe3SDavid Schultz.Xr close 2 , 253c8f7bbe3SDavid Schultz.Xr open 2 , 254c8f7bbe3SDavid Schultz.Xr stat 2 , 255c8f7bbe3SDavid Schultz.Xr fts 3 , 256c8f7bbe3SDavid Schultz.Xr malloc 3 , 257c8f7bbe3SDavid Schultz.Xr opendir 3 , 258c8f7bbe3SDavid Schultz.Xr readdir 3 259c8f7bbe3SDavid Schultz.Sh STANDARDS 260c8f7bbe3SDavid SchultzThe 261c8f7bbe3SDavid Schultz.Fn ftw 262c8f7bbe3SDavid Schultzand 263c8f7bbe3SDavid Schultz.Fn nftw 264c8f7bbe3SDavid Schultzfunctions conform to 265c8f7bbe3SDavid Schultz.St -p1003.1-2001 . 266c8f7bbe3SDavid Schultz.Sh HISTORY 2671c5f1e7aSRuslan ErmilovThese functions first appeared in 2681c5f1e7aSRuslan Ermilov.At V.3 . 269c8f7bbe3SDavid SchultzTheir first 270c8f7bbe3SDavid Schultz.Fx 271c8f7bbe3SDavid Schultzappearance was in 272c8f7bbe3SDavid Schultz.Fx 5.3 . 273c8f7bbe3SDavid Schultz.Sh BUGS 274c8f7bbe3SDavid SchultzThe 275c8f7bbe3SDavid Schultz.Fa maxfds 276c8f7bbe3SDavid Schultzargument is currently ignored. 277