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