1/*********************************************************************** 2* * 3* This software is part of the ast package * 4* Copyright (c) 1985-2011 AT&T Intellectual Property * 5* and is licensed under the * 6* Eclipse Public License, Version 1.0 * 7* by AT&T Intellectual Property * 8* * 9* A copy of the License is available at * 10* http://www.eclipse.org/org/documents/epl-v10.html * 11* (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12* * 13* Information and Software Systems Research * 14* AT&T Research * 15* Florham Park NJ * 16* * 17* Glenn Fowler <gsf@research.att.com> * 18* David Korn <dgk@research.att.com> * 19* Phong Vo <kpv@research.att.com> * 20* * 21***********************************************************************/ 22#pragma prototyped 23/* 24 * Glenn Fowler 25 * David Korn 26 * Phong Vo 27 * AT&T Research 28 * 29 * fts interface definitions 30 */ 31 32#ifndef _FTS_H 33#define _FTS_H 34 35#include <ast_std.h> 36#include <ast_fs.h> 37#include <ast_mode.h> 38 39/* 40 * fts_open flags 41 */ 42 43#define FTS_LOGICAL 0 /* logical traversal, follow symlinks */ 44#define FTS_META (1<<0) /* follow top dir symlinks even if phys */ 45#define FTS_NOCHDIR (1<<1) /* don't chdir */ 46#define FTS_NOPOSTORDER (1<<2) /* no postorder visits */ 47#define FTS_NOPREORDER (1<<3) /* no preorder visits */ 48#define FTS_NOSEEDOTDIR (1<<11) /* never retain leading . dir */ 49#define FTS_NOSTAT (1<<4) /* don't stat children */ 50#define FTS_ONEPATH (1<<5) /* pathnames arg is one const char* */ 51#define FTS_PHYSICAL (1<<6) /* physical traversal, don't follow */ 52#define FTS_SEEDOT (1<<7) /* return . and .. */ 53#define FTS_SEEDOTDIR (1<<10) /* always retain leading . dir */ 54#define FTS_TOP (1<<8) /* don't traverse subdirectories */ 55#define FTS_XDEV (1<<9) /* don't cross mount points */ 56 57#define FTS_USER (1<<12) /* first user flag bit */ 58 59#define FTS_COMFOLLOW FTS_META 60 61/* 62 * fts_info flags 63 */ 64 65#define FTS_DEFAULT 0 /* ok, someone must have wanted this */ 66 67#define FTS_NS (1<<0) /* stat failed */ 68#define FTS_F (1<<1) /* file - not directory or symbolic link*/ 69#define FTS_SL (1<<2) /* symbolic link */ 70#define FTS_D (1<<3) /* directory - pre-order visit */ 71 72#define FTS_C (1<<4) /* causes cycle */ 73#define FTS_ERR (1<<5) /* some other error */ 74#define FTS_DD (1<<6) /* . or .. */ 75#define FTS_NR (1<<7) /* cannot read */ 76#define FTS_NX (1<<8) /* cannot search */ 77#define FTS_OK (1<<9) /* no info but otherwise ok */ 78#define FTS_P (1<<10) /* post-order visit */ 79 80#define FTS_DC (FTS_D|FTS_C) /* dir - would cause cycle */ 81#define FTS_DNR (FTS_D|FTS_NR) /* dir - no read permission */ 82#define FTS_DNX (FTS_D|FTS_NX) /* dir - no search permission */ 83#define FTS_DOT (FTS_D|FTS_DD) /* . or .. */ 84#define FTS_DP (FTS_D|FTS_P) /* dir - post-order visit */ 85#define FTS_NSOK (FTS_NS|FTS_OK) /* no stat (because you asked) */ 86#define FTS_SLNONE (FTS_SL|FTS_NS) /* symlink - to nowhere */ 87 88/* 89 * fts_set flags 90 */ 91 92#define FTS_AGAIN FTS_TOP /* process entry again */ 93#define FTS_FOLLOW FTS_META /* follow FTS_SL symlink */ 94#define FTS_SKIP FTS_NOSTAT /* skip FTS_D directory */ 95#define FTS_STAT FTS_PHYSICAL /* stat() done by user */ 96 97typedef struct Fts FTS; 98typedef struct Ftsent FTSENT; 99 100struct Ftsent 101{ 102 char* fts_accpath; /* path relative to . */ 103 char* fts_name; /* file name */ 104 char* fts_path; /* path relative to top dir */ 105 FTSENT* fts_cycle; /* offender if cycle */ 106 FTSENT* fts_link; /* next child */ 107 FTSENT* fts_parent; /* parent directory */ 108 struct stat* fts_statp; /* stat info */ 109#ifdef _FTSENT_LOCAL_PRIVATE_ 110 _FTSENT_LOCAL_PRIVATE_ 111#else 112 void* fts_pointer; /* local pointer value */ 113#endif 114 long fts_number; /* local numeric value */ 115 int fts_errno; /* errno for this entry */ 116 unsigned short fts_info; /* info flags */ 117 118 unsigned short _fts_namelen; /* old fts_namelen */ 119 unsigned short _fts_pathlen; /* old fts_pathlen */ 120 short _fts_level; /* old fts_level */ 121 122 short _fts_status; /* <ftwalk.h> compatibility */ 123 struct stat _fts_statb; /* <ftwalk.h> compatibility */ 124 125 FTS* fts; /* fts_open() handle */ 126 size_t fts_namelen; /* strlen(fts_name) */ 127 size_t fts_pathlen; /* strlen(fts_path) */ 128 ssize_t fts_level; /* file tree depth, 0 at top */ 129 130#ifdef _FTSENT_PRIVATE_ 131 _FTSENT_PRIVATE_ 132#endif 133 134}; 135 136struct Fts 137{ 138 int fts_errno; /* last errno */ 139 void* fts_handle; /* user defined handle */ 140 141#ifdef _FTS_PRIVATE_ 142 _FTS_PRIVATE_ 143#endif 144 145}; 146 147#if _BLD_ast && defined(__EXPORT__) 148#define extern __EXPORT__ 149#endif 150 151extern FTSENT* fts_children(FTS*, int); 152extern int fts_close(FTS*); 153extern int fts_flags(void); 154extern int fts_local(FTSENT*); 155extern int fts_notify(int(*)(FTS*, FTSENT*, void*), void*); 156extern FTS* fts_open(char* const*, int, int(*)(FTSENT* const*, FTSENT* const*)); 157extern FTSENT* fts_read(FTS*); 158extern int fts_set(FTS*, FTSENT*, int); 159 160#undef extern 161 162#endif 163