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