]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - SQUASHFS/squashfs-tools-4.4/squashfs-tools/action.h
1.1.07 release
[Ventoy.git] / SQUASHFS / squashfs-tools-4.4 / squashfs-tools / action.h
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