Blame extension/fts.3

Packit Service f629e6
.\"	$NetBSD: fts.3,v 1.30 2011/03/30 16:29:26 jruoho Exp $
Packit Service f629e6
.\"
Packit Service f629e6
.\" Copyright (c) 1989, 1991, 1993, 1994
Packit Service f629e6
.\"	The Regents of the University of California.  All rights reserved.
Packit Service f629e6
.\"
Packit Service f629e6
.\" Redistribution and use in source and binary forms, with or without
Packit Service f629e6
.\" modification, are permitted provided that the following conditions
Packit Service f629e6
.\" are met:
Packit Service f629e6
.\" 1. Redistributions of source code must retain the above copyright
Packit Service f629e6
.\"    notice, this list of conditions and the following disclaimer.
Packit Service f629e6
.\" 2. Redistributions in binary form must reproduce the above copyright
Packit Service f629e6
.\"    notice, this list of conditions and the following disclaimer in the
Packit Service f629e6
.\"    documentation and/or other materials provided with the distribution.
Packit Service f629e6
.\" 3. Neither the name of the University nor the names of its contributors
Packit Service f629e6
.\"    may be used to endorse or promote products derived from this software
Packit Service f629e6
.\"    without specific prior written permission.
Packit Service f629e6
.\"
Packit Service f629e6
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
Packit Service f629e6
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit Service f629e6
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit Service f629e6
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Packit Service f629e6
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit Service f629e6
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit Service f629e6
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit Service f629e6
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
Packit Service f629e6
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
Packit Service f629e6
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Packit Service f629e6
.\" SUCH DAMAGE.
Packit Service f629e6
.\"
Packit Service f629e6
.\"     @(#)fts.3	8.5 (Berkeley) 4/16/94
Packit Service f629e6
.\"
Packit Service f629e6
.Dd March 30, 2011
Packit Service f629e6
.Dt FTS 3
Packit Service f629e6
.Os
Packit Service f629e6
.Sh NAME
Packit Service f629e6
.Nm fts ,
Packit Service f629e6
.Nm fts_open ,
Packit Service f629e6
.Nm fts_read ,
Packit Service f629e6
.Nm fts_children ,
Packit Service f629e6
.Nm fts_set ,
Packit Service f629e6
.Nm fts_close
Packit Service f629e6
.Nd traverse a file hierarchy
Packit Service f629e6
.Sh LIBRARY
Packit Service f629e6
.Lb libc
Packit Service f629e6
.Sh SYNOPSIS
Packit Service f629e6
.In sys/types.h
Packit Service f629e6
.In sys/stat.h
Packit Service f629e6
.In fts.h
Packit Service f629e6
.Ft FTS *
Packit Service f629e6
.Fo fts_open
Packit Service f629e6
.Fa "char * const *path_argv"
Packit Service f629e6
.Fa "int options"
Packit Service f629e6
.Fa "int (*compar)(const FTSENT **, const FTSENT **)"
Packit Service f629e6
.Fc
Packit Service f629e6
.Ft FTSENT *
Packit Service f629e6
.Fn fts_read "FTS *ftsp"
Packit Service f629e6
.Ft FTSENT *
Packit Service f629e6
.Fn fts_children "FTS *ftsp" "int options"
Packit Service f629e6
.Ft int
Packit Service f629e6
.Fn fts_set "FTS *ftsp" "FTSENT *f" "int options"
Packit Service f629e6
.Ft int
Packit Service f629e6
.Fn fts_close "FTS *ftsp"
Packit Service f629e6
.Sh DESCRIPTION
Packit Service f629e6
The
Packit Service f629e6
.Nm
Packit Service f629e6
functions are provided for traversing
Packit Service f629e6
.Ux
Packit Service f629e6
file hierarchies.
Packit Service f629e6
A simple overview is that the
Packit Service f629e6
.Fn fts_open
Packit Service f629e6
function returns a
Packit Service f629e6
.Dq handle
Packit Service f629e6
on a file hierarchy, which is then supplied to
Packit Service f629e6
the other
Packit Service f629e6
.Nm
Packit Service f629e6
functions.
Packit Service f629e6
The function
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
returns a pointer to a structure describing one of the files in the file
Packit Service f629e6
hierarchy.
Packit Service f629e6
The function
Packit Service f629e6
.Fn fts_children
Packit Service f629e6
returns a pointer to a linked list of structures, each of which describes
Packit Service f629e6
one of the files contained in a directory in the hierarchy.
Packit Service f629e6
In general, directories are visited two distinguishable times; in pre-order
Packit Service f629e6
(before any of their descendants are visited) and in post-order (after all
Packit Service f629e6
of their descendants have been visited).
Packit Service f629e6
Files are visited once.
Packit Service f629e6
It is possible to walk the hierarchy
Packit Service f629e6
.Dq logically
Packit Service f629e6
(ignoring symbolic links)
Packit Service f629e6
or physically (visiting symbolic links), order the walk of the hierarchy or
Packit Service f629e6
prune and/or re-visit portions of the hierarchy.
Packit Service f629e6
.Pp
Packit Service f629e6
Two structures are defined (and typedef'd) in the include file
Packit Service f629e6
.In fts.h .
Packit Service f629e6
The first is
Packit Service f629e6
.Fa FTS ,
Packit Service f629e6
the structure that represents the file hierarchy itself.
Packit Service f629e6
The second is
Packit Service f629e6
.Fa FTSENT ,
Packit Service f629e6
the structure that represents a file in the file
Packit Service f629e6
hierarchy.
Packit Service f629e6
Normally, an
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure is returned for every file in the file
Packit Service f629e6
hierarchy.
Packit Service f629e6
In this manual page,
Packit Service f629e6
.Dq file
Packit Service f629e6
and
Packit Service f629e6
.Dq Fa FTSENT No structure
Packit Service f629e6
are generally
Packit Service f629e6
interchangeable.
Packit Service f629e6
The
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure contains at least the following fields, which are
Packit Service f629e6
described in greater detail below:
Packit Service f629e6
.Bd -literal -offset 2n
Packit Service f629e6
typedef struct _ftsent {
Packit Service f629e6
	u_short fts_info;		/* flags for FTSENT structure */
Packit Service f629e6
	char *fts_accpath;		/* access path */
Packit Service f629e6
	char *fts_path;			/* root path */
Packit Service f629e6
	short fts_pathlen;		/* strlen(fts_path) */
Packit Service f629e6
	char *fts_name;			/* file name */
Packit Service f629e6
	short fts_namelen;		/* strlen(fts_name) */
Packit Service f629e6
	short fts_level;		/* depth (\-1 to N) */
Packit Service f629e6
	int fts_errno;			/* file errno */
Packit Service f629e6
	long fts_number;		/* local numeric value */
Packit Service f629e6
	void *fts_pointer;		/* local address value */
Packit Service f629e6
	struct ftsent *fts_parent;	/* parent directory */
Packit Service f629e6
	struct ftsent *fts_link;	/* next file structure */
Packit Service f629e6
	struct ftsent *fts_cycle;	/* cycle structure */
Packit Service f629e6
	struct stat *fts_statp;		/* stat(2) information */
Packit Service f629e6
} FTSENT;
Packit Service f629e6
.Ed
Packit Service f629e6
.Pp
Packit Service f629e6
These fields are defined as follows:
Packit Service f629e6
.Bl -tag -width "fts_namelen"
Packit Service f629e6
.It Fa fts_info
Packit Service f629e6
One of the following flags describing the returned
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure and
Packit Service f629e6
the file it represents.
Packit Service f629e6
With the exception of directories without errors
Packit Service f629e6
.Pq Dv FTS_D ,
Packit Service f629e6
all of these
Packit Service f629e6
entries are terminal, that is, they will not be revisited, nor will any
Packit Service f629e6
of their descendants be visited.
Packit Service f629e6
.Bl  -tag -width FTS_DEFAULT
Packit Service f629e6
.It Dv FTS_D
Packit Service f629e6
A directory being visited in pre-order.
Packit Service f629e6
.It Dv FTS_DC
Packit Service f629e6
A directory that causes a cycle in the tree.
Packit Service f629e6
(The
Packit Service f629e6
.Fa fts_cycle
Packit Service f629e6
field of the
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure will be filled in as well).
Packit Service f629e6
.It Dv FTS_DEFAULT
Packit Service f629e6
Any
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure that represents a file type not explicitly described
Packit Service f629e6
by one of the other
Packit Service f629e6
.Fa fts_info
Packit Service f629e6
values.
Packit Service f629e6
.It Dv FTS_DNR
Packit Service f629e6
A directory which cannot be read.
Packit Service f629e6
This is an error return, and the
Packit Service f629e6
.Fa fts_errno
Packit Service f629e6
field will be set to indicate what caused the error.
Packit Service f629e6
.It Dv FTS_DOT
Packit Service f629e6
A file named
Packit Service f629e6
.Ql \&.
Packit Service f629e6
or
Packit Service f629e6
.Ql ..
Packit Service f629e6
which was not specified as a file name to
Packit Service f629e6
.Fn fts_open
Packit Service f629e6
(see
Packit Service f629e6
.Dv FTS_SEEDOT ) .
Packit Service f629e6
.It Dv FTS_DP
Packit Service f629e6
A directory being visited in post-order.
Packit Service f629e6
The contents of the
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure will be unchanged from when
Packit Service f629e6
it was returned in pre-order, i.e., with the
Packit Service f629e6
.Fa fts_info
Packit Service f629e6
field set to
Packit Service f629e6
.Dv FTS_D .
Packit Service f629e6
.It Dv FTS_ERR
Packit Service f629e6
This is an error return, and the
Packit Service f629e6
.Fa fts_errno
Packit Service f629e6
field will be set to indicate what caused the error.
Packit Service f629e6
.It Dv FTS_F
Packit Service f629e6
A regular file.
Packit Service f629e6
.It Dv FTS_NS
Packit Service f629e6
A file for which no
Packit Service f629e6
.Xr stat 2
Packit Service f629e6
information was available.
Packit Service f629e6
The contents of the
Packit Service f629e6
.Fa fts_statp
Packit Service f629e6
field are undefined.
Packit Service f629e6
This is an error return, and the
Packit Service f629e6
.Fa fts_errno
Packit Service f629e6
field will be set to indicate what caused the error.
Packit Service f629e6
.It Dv FTS_NSOK
Packit Service f629e6
A file for which no
Packit Service f629e6
.Xr stat 2
Packit Service f629e6
information was requested.
Packit Service f629e6
The contents of the
Packit Service f629e6
.Fa fts_statp
Packit Service f629e6
field are undefined.
Packit Service f629e6
.It Dv FTS_SL
Packit Service f629e6
A symbolic link.
Packit Service f629e6
.It Dv FTS_SLNONE
Packit Service f629e6
A symbolic link with a non-existent target.
Packit Service f629e6
The contents of the
Packit Service f629e6
.Fa fts_statp
Packit Service f629e6
field reference the file characteristic information for the symbolic link
Packit Service f629e6
itself.
Packit Service f629e6
.It Dv FTS_W
Packit Service f629e6
A whiteout object.
Packit Service f629e6
.El
Packit Service f629e6
.It Fa fts_accpath
Packit Service f629e6
A path for accessing the file from the current directory.
Packit Service f629e6
.It Fa fts_path
Packit Service f629e6
The path for the file relative to the root of the traversal.
Packit Service f629e6
This path contains the path specified to
Packit Service f629e6
.Fn fts_open
Packit Service f629e6
as a prefix.
Packit Service f629e6
.It Fa fts_pathlen
Packit Service f629e6
The length of the string referenced by
Packit Service f629e6
.Fa fts_path .
Packit Service f629e6
.It Fa fts_name
Packit Service f629e6
The name of the file.
Packit Service f629e6
.It Fa fts_namelen
Packit Service f629e6
The length of the string referenced by
Packit Service f629e6
.Fa fts_name .
Packit Service f629e6
.It Fa fts_level
Packit Service f629e6
The depth of the traversal, numbered from \-1 to N, where this file
Packit Service f629e6
was found.
Packit Service f629e6
The
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure representing the parent of the starting point (or root)
Packit Service f629e6
of the traversal is numbered \-1, and the
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure for the root
Packit Service f629e6
itself is numbered 0.
Packit Service f629e6
.It Fa fts_errno
Packit Service f629e6
Upon return of a
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure from the
Packit Service f629e6
.Fn fts_children
Packit Service f629e6
or
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
functions, with its
Packit Service f629e6
.Fa fts_info
Packit Service f629e6
field set to
Packit Service f629e6
.Dv FTS_DNR ,
Packit Service f629e6
.Dv FTS_ERR
Packit Service f629e6
or
Packit Service f629e6
.Dv FTS_NS ,
Packit Service f629e6
the
Packit Service f629e6
.Fa fts_errno
Packit Service f629e6
field contains the value of the external variable
Packit Service f629e6
.Va errno
Packit Service f629e6
specifying the cause of the error.
Packit Service f629e6
Otherwise, the contents of the
Packit Service f629e6
.Fa fts_errno
Packit Service f629e6
field are undefined.
Packit Service f629e6
.It Fa fts_number
Packit Service f629e6
This field is provided for the use of the application program and is
Packit Service f629e6
not modified by the
Packit Service f629e6
.Nm
Packit Service f629e6
functions.
Packit Service f629e6
It is initialized to 0.
Packit Service f629e6
.It Fa fts_pointer
Packit Service f629e6
This field is provided for the use of the application program and is
Packit Service f629e6
not modified by the
Packit Service f629e6
.Nm
Packit Service f629e6
functions.
Packit Service f629e6
It is initialized to
Packit Service f629e6
.Dv NULL .
Packit Service f629e6
.It Fa fts_parent
Packit Service f629e6
A pointer to the
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure referencing the file in the hierarchy
Packit Service f629e6
immediately above the current file, i.e., the directory of which this
Packit Service f629e6
file is a member.
Packit Service f629e6
A parent structure for the initial entry point is provided as well,
Packit Service f629e6
however, only the
Packit Service f629e6
.Fa fts_level ,
Packit Service f629e6
.Fa fts_number
Packit Service f629e6
and
Packit Service f629e6
.Fa fts_pointer
Packit Service f629e6
fields are guaranteed to be initialized.
Packit Service f629e6
.It Fa fts_link
Packit Service f629e6
Upon return from the
Packit Service f629e6
.Fn fts_children
Packit Service f629e6
function, the
Packit Service f629e6
.Fa fts_link
Packit Service f629e6
field points to the next structure in the
Packit Service f629e6
.Dv NULL Ns -terminated
Packit Service f629e6
linked list of directory members.
Packit Service f629e6
Otherwise, the contents of the
Packit Service f629e6
.Fa fts_link
Packit Service f629e6
field are undefined.
Packit Service f629e6
.It Fa fts_cycle
Packit Service f629e6
If a directory causes a cycle in the hierarchy (see
Packit Service f629e6
.Dv FTS_DC ) ,
Packit Service f629e6
either because
Packit Service f629e6
of a hard link between two directories, or a symbolic link pointing to a
Packit Service f629e6
directory, the
Packit Service f629e6
.Fa fts_cycle
Packit Service f629e6
field of the structure will point to the
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure in the hierarchy that references the same file as the current
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure.
Packit Service f629e6
Otherwise, the contents of the
Packit Service f629e6
.Fa fts_cycle
Packit Service f629e6
field are undefined.
Packit Service f629e6
.It Fa fts_statp
Packit Service f629e6
A pointer to
Packit Service f629e6
.Xr stat 2
Packit Service f629e6
information for the file.
Packit Service f629e6
.El
Packit Service f629e6
.Pp
Packit Service f629e6
A single buffer is used for all of the paths of all of the files in the
Packit Service f629e6
file hierarchy.
Packit Service f629e6
Therefore, the
Packit Service f629e6
.Fa fts_path
Packit Service f629e6
and
Packit Service f629e6
.Fa fts_accpath
Packit Service f629e6
fields are guaranteed to be
Packit Service f629e6
.Dv NULL Ns -terminated
Packit Service f629e6
.Em only
Packit Service f629e6
for the file most recently returned by
Packit Service f629e6
.Fn fts_read .
Packit Service f629e6
To use these fields to reference any files represented by other
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structures will require that the path buffer be modified using the
Packit Service f629e6
information contained in that
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure's
Packit Service f629e6
.Fa fts_pathlen
Packit Service f629e6
field.
Packit Service f629e6
Any such modifications should be undone before further calls to
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
are attempted.
Packit Service f629e6
The
Packit Service f629e6
.Fa fts_name
Packit Service f629e6
field is always
Packit Service f629e6
.Dv NULL Ns -terminated .
Packit Service f629e6
.Sh FTS_OPEN
Packit Service f629e6
The
Packit Service f629e6
.Fn fts_open
Packit Service f629e6
function takes a pointer to an array of character pointers naming one
Packit Service f629e6
or more paths which make up a logical file hierarchy to be traversed.
Packit Service f629e6
The array must be terminated by a
Packit Service f629e6
.Dv NULL
Packit Service f629e6
pointer.
Packit Service f629e6
.Pp
Packit Service f629e6
There are
Packit Service f629e6
a number of options, at least one of which (either
Packit Service f629e6
.Dv FTS_LOGICAL
Packit Service f629e6
or
Packit Service f629e6
.Dv FTS_PHYSICAL )
Packit Service f629e6
must be specified.
Packit Service f629e6
The options are selected by
Packit Service f629e6
.Em or Ns 'ing
Packit Service f629e6
the following values:
Packit Service f629e6
.Bl -tag -width "FTS_COMFOLLOW "
Packit Service f629e6
.It Dv FTS_COMFOLLOW
Packit Service f629e6
This option causes any symbolic link specified as a root path to be
Packit Service f629e6
followed immediately whether or not
Packit Service f629e6
.Dv FTS_LOGICAL
Packit Service f629e6
is also specified.
Packit Service f629e6
.It Dv FTS_LOGICAL
Packit Service f629e6
This option causes the
Packit Service f629e6
.Nm
Packit Service f629e6
routines to return
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structures for the targets of symbolic links
Packit Service f629e6
instead of the symbolic links themselves.
Packit Service f629e6
If this option is set, the only symbolic links for which
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structures
Packit Service f629e6
are returned to the application are those referencing non-existent files.
Packit Service f629e6
Either
Packit Service f629e6
.Dv FTS_LOGICAL
Packit Service f629e6
or
Packit Service f629e6
.Dv FTS_PHYSICAL
Packit Service f629e6
.Em must
Packit Service f629e6
be provided to the
Packit Service f629e6
.Fn fts_open
Packit Service f629e6
function.
Packit Service f629e6
.It Dv FTS_NOCHDIR
Packit Service f629e6
As a performance optimization, the
Packit Service f629e6
.Nm
Packit Service f629e6
functions change directories as they walk the file hierarchy.
Packit Service f629e6
This has the side-effect that an application cannot rely on being
Packit Service f629e6
in any particular directory during the traversal.
Packit Service f629e6
The
Packit Service f629e6
.Dv FTS_NOCHDIR
Packit Service f629e6
option turns off this optimization, and the
Packit Service f629e6
.Nm
Packit Service f629e6
functions will not change the current directory.
Packit Service f629e6
Note that applications should not themselves change their current directory
Packit Service f629e6
and try to access files unless
Packit Service f629e6
.Dv FTS_NOCHDIR
Packit Service f629e6
is specified and absolute
Packit Service f629e6
pathnames were provided as arguments to
Packit Service f629e6
.Fn fts_open .
Packit Service f629e6
.It Dv FTS_NOSTAT
Packit Service f629e6
By default, returned
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structures reference file characteristic information (the
Packit Service f629e6
.Fa statp
Packit Service f629e6
field) for each file visited.
Packit Service f629e6
This option relaxes that requirement as a performance optimization,
Packit Service f629e6
allowing the
Packit Service f629e6
.Nm
Packit Service f629e6
functions to set the
Packit Service f629e6
.Fa fts_info
Packit Service f629e6
field to
Packit Service f629e6
.Dv FTS_NSOK
Packit Service f629e6
and leave the contents of the
Packit Service f629e6
.Fa statp
Packit Service f629e6
field undefined.
Packit Service f629e6
.It Dv FTS_PHYSICAL
Packit Service f629e6
This option causes the
Packit Service f629e6
.Nm
Packit Service f629e6
routines to return
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structures for symbolic links themselves instead
Packit Service f629e6
of the target files they point to.
Packit Service f629e6
If this option is set,
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structures for all symbolic links in the
Packit Service f629e6
hierarchy are returned to the application.
Packit Service f629e6
Either
Packit Service f629e6
.Dv FTS_LOGICAL
Packit Service f629e6
or
Packit Service f629e6
.Dv FTS_PHYSICAL
Packit Service f629e6
.Em must
Packit Service f629e6
be provided to the
Packit Service f629e6
.Fn fts_open
Packit Service f629e6
function.
Packit Service f629e6
.It Dv FTS_SEEDOT
Packit Service f629e6
By default, unless they are specified as path arguments to
Packit Service f629e6
.Fn fts_open ,
Packit Service f629e6
any files named
Packit Service f629e6
.Ql \&.
Packit Service f629e6
or
Packit Service f629e6
.Ql ..
Packit Service f629e6
encountered in the file hierarchy are ignored.
Packit Service f629e6
This option causes the
Packit Service f629e6
.Nm
Packit Service f629e6
routines to return
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structures for them.
Packit Service f629e6
.It Dv FTS_WHITEOUT
Packit Service f629e6
Return whiteout entries, which are normally hidden.
Packit Service f629e6
.It Dv FTS_XDEV
Packit Service f629e6
This option prevents
Packit Service f629e6
.Nm
Packit Service f629e6
from descending into directories that have a different device number
Packit Service f629e6
than the file from which the descent began.
Packit Service f629e6
.El
Packit Service f629e6
.Pp
Packit Service f629e6
The argument
Packit Service f629e6
.Fn compar
Packit Service f629e6
specifies a user-defined function which may be used to order the traversal
Packit Service f629e6
of the hierarchy.
Packit Service f629e6
It
Packit Service f629e6
takes two pointers to pointers to
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structures as arguments and
Packit Service f629e6
should return a negative value, zero, or a positive value to indicate
Packit Service f629e6
if the file referenced by its first argument comes before, in any order
Packit Service f629e6
with respect to, or after, the file referenced by its second argument.
Packit Service f629e6
The
Packit Service f629e6
.Fa fts_accpath ,
Packit Service f629e6
.Fa fts_path
Packit Service f629e6
and
Packit Service f629e6
.Fa fts_pathlen
Packit Service f629e6
fields of the
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structures may
Packit Service f629e6
.Em never
Packit Service f629e6
be used in this comparison.
Packit Service f629e6
If the
Packit Service f629e6
.Fa fts_info
Packit Service f629e6
field is set to
Packit Service f629e6
.Dv FTS_NS
Packit Service f629e6
or
Packit Service f629e6
.Dv FTS_NSOK ,
Packit Service f629e6
the
Packit Service f629e6
.Fa fts_statp
Packit Service f629e6
field may not either.
Packit Service f629e6
If the
Packit Service f629e6
.Fn compar
Packit Service f629e6
argument is
Packit Service f629e6
.Dv NULL ,
Packit Service f629e6
the directory traversal order is in the order listed in
Packit Service f629e6
.Fa path_argv
Packit Service f629e6
for the root paths, and in the order listed in the directory for
Packit Service f629e6
everything else.
Packit Service f629e6
.Sh FTS_READ
Packit Service f629e6
The
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
function returns a pointer to an
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure describing a file in
Packit Service f629e6
the hierarchy.
Packit Service f629e6
Directories (that are readable and do not cause cycles) are visited at
Packit Service f629e6
least twice, once in pre-order and once in post-order.
Packit Service f629e6
All other files are visited at least once.
Packit Service f629e6
(Hard links between directories that do not cause cycles or symbolic
Packit Service f629e6
links to symbolic links may cause files to be visited more than once,
Packit Service f629e6
or directories more than twice.)
Packit Service f629e6
.Pp
Packit Service f629e6
If all the members of the hierarchy have been returned,
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
returns
Packit Service f629e6
.Dv NULL
Packit Service f629e6
and sets the external variable
Packit Service f629e6
.Va errno
Packit Service f629e6
to 0.
Packit Service f629e6
If an error unrelated to a file in the hierarchy occurs,
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
returns
Packit Service f629e6
.Dv NULL
Packit Service f629e6
and sets
Packit Service f629e6
.Va errno
Packit Service f629e6
appropriately.
Packit Service f629e6
If an error related to a returned file occurs, a pointer to an
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure is returned, and
Packit Service f629e6
.Va errno
Packit Service f629e6
may or may not have been set (see
Packit Service f629e6
.Fa fts_info ) .
Packit Service f629e6
.Pp
Packit Service f629e6
The
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structures returned by
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
may be overwritten after a call to
Packit Service f629e6
.Fn fts_close
Packit Service f629e6
on the same file hierarchy stream, or, after a call to
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
on the same file hierarchy stream unless they represent a file of type
Packit Service f629e6
directory, in which case they will not be overwritten until after a call to
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
after the
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure has been returned by the function
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
in post-order.
Packit Service f629e6
.Sh FTS_CHILDREN
Packit Service f629e6
The
Packit Service f629e6
.Fn fts_children
Packit Service f629e6
function returns a pointer to an
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure describing the first entry in a
Packit Service f629e6
.Dv NULL Ns -terminated
Packit Service f629e6
linked list of the files in the directory represented by the
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure most recently returned by
Packit Service f629e6
.Fn fts_read .
Packit Service f629e6
The list is linked through the
Packit Service f629e6
.Fa fts_link
Packit Service f629e6
field of the
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure, and is ordered by the user-specified comparison function, if any.
Packit Service f629e6
Repeated calls to
Packit Service f629e6
.Fn fts_children
Packit Service f629e6
will recreate this linked list.
Packit Service f629e6
.Pp
Packit Service f629e6
As a special case, if
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
has not yet been called for a hierarchy,
Packit Service f629e6
.Fn fts_children
Packit Service f629e6
will return a pointer to the files in the logical directory specified to
Packit Service f629e6
.Fn fts_open ,
Packit Service f629e6
i.e., the arguments specified to
Packit Service f629e6
.Fn fts_open .
Packit Service f629e6
Otherwise, if the
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structure most recently returned by
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
is not a directory being visited in pre-order,
Packit Service f629e6
or the directory does not contain any files,
Packit Service f629e6
.Fn fts_children
Packit Service f629e6
returns
Packit Service f629e6
.Dv NULL
Packit Service f629e6
and sets
Packit Service f629e6
.Va errno
Packit Service f629e6
to zero.
Packit Service f629e6
If an error occurs,
Packit Service f629e6
.Fn fts_children
Packit Service f629e6
returns
Packit Service f629e6
.Dv NULL
Packit Service f629e6
and sets
Packit Service f629e6
.Va errno
Packit Service f629e6
appropriately.
Packit Service f629e6
.Pp
Packit Service f629e6
The
Packit Service f629e6
.Fa FTSENT
Packit Service f629e6
structures returned by
Packit Service f629e6
.Fn fts_children
Packit Service f629e6
may be overwritten after a call to
Packit Service f629e6
.Fn fts_children ,
Packit Service f629e6
.Fn fts_close
Packit Service f629e6
or
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
on the same file hierarchy stream.
Packit Service f629e6
.Pp
Packit Service f629e6
.Em Option
Packit Service f629e6
may be set to the following value:
Packit Service f629e6
.Bl -tag -width "FTS_COMFOLLOW "
Packit Service f629e6
.It Dv FTS_NAMEONLY
Packit Service f629e6
Only the names of the files are needed.
Packit Service f629e6
The contents of all the fields in the returned linked list of structures
Packit Service f629e6
are undefined with the exception of the
Packit Service f629e6
.Fa fts_name
Packit Service f629e6
and
Packit Service f629e6
.Fa fts_namelen
Packit Service f629e6
fields.
Packit Service f629e6
.El
Packit Service f629e6
.Sh FTS_SET
Packit Service f629e6
The function
Packit Service f629e6
.Fn fts_set
Packit Service f629e6
allows the user application to determine further processing for the
Packit Service f629e6
file
Packit Service f629e6
.Fa f
Packit Service f629e6
of the stream
Packit Service f629e6
.Fa ftsp .
Packit Service f629e6
The
Packit Service f629e6
.Fn fts_set
Packit Service f629e6
function
Packit Service f629e6
returns 0 on success, and \-1 if an error occurs.
Packit Service f629e6
.Em Option
Packit Service f629e6
must be set to one of the following values:
Packit Service f629e6
.Bl -tag -width "FTS_COMFOLLOW "
Packit Service f629e6
.It Dv FTS_AGAIN
Packit Service f629e6
Re-visit the file; any file type may be re-visited.
Packit Service f629e6
The next call to
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
will return the referenced file.
Packit Service f629e6
The
Packit Service f629e6
.Fa fts_stat
Packit Service f629e6
and
Packit Service f629e6
.Fa fts_info
Packit Service f629e6
fields of the structure will be reinitialized at that time,
Packit Service f629e6
but no other fields will have been changed.
Packit Service f629e6
This option is meaningful only for the most recently returned
Packit Service f629e6
file from
Packit Service f629e6
.Fn fts_read .
Packit Service f629e6
Normal use is for post-order directory visits, where it causes the
Packit Service f629e6
directory to be re-visited (in both pre and post-order) as well as all
Packit Service f629e6
of its descendants.
Packit Service f629e6
.It Dv FTS_FOLLOW
Packit Service f629e6
The referenced file must be a symbolic link.
Packit Service f629e6
If the referenced file is the one most recently returned by
Packit Service f629e6
.Fn fts_read ,
Packit Service f629e6
the next call to
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
returns the file with the
Packit Service f629e6
.Fa fts_info
Packit Service f629e6
and
Packit Service f629e6
.Fa fts_statp
Packit Service f629e6
fields reinitialized to reflect the target of the symbolic link instead
Packit Service f629e6
of the symbolic link itself.
Packit Service f629e6
If the file is one of those most recently returned by
Packit Service f629e6
.Fn fts_children ,
Packit Service f629e6
the
Packit Service f629e6
.Fa fts_info
Packit Service f629e6
and
Packit Service f629e6
.Fa fts_statp
Packit Service f629e6
fields of the structure, when returned by
Packit Service f629e6
.Fn fts_read ,
Packit Service f629e6
will reflect the target of the symbolic link instead of the symbolic link
Packit Service f629e6
itself.
Packit Service f629e6
In either case, if the target of the symbolic link does not exist the
Packit Service f629e6
fields of the returned structure will be unchanged and the
Packit Service f629e6
.Fa fts_info
Packit Service f629e6
field will be set to
Packit Service f629e6
.Dv FTS_SLNONE .
Packit Service f629e6
.Pp
Packit Service f629e6
If the target of the link is a directory, the pre-order return, followed
Packit Service f629e6
by the return of all of its descendants, followed by a post-order return,
Packit Service f629e6
is done.
Packit Service f629e6
.It Dv FTS_SKIP
Packit Service f629e6
No descendants of this file are visited.
Packit Service f629e6
The file may be one of those most recently returned by either
Packit Service f629e6
.Fn fts_children
Packit Service f629e6
or
Packit Service f629e6
.Fn fts_read .
Packit Service f629e6
.El
Packit Service f629e6
.Sh FTS_CLOSE
Packit Service f629e6
The
Packit Service f629e6
.Fn fts_close
Packit Service f629e6
function closes a file hierarchy stream
Packit Service f629e6
.Fa ftsp
Packit Service f629e6
and restores the current directory to the directory from which
Packit Service f629e6
.Fn fts_open
Packit Service f629e6
was called to open
Packit Service f629e6
.Fa ftsp .
Packit Service f629e6
The
Packit Service f629e6
.Fn fts_close
Packit Service f629e6
function
Packit Service f629e6
returns 0 on success, and \-1 if an error occurs.
Packit Service f629e6
.Sh ERRORS
Packit Service f629e6
The function
Packit Service f629e6
.Fn fts_open
Packit Service f629e6
may fail and set
Packit Service f629e6
.Va errno
Packit Service f629e6
for any of the errors specified for the library functions
Packit Service f629e6
.Xr open 2
Packit Service f629e6
and
Packit Service f629e6
.Xr malloc 3 .
Packit Service f629e6
.Pp
Packit Service f629e6
The function
Packit Service f629e6
.Fn fts_close
Packit Service f629e6
may fail and set
Packit Service f629e6
.Va errno
Packit Service f629e6
for any of the errors specified for the library functions
Packit Service f629e6
.Xr chdir 2
Packit Service f629e6
and
Packit Service f629e6
.Xr close 2 .
Packit Service f629e6
.Pp
Packit Service f629e6
The functions
Packit Service f629e6
.Fn fts_read
Packit Service f629e6
and
Packit Service f629e6
.Fn fts_children
Packit Service f629e6
may fail and set
Packit Service f629e6
.Va errno
Packit Service f629e6
for any of the errors specified for the library functions
Packit Service f629e6
.Xr chdir 2 ,
Packit Service f629e6
.Xr malloc 3 ,
Packit Service f629e6
.Xr opendir 3 ,
Packit Service f629e6
.Xr readdir 3
Packit Service f629e6
and
Packit Service f629e6
.Xr stat 2 .
Packit Service f629e6
.Pp
Packit Service f629e6
In addition,
Packit Service f629e6
.Fn fts_children ,
Packit Service f629e6
.Fn fts_open
Packit Service f629e6
and
Packit Service f629e6
.Fn fts_set
Packit Service f629e6
may fail and set
Packit Service f629e6
.Va errno
Packit Service f629e6
as follows:
Packit Service f629e6
.Bl -tag -width Er
Packit Service f629e6
.It Bq Er EINVAL
Packit Service f629e6
The options were invalid.
Packit Service f629e6
.El
Packit Service f629e6
.Sh SEE ALSO
Packit Service f629e6
.Xr find 1 ,
Packit Service f629e6
.Xr chdir 2 ,
Packit Service f629e6
.Xr stat 2 ,
Packit Service f629e6
.Xr qsort 3 ,
Packit Service f629e6
.Xr symlink 7
Packit Service f629e6
.Sh STANDARDS
Packit Service f629e6
The
Packit Service f629e6
.Nm
Packit Service f629e6
utility was expected to be included in the
Packit Service f629e6
.St -p1003.1-88
Packit Service f629e6
revision.
Packit Service f629e6
But twenty years later, it still was not included in the
Packit Service f629e6
.St -p1003.1-2008
Packit Service f629e6
revision.