1 #ifndef ACTION_H 2 #define ACTION_H 3 /* 4 * Create a squashfs filesystem. This is a highly compressed read only 5 * filesystem. 6 * 7 * Copyright (c) 2011, 2012, 2013, 2014 8 * Phillip Lougher <phillip@squashfs.org.uk> 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2, 13 * or (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 23 * 24 * action.h 25 */ 26 27 /* 28 * Lexical analyser definitions 29 */ 30 #define TOK_OPEN_BRACKET 0 31 #define TOK_CLOSE_BRACKET 1 32 #define TOK_AND 2 33 #define TOK_OR 3 34 #define TOK_NOT 4 35 #define TOK_COMMA 5 36 #define TOK_AT 6 37 #define TOK_WHITE_SPACE 7 38 #define TOK_STRING 8 39 #define TOK_EOF 9 40 41 #define TOK_TO_STR(OP, S) ({ \ 42 char *s; \ 43 switch(OP) { \ 44 case TOK_EOF: \ 45 s = "EOF"; \ 46 break; \ 47 case TOK_STRING: \ 48 s = S; \ 49 break; \ 50 default: \ 51 s = token_table[OP].string; \ 52 break; \ 53 } \ 54 s; \ 55 }) 56 57 58 struct token_entry { 59 char *string; 60 int token; 61 int size; 62 }; 63 64 /* 65 * Expression parser definitions 66 */ 67 #define OP_TYPE 0 68 #define ATOM_TYPE 1 69 #define UNARY_TYPE 2 70 71 #define SYNTAX_ERROR(S, ARGS...) { \ 72 char *src = strdup(source); \ 73 src[cur_ptr - source] = '\0'; \ 74 fprintf(stderr, "Failed to parse action \"%s\"\n", source); \ 75 fprintf(stderr, "Syntax error: "S, ##ARGS); \ 76 fprintf(stderr, "Got here \"%s\"\n", src); \ 77 free(src); \ 78 } 79 80 #define TEST_SYNTAX_ERROR(TEST, ARG, S, ARGS...) { \ 81 char *src = strdup(source); \ 82 src[cur_ptr - source] = '\0'; \ 83 fprintf(stderr, "Failed to parse action \"%s\"\n", source); \ 84 fprintf(stderr, "Syntax error in \"%s()\", arg %d: "S, TEST->name, \ 85 ARG, ##ARGS); \ 86 fprintf(stderr, "Got here \"%s\"\n", src); \ 87 free(src); \ 88 } 89 90 struct expr; 91 92 struct expr_op { 93 struct expr *lhs; 94 struct expr *rhs; 95 int op; 96 }; 97 98 99 struct atom { 100 struct test_entry *test; 101 int args; 102 char **argv; 103 void *data; 104 }; 105 106 107 struct unary_op { 108 struct expr *expr; 109 int op; 110 }; 111 112 113 struct expr { 114 int type; 115 union { 116 struct atom atom; 117 struct expr_op expr_op; 118 struct unary_op unary_op; 119 }; 120 }; 121 122 /* 123 * Test operation definitions 124 */ 125 #define NUM_EQ 1 126 #define NUM_LESS 2 127 #define NUM_GREATER 3 128 129 struct test_number_arg { 130 long long size; 131 int range; 132 }; 133 134 struct test_range_args { 135 long long start; 136 long long end; 137 }; 138 139 struct action; 140 struct action_data; 141 142 struct test_entry { 143 char *name; 144 int args; 145 int (*fn)(struct atom *, struct action_data *); 146 int (*parse_args)(struct test_entry *, struct atom *); 147 int exclude_ok; 148 int handle_logging; 149 }; 150 151 152 /* 153 * Type test specific definitions 154 */ 155 struct type_entry { 156 int value; 157 char type; 158 }; 159 160 161 /* 162 * Action definitions 163 */ 164 #define FRAGMENT_ACTION 0 165 #define EXCLUDE_ACTION 1 166 #define FRAGMENTS_ACTION 2 167 #define NO_FRAGMENTS_ACTION 3 168 #define ALWAYS_FRAGS_ACTION 4 169 #define NO_ALWAYS_FRAGS_ACTION 5 170 #define COMPRESSED_ACTION 6 171 #define UNCOMPRESSED_ACTION 7 172 #define UID_ACTION 8 173 #define GID_ACTION 9 174 #define GUID_ACTION 10 175 #define MODE_ACTION 11 176 #define EMPTY_ACTION 12 177 #define MOVE_ACTION 13 178 #define PRUNE_ACTION 14 179 #define NOOP_ACTION 15 180 181 /* 182 * Define what file types each action operates over 183 */ 184 #define ACTION_DIR 1 185 #define ACTION_REG 2 186 #define ACTION_ALL_LNK 3 187 #define ACTION_ALL 4 188 #define ACTION_LNK 5 189 190 191 /* 192 * Action logging requested, specified by the various 193 * -action, -true-action, -false-action and -verbose-action 194 * options 195 */ 196 #define ACTION_LOG_NONE 0 197 #define ACTION_LOG_TRUE 1 198 #define ACTION_LOG_FALSE 2 199 #define ACTION_LOG_VERBOSE ACTION_LOG_TRUE | ACTION_LOG_FALSE 200 201 struct action_entry { 202 char *name; 203 int type; 204 int args; 205 int file_types; 206 int (*parse_args)(struct action_entry *, int, char **, void **); 207 void (*run_action)(struct action *, struct dir_ent *); 208 }; 209 210 211 struct action_data { 212 int depth; 213 char *name; 214 char *pathname; 215 char *subpath; 216 struct stat *buf; 217 struct dir_ent *dir_ent; 218 struct dir_info *root; 219 }; 220 221 222 struct action { 223 int type; 224 struct action_entry *action; 225 int args; 226 char **argv; 227 struct expr *expr; 228 void *data; 229 int verbose; 230 }; 231 232 233 /* 234 * Uid/gid action specific definitions 235 */ 236 struct uid_info { 237 uid_t uid; 238 }; 239 240 struct gid_info { 241 gid_t gid; 242 }; 243 244 struct guid_info { 245 uid_t uid; 246 gid_t gid; 247 }; 248 249 250 /* 251 * Mode action specific definitions 252 */ 253 #define ACTION_MODE_SET 0 254 #define ACTION_MODE_ADD 1 255 #define ACTION_MODE_REM 2 256 #define ACTION_MODE_OCT 3 257 258 struct mode_data { 259 struct mode_data *next; 260 int operation; 261 int mode; 262 unsigned int mask; 263 char X; 264 }; 265 266 267 /* 268 * Empty action specific definitions 269 */ 270 #define EMPTY_ALL 0 271 #define EMPTY_SOURCE 1 272 #define EMPTY_EXCLUDED 2 273 274 struct empty_data { 275 int val; 276 }; 277 278 279 /* 280 * Move action specific definitions 281 */ 282 #define ACTION_MOVE_RENAME 1 283 #define ACTION_MOVE_MOVE 2 284 285 struct move_ent { 286 int ops; 287 struct dir_ent *dir_ent; 288 char *name; 289 struct dir_info *dest; 290 struct move_ent *next; 291 }; 292 293 294 /* 295 * Perm test function specific definitions 296 */ 297 #define PERM_ALL 1 298 #define PERM_ANY 2 299 #define PERM_EXACT 3 300 301 struct perm_data { 302 int op; 303 int mode; 304 }; 305 306 307 /* 308 * External function definitions 309 */ 310 extern int parse_action(char *, int verbose); 311 extern void dump_actions(); 312 extern void *eval_frag_actions(struct dir_info *, struct dir_ent *); 313 extern void *get_frag_action(void *); 314 extern int eval_exclude_actions(char *, char *, char *, struct stat *, int, 315 struct dir_ent *); 316 extern void eval_actions(struct dir_info *, struct dir_ent *); 317 extern int eval_empty_actions(struct dir_info *, struct dir_ent *dir_ent); 318 extern void eval_move_actions(struct dir_info *, struct dir_ent *); 319 extern int eval_prune_actions(struct dir_info *, struct dir_ent *); 320 extern void do_move_actions(); 321 extern int read_bytes(int, void *, int); 322 extern int actions(); 323 extern int move_actions(); 324 extern int empty_actions(); 325 extern int read_action_file(char *, int); 326 extern int exclude_actions(); 327 extern int prune_actions(); 328 #endif 329