Home | History | Annotate | Download | only in squashfs-tools
      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 (at) 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