/* $NetBSD: fts.h,v 1.19 2009/08/16 19:33:38 christos Exp $ */12/*3* Copyright (c) 1989, 19934* The Regents of the University of California. All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14* 3. Neither the name of the University nor the names of its contributors15* may be used to endorse or promote products derived from this software16* without specific prior written permission.17*18* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND19* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE20* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE21* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE22* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL23* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS24* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)25* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT26* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY27* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF28* SUCH DAMAGE.29*30* @(#)fts.h 8.3 (Berkeley) 8/14/9431*/3233#ifndef _FTS_H_34#define _FTS_H_3536#include <stdint.h>37#include <sys/types.h>3839#ifndef __fts_stat_t40#define __fts_stat_t struct stat41#endif42#ifndef __fts_nlink_t43#define __fts_nlink_t nlink_t44#endif45#ifndef __fts_ino_t46#define __fts_ino_t ino_t47#endif48#ifndef __fts_length_t49#define __fts_length_t unsigned int50#endif51#ifndef __fts_number_t52#define __fts_number_t int64_t53#endif54#ifndef __fts_dev_t55#define __fts_dev_t dev_t56#endif57#ifndef __fts_level_t58#define __fts_level_t int59#endif6061typedef struct {62struct _ftsent *fts_cur; /* current node */63struct _ftsent *fts_child; /* linked list of children */64struct _ftsent **fts_array; /* sort array */65dev_t fts_dev; /* starting device # */66char *fts_path; /* path for this descent */67int fts_rfd; /* fd for root */68unsigned int fts_pathlen; /* sizeof(path) */69unsigned int fts_nitems; /* elements in the sort array */70int(*fts_compar) /* compare function */71(const struct _ftsent **, const struct _ftsent **);7273#define FTS_COMFOLLOW 0x001 /* follow command line symlinks */74#define FTS_LOGICAL 0x002 /* logical walk */75#define FTS_NOCHDIR 0x004 /* don't change directories */76#define FTS_NOSTAT 0x008 /* don't get stat info */77#define FTS_PHYSICAL 0x010 /* physical walk */78#define FTS_SEEDOT 0x020 /* return dot and dot-dot */79#define FTS_XDEV 0x040 /* don't cross devices */80#define FTS_WHITEOUT 0x080 /* return whiteout information */81#define FTS_OPTIONMASK 0x0ff /* valid user option mask */8283#define FTS_NAMEONLY 0x100 /* (private) child names only */84#define FTS_STOP 0x200 /* (private) unrecoverable error */85int fts_options; /* fts_open options, global flags */86} FTS;8788typedef struct _ftsent {89struct _ftsent *fts_cycle; /* cycle node */90struct _ftsent *fts_parent; /* parent directory */91struct _ftsent *fts_link; /* next file in directory */92__fts_number_t fts_number; /* local numeric value */93void *fts_pointer; /* local address value */94char *fts_accpath; /* access path */95char *fts_path; /* root path */96int fts_errno; /* errno for this node */97int fts_symfd; /* fd for symlink */98__fts_length_t fts_pathlen; /* strlen(fts_path) */99__fts_length_t fts_namelen; /* strlen(fts_name) */100101__fts_ino_t fts_ino; /* inode */102__fts_dev_t fts_dev; /* device */103__fts_nlink_t fts_nlink; /* link count */104105#define FTS_ROOTPARENTLEVEL -1106#define FTS_ROOTLEVEL 0107__fts_level_t fts_level; /* depth (-1 to N) */108109#define FTS_D 1 /* preorder directory */110#define FTS_DC 2 /* directory that causes cycles */111#define FTS_DEFAULT 3 /* none of the above */112#define FTS_DNR 4 /* unreadable directory */113#define FTS_DOT 5 /* dot or dot-dot */114#define FTS_DP 6 /* postorder directory */115#define FTS_ERR 7 /* error; errno is set */116#define FTS_F 8 /* regular file */117#define FTS_INIT 9 /* initialized only */118#define FTS_NS 10 /* stat(2) failed */119#define FTS_NSOK 11 /* no stat(2) requested */120#define FTS_SL 12 /* symbolic link */121#define FTS_SLNONE 13 /* symbolic link without target */122#define FTS_W 14 /* whiteout object */123unsigned short fts_info; /* user flags for FTSENT structure */124125#define FTS_DONTCHDIR 0x01 /* don't chdir .. to the parent */126#define FTS_SYMFOLLOW 0x02 /* followed a symlink to get here */127#define FTS_ISW 0x04 /* this is a whiteout object */128unsigned short fts_flags; /* private flags for FTSENT structure */129130#define FTS_AGAIN 1 /* read node again */131#define FTS_FOLLOW 2 /* follow symbolic link */132#define FTS_NOINSTR 3 /* no instructions */133#define FTS_SKIP 4 /* discard node */134unsigned short fts_instr; /* fts_set() instructions */135136__fts_stat_t *fts_statp; /* stat(2) information */137char fts_name[1]; /* file name */138} FTSENT;139140#ifdef __cplusplus141extern "C" {142#endif143FTSENT *fts_children(FTS *, int);144int fts_close(FTS *);145FTS *fts_open(char *const *, int, int (*)(const FTSENT **, const FTSENT **));146FTSENT *fts_read(FTS *);147int fts_set(FTS *, FTSENT *, int);148#ifdef __cplusplus149}150#endif151152#endif /* !_FTS_H_ */153154155