Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
FTS(3)			    Library Functions Manual			FTS(3)

NAME
       fts -- traverse a file hierarchy

LIBRARY
       Standard	C Library (libc, -lc)

SYNOPSIS
       #include	<fts.h>

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

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

       FTSENT *
       fts_read(FTS *ftsp);

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

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

       void
       fts_set_clientptr(FTS *ftsp, void *clientdata);

       void *
       fts_get_clientptr(FTS *ftsp);

       FTS *
       fts_get_stream(FTSENT *f);

       int
       fts_close(FTS *ftsp);

DESCRIPTION
       The fts functions are provided for traversing Unix file hierarchies.  A
       simple  overview	 is that the fts_open()	and fts_open_b() functions re-
       turn a "handle" on a file hierarchy, which  is  then  supplied  to  the
       other  fts  functions.	The fts_read() function	returns	a pointer to a
       structure describing one	of the	files  in  the	file  hierarchy.   The
       fts_children()  function	 returns  a pointer to a linked	list of	struc-
       tures, each of which describes one of the files contained in  a	direc-
       tory in the hierarchy.  In general, directories are visited two distin-
       guishable times;	in pre-order (before any of their descendants are vis-
       ited)  and in post-order	(after all of their descendants	have been vis-
       ited).  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  por-
       tions 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 it-
       self.  The second is FTSENT, the	structure that represents  a  file  in
       the  file  hierarchy.   Normally,  an  FTSENT structure is returned for
       every file in the file hierarchy.  In  this  manual  page,  "file"  and
       "FTSENT structure" are generally	interchangeable.

       The  FTS	 structure  contains  space for	a single pointer, which	may be
       used  to	 store	application  data   or	 per-hierarchy	 state.	   The
       fts_set_clientptr()  and	 fts_get_clientptr()  functions	may be used to
       set and retrieve	this pointer.  This is likely to be useful  only  when
       accessed	 from  the  sort  comparison function, which can determine the
       original	FTS stream of its arguments using the  fts_get_stream()	 func-
       tion.   The  two	get functions are also available as macros of the same
       name.

       The FTSENT structure contains at	least the following fields, which  are
       described in greater detail below:

       typedef struct _ftsent {
	       int fts_info;		       /* status for FTSENT structure */
	       char *fts_accpath;	       /* access path */
	       char *fts_path;		       /* root path */
	       size_t fts_pathlen;	       /* strlen(fts_path) */
	       char *fts_name;		       /* file name */
	       size_t fts_namelen;	       /* strlen(fts_name) */
	       long fts_level;		       /* depth	(-1 to N) */
	       int fts_errno;		       /* file errno */
	       long 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 values	describing the returned	FTSENT
		    structure  and the file it represents.  With the exception
		    of directories without errors (FTS_D), all	of  these  en-
		    tries  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 imme-
				 diately follows FTS_D,	in  place  of  FTS_DP,
				 when  the  directory could not	be entered, or
				 could be entered but not 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	speci-
				 fied	as   a	file  name  to	fts_open()  or
				 fts_open_b() (see FTS_SEEDOT).

		    FTS_DP	 A directory being visited in post-order.  The
				 contents of the FTSENT	structure will be  un-
				 changed  from	when the directory was visited
				 in pre-order, except for the fts_info field.

		    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  contents  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  contents  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_accpath  A path for accessing the file from the current directory.

       fts_path	    The	 path for the file relative to the root	of the traver-
		    sal.  This path contains the path specified	to  fts_open()
		    or fts_open_b() 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 traver-
		    sal	is numbered FTS_ROOTPARENTLEVEL	(-1), and  the	FTSENT
		    structure  for  the	 root itself is	numbered FTS_ROOTLEVEL
		    (0).

       fts_errno    Upon return	of a FTSENT structure from the	fts_children()
		    or	fts_read()  functions,	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 pro-
		    gram and is	not modified by	the fts	functions.  It is ini-
		    tialized to	0.

       fts_pointer  This field is provided for the use of the application pro-
		    gram and is	not modified by	the fts	functions.  It is ini-
		    tialized to	NULL.

       fts_parent   A  pointer to the FTSENT structure referencing the file in
		    the	hierarchy immediately above the	 current  file,	 i.e.,
		    the	 directory  of	which this file	is a member.  A	parent
		    structure for the initial entry point is provided as well,
		    however, 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.  Otherwise, 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	direc-
		    tories, or a symbolic link pointing	to  a  directory,  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  NUL-terminated  only	for the	file most recently re-
       turned by fts_read().  To use these fields to reference any files  rep-
       resented	 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 modifications should be undone before fur-
       ther  calls  to fts_read() are attempted.  The fts_name field is	always
       NUL-terminated.

   Thread Safety
       The fts functions can safely be used in	multi-threaded	programs  pro-
       vided no	two threads access the same FTS	or FTSENT structure simultane-
       ously.	However,  unless the FTS_NOCHDIR flag was passed to fts_open()
       or fts_open_b(),	calls to fts_read() and	fts_children() may change  the
       current	working	directory, which will affect all threads.  Conversely,
       changing	the current working directory either during or	between	 calls
       to  fts_read()  or fts_children() (even in a single-thread program) may
       cause fts to malfunction	unless the  FTS_NOCHDIR	 flag  was  passed  to
       fts_open() or fts_open_b() and all paths	in path_argv were absolute.

   fts_open()
       The fts_open() function takes a pointer to an array of character	point-
       ers  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 se-
       lected 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_COMFOLLOWDIR	 This option is	similar	 to  FTS_COMFOLLOW,  but  only
			 follows symbolic links	to directories.

       FTS_LOGICAL	 This  option causes the fts routines to return	FTSENT
			 structures for	the targets of symbolic	links  instead
			 of  the symbolic links	themselves.  If	this option is
			 set, the only symbolic	links for which	FTSENT	struc-
			 tures	are returned to	the application	are those ref-
			 erencing non-existent files.  Either  FTS_LOGICAL  or
			 FTS_PHYSICAL must be provided to the fts_open() func-
			 tion.

       FTS_NOCHDIR	 To  allow descending to arbitrary depths (independent
			 of {PATH_MAX})	and improve performance, the fts func-
			 tions change directories as they walk the file	 hier-
			 archy.	  This has the side-effect that	an application
			 cannot	rely on	being in any particular	directory dur-
			 ing the traversal.  The FTS_NOCHDIR option turns  off
			 this  feature,	 and the fts functions will not	change
			 the current directory.	 Note that applications	should
			 not themselves	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	information (the statp field) for each
			 file visited.	This option relaxes  that  requirement
			 as a performance optimization,	allowing the fts func-
			 tions to set the fts_info field to FTS_NSOK and leave
			 the contents of the statp field undefined.

       FTS_NOSTAT_TYPE	 This option is	similar	to FTS_NOSTAT, but attempts to
			 populate  fts_info  based  on	information  from  the
			 d_type	field of struct	dirent.

       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 returned	to  the	 application.	Either
			 FTS_LOGICAL  or  FTS_PHYSICAL must be provided	to the
			 fts_open() function.

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

       FTS_XDEV		 This option prevents fts from descending into	direc-
			 tories	 that  have a different	device number than the
			 file from which the descent began.

       The compar argument points to a user-defined function which may be used
       to order	the traversal of the hierarchy.	  It  takes  two  pointers  to
       pointers	to FTSENT structures as	arguments 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  af-
       ter,  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_open_b()
       The fts_open_b()	function is identical to  fts_open()  except  that  it
       takes  a	 block	pointer	 instead  of a function	pointer.  The block is
       copied before fts_open_b() returns, so the original can safely  go  out
       of scope	or be released.

   fts_read()
       The  fts_read()	function  returns a pointer to an FTSENT structure de-
       scribing	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	direc-
       tories more than	twice.)

       If all the members of the hierarchy have	been returned, fts_read()  re-
       turns  NULL and sets the	external variable errno	to 0.  If an error un-
       related to a file in the	hierarchy occurs, fts_read() returns NULL  and
       sets  errno  appropriately.  If an error	related	to a returned file oc-
       curs, a pointer to an FTSENT structure is returned, and	errno  may  or
       may  not	 have  been set	(see fts_info).	 Note that fts_read() will not
       set errno to 0 if called	again with the same ftsp  argument  after  the
       FTS_STOP	flag has been set or the end of	the stream has been reached.

       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 overwritten un-
       til after a call	to fts_read() after the	FTSENT structure has been  re-
       turned by the fts_read()	function 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 re-
       cently 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  hierar-
       chy,  fts_children()  will return a pointer to the files	in the logical
       directory specified to fts_open() or fts_open_b(), i.e.,	the  arguments
       specified  to  fts_open()  or  fts_open_b().   Otherwise, if the	FTSENT
       structure most recently returned	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 af-
       ter 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 fts_set() function 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 directory 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 ref-
		     erenced  file  is	the  one  most	recently  returned  by
		     fts_read(), the next call to fts_read() returns the  file
		     with  the	fts_info and fts_statp fields reinitialized to
		     reflect 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_set_clientptr(),	fts_get_clientptr()
       The  fts_set_clientptr()	 function sets the client data pointer for the
       stream ftsp to clientdata.  The	fts_get_clientptr()  function  returns
       the client data pointer associated with ftsp.  This can be used to pass
       per-stream data to the comparison function.

       For  performance	reasons, fts_get_clientptr() may be shadowed by	a pre-
       processor macro.

   fts_get_stream()
       The fts_get_stream() function returns the fts  stream  associated  with
       the  file  entry	 f.   A	typical	use for	this would be for a comparison
       function	to first call fts_get_stream() on one of its  arguments,  then
       call  fts_get_clientptr()  to  obtain the client	data pointer, which in
       turn points to information necessary to correctly  order	 the  two  en-
       tries.

       For  performance	 reasons,  fts_get_stream()  may be shadowed by	a pre-
       processor macro.

   fts_close()
       The fts_close() function	closes a file hierarchy	stream	ftsp  and  re-
       stores  the current directory to	the directory from which fts_open() or
       fts_open_b() was	called to open ftsp.

RETURN VALUES
       The fts_open() and fts_open_b() functions return	a pointer to  the  new
       fts stream on success and NULL on failure.

       The  fts_read()	function  returns  a pointer to	the next file entry on
       success,	or if an error occurs that relates specifically	to  that  file
       entry.	On reaching the	end of the file	hierarchy, it returns NULL and
       sets the	external variable errno	to 0.  On failure, it returns NULL and
       sets errno to an	appropriate non-zero value.  If	called again after the
       FTS_STOP	flag has been set or the end of	the stream has	been  reached,
       fts_read() returns NULL and leaves errno	untouched.

       The  fts_children() function returns a pointer to a linked list of file
       entries on success.  On reaching	the end	of the file hierarchy, it  re-
       turns  NULL  and	sets the external variable errno to 0.	On failure, it
       returns NULL and	sets errno to an appropriate non-zero value.

       The fts_set() function returns 0	on success and -1 if its  instr	 argu-
       ment is invalid.

       The  fts_get_clientptr()	function returns the client data pointer asso-
       ciated with its argument, or NULL if none has been set.

       The fts_get_stream() function returns a pointer to the fts stream asso-
       ciated with its argument.

       The fts_close() function	returns	0 on success, and -1 if	an  error  oc-
       curs.

ERRORS
       The  fts_open()	and  fts_open_b() functions may	fail and set errno for
       any of the errors specified  for	 the  library  functions  open(2)  and
       malloc(3).   The	 fts_open_b()  function	may also fail and set errno to
       ENOSYS if the blocks runtime is missing.

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

       The  fts_read() and fts_children() functions 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,  the  fts_children(), fts_open(), and fts_set() functions
       may fail	and set	errno as follows:

       [EINVAL]		  The options were invalid, or the list	was empty.

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

HISTORY
       The   fts   interface   was   first   introduced	  in   4.4BSD.	   The
       fts_get_clientptr(),  fts_get_stream(),	and  fts_set_clientptr() func-
       tions were introduced in	FreeBSD	5.0, principally to provide for	alter-
       native interfaces to the	fts functionality using	different data	struc-
       tures.	Blocks support and the FTS_COMFOLLOWDIR	and FTS_NOSTAT options
       were added in FreeBSD 15.0 based	on similar functionality in macOS.

BUGS
       The fts_open() function will automatically set the  FTS_NOCHDIR	option
       if the FTS_LOGICAL option is provided, or if it cannot open(2) the cur-
       rent directory.

FreeBSD	15.0			October	6, 2025				FTS(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=fts&manpath=FreeBSD+15.0-RELEASE+and+Ports>

home | help