1 /*********************************************************************** 2 * * 3 * This software is part of the ast package * 4 * Copyright (c) 1989-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 <glenn.s.fowler@gmail.com> * 18 * * 19 ***********************************************************************/ 20 #pragma prototyped 21 /* 22 * Glenn Fowler 23 * AT&T Research 24 * 25 * tw common definitions 26 */ 27 28 #include <ast.h> 29 #include <expr.h> 30 #include <ls.h> 31 #include <find.h> 32 #include <fs3d.h> 33 #include <ftwalk.h> 34 #include <magic.h> 35 #include <error.h> 36 #include <debug.h> 37 38 #include "cmdarg.h" 39 #include "ftwlocal.h" 40 41 #define ignorecase fts_number 42 43 #define PATH(f) ((f)->status==FTW_NAME?(f)->name:(f)->path) 44 45 #define ACT_CMDARG 1 46 #define ACT_CODE 2 47 #define ACT_CODETYPE 3 48 #define ACT_EVAL 4 49 #define ACT_INTERMEDIATE 5 50 #define ACT_LIST 6 51 #define ACT_SNAPSHOT 7 52 53 #define CMD_IMPLICIT (CMD_USER<<0) 54 55 #define MEMMAKE(s,o) (((s)<<8)|((o)&((1<<8)-1))) 56 #define MEMINDEX(x) (((x)>>8)&((1<<8)-1)) 57 #define MEMOFFSET(x) ((x)&((1<<8)-1)) 58 59 #define T_type 64 60 #define T_DATE (T_type+1) 61 #define T_GID (T_type+2) 62 #define T_MODE (T_type+3) 63 #define T_PERM (T_type+4) 64 #define T_UID (T_type+5) 65 66 #define F_args 1 67 #define F_atime 2 68 #define F_blocks 3 69 #define F_blksize 4 70 #define F_checksum 5 71 #define F_ctime 6 72 #define F_dev 7 73 #define F_fstype 8 74 #define F_gid 9 75 #define F_gidok 10 76 #define F_info 11 77 #define F_ino 12 78 #define F_level 13 79 #define F_local 14 80 #define F_mode 15 81 #define F_magic 16 82 #define F_md5sum 17 83 #define F_mime 18 84 #define F_mtime 19 85 #define F_name 20 86 #define F_nlink 21 87 #define F_parent 22 88 #define F_perm 23 89 #define F_path 24 90 #define F_rdev 25 91 #define F_size 26 92 #define F_status 27 93 #define F_symlink 28 94 #define F_type 29 95 #define F_uid 30 96 #define F_uidok 31 97 #define F_url 32 98 #define F_view 33 99 #define F_visit 34 100 101 #define C_AGAIN 35 102 #define C_BLK 36 103 #define C_C 37 104 #define C_CHR 38 105 #define C_CTG 39 106 #define C_D 40 107 #define C_DC 41 108 #define C_DIR 42 109 #define C_DNR 43 110 #define C_DNX 44 111 #define C_DOOR 45 112 #define C_DP 46 113 #define C_FIFO 47 114 #define C_FMT 48 115 #define C_FOLLOW 49 116 #define C_LNK 50 117 #define C_NOPOST 51 118 #define C_NR 52 119 #define C_NS 53 120 #define C_NX 54 121 #define C_REG 55 122 #define C_SOCK 56 123 #define C_SKIP 57 124 125 #define X_cmdarg 58 126 #define X_cmdflush 59 127 #define X_sum 60 128 129 #define M_MEMBER 61 130 131 typedef struct /* unique file identifier */ 132 { 133 long di[2]; /* dev,ino */ 134 } Fileid_t; 135 136 typedef struct /* Fileid_t visit */ 137 { 138 Dtlink_t link; /* table link */ 139 Fileid_t id; /* file id */ 140 Extype_t value[1]; /* visit values */ 141 } Visit_t; 142 143 typedef struct Local_s /* local struct */ 144 { 145 struct Local_s* next; /* next in free list */ 146 Extype_t value[1]; /* member values */ 147 } Local_t; 148 149 typedef struct Snapshot_s /* snapshot state */ 150 { 151 Sfio_t* sp; /* previous snapshot stream */ 152 Sfio_t* tmp; /* tmp string stream */ 153 char* prev; /* previous snapshot record */ 154 struct 155 { 156 char* path; /* path format */ 157 char* easy; /* easy format */ 158 char* hard; /* hard format */ 159 int delim; /* format delimiter char */ 160 } format; 161 } Snapshot_t; 162 163 typedef struct /* program state */ 164 { 165 int act; /* leaf node ACT_* */ 166 int actII; /* real action for intermediate */ 167 Exnode_t* action; /* action expression */ 168 int args; /* command arg count */ 169 Cmdarg_t* cmd; /* command arg state */ 170 int cmdflags; /* cmdopen() flags */ 171 int compiled; /* excomp() complete */ 172 int errexit; /* exit tw when cmd exit > this */ 173 int errors; /* error count */ 174 Exdisc_t expr; /* expr discipline */ 175 Find_t* find; /* fast find handle */ 176 int finderror; /* fast find generation error */ 177 int ftwflags; /* tree walk flags */ 178 Dt_t* fstab; /* fs type hash table */ 179 int icase; /* ignore case in sort */ 180 int ignore; /* ignore cmd and dir errors */ 181 int info; /* ftw.info checked by user */ 182 int intermediate; /* generate intermediate dirs */ 183 Local_t* local; /* local struct free list */ 184 int localfs; /* restrict to local fs mounts */ 185 int localmem; /* ftw.local member count */ 186 Magic_t* magic; /* magic tests */ 187 Magicdisc_t magicdisc; /* magic discipline */ 188 char* pattern; /* fast find pattern */ 189 Expr_t* program; /* compiled expressions */ 190 int reverse; /* reverse sort sense */ 191 Exnode_t* select; /* select expression */ 192 int separator; /* xargs list separator */ 193 Snapshot_t snapshot; /* snapshot state */ 194 int (*sort)(Ftw_t*, Ftw_t*); /* sorter */ 195 Exnode_t* sortkey; /* sort key list */ 196 Dt_t* vistab; /* visit hash table */ 197 int visitmem; /* visit member count */ 198 } State_t; 199 200 extern State_t state; 201 202 extern void compile(char*, int); 203 extern long eval(Exnode_t*, Ftw_t*); 204 extern long getnum(Exid_t*, Ftw_t*); 205 extern ssize_t print(Sfio_t*, Ftw_t*, const char*); 206