| #ifndef ACTION_H |
| #define ACTION_H |
| /* |
| * Create a squashfs filesystem. This is a highly compressed read only |
| * filesystem. |
| * |
| * Copyright (c) 2011, 2012, 2013, 2014 |
| * Phillip Lougher <phillip@squashfs.org.uk> |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation; either version 2, |
| * or (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| * |
| * action.h |
| */ |
| |
| /* |
| * Lexical analyser definitions |
| */ |
| #define TOK_OPEN_BRACKET 0 |
| #define TOK_CLOSE_BRACKET 1 |
| #define TOK_AND 2 |
| #define TOK_OR 3 |
| #define TOK_NOT 4 |
| #define TOK_COMMA 5 |
| #define TOK_AT 6 |
| #define TOK_WHITE_SPACE 7 |
| #define TOK_STRING 8 |
| #define TOK_EOF 9 |
| |
| #define TOK_TO_STR(OP, S) ({ \ |
| char *s; \ |
| switch(OP) { \ |
| case TOK_EOF: \ |
| s = "EOF"; \ |
| break; \ |
| case TOK_STRING: \ |
| s = S; \ |
| break; \ |
| default: \ |
| s = token_table[OP].string; \ |
| break; \ |
| } \ |
| s; \ |
| }) |
| |
| |
| struct token_entry { |
| char *string; |
| int token; |
| int size; |
| }; |
| |
| /* |
| * Expression parser definitions |
| */ |
| #define OP_TYPE 0 |
| #define ATOM_TYPE 1 |
| #define UNARY_TYPE 2 |
| |
| #define SYNTAX_ERROR(S, ARGS...) { \ |
| char *src = strdup(source); \ |
| src[cur_ptr - source] = '\0'; \ |
| fprintf(stderr, "Failed to parse action \"%s\"\n", source); \ |
| fprintf(stderr, "Syntax error: "S, ##ARGS); \ |
| fprintf(stderr, "Got here \"%s\"\n", src); \ |
| free(src); \ |
| } |
| |
| #define TEST_SYNTAX_ERROR(TEST, ARG, S, ARGS...) { \ |
| char *src = strdup(source); \ |
| src[cur_ptr - source] = '\0'; \ |
| fprintf(stderr, "Failed to parse action \"%s\"\n", source); \ |
| fprintf(stderr, "Syntax error in \"%s()\", arg %d: "S, TEST->name, \ |
| ARG, ##ARGS); \ |
| fprintf(stderr, "Got here \"%s\"\n", src); \ |
| free(src); \ |
| } |
| |
| struct expr; |
| |
| struct expr_op { |
| struct expr *lhs; |
| struct expr *rhs; |
| int op; |
| }; |
| |
| |
| struct atom { |
| struct test_entry *test; |
| int args; |
| char **argv; |
| void *data; |
| }; |
| |
| |
| struct unary_op { |
| struct expr *expr; |
| int op; |
| }; |
| |
| |
| struct expr { |
| int type; |
| union { |
| struct atom atom; |
| struct expr_op expr_op; |
| struct unary_op unary_op; |
| }; |
| }; |
| |
| /* |
| * Test operation definitions |
| */ |
| #define NUM_EQ 1 |
| #define NUM_LESS 2 |
| #define NUM_GREATER 3 |
| |
| struct test_number_arg { |
| long long size; |
| int range; |
| }; |
| |
| struct test_range_args { |
| long long start; |
| long long end; |
| }; |
| |
| struct action; |
| struct action_data; |
| |
| struct test_entry { |
| char *name; |
| int args; |
| int (*fn)(struct atom *, struct action_data *); |
| int (*parse_args)(struct test_entry *, struct atom *); |
| int exclude_ok; |
| int handle_logging; |
| }; |
| |
| |
| /* |
| * Type test specific definitions |
| */ |
| struct type_entry { |
| int value; |
| char type; |
| }; |
| |
| |
| /* |
| * Action definitions |
| */ |
| #define FRAGMENT_ACTION 0 |
| #define EXCLUDE_ACTION 1 |
| #define FRAGMENTS_ACTION 2 |
| #define NO_FRAGMENTS_ACTION 3 |
| #define ALWAYS_FRAGS_ACTION 4 |
| #define NO_ALWAYS_FRAGS_ACTION 5 |
| #define COMPRESSED_ACTION 6 |
| #define UNCOMPRESSED_ACTION 7 |
| #define UID_ACTION 8 |
| #define GID_ACTION 9 |
| #define GUID_ACTION 10 |
| #define MODE_ACTION 11 |
| #define EMPTY_ACTION 12 |
| #define MOVE_ACTION 13 |
| #define PRUNE_ACTION 14 |
| #define NOOP_ACTION 15 |
| |
| /* |
| * Define what file types each action operates over |
| */ |
| #define ACTION_DIR 1 |
| #define ACTION_REG 2 |
| #define ACTION_ALL_LNK 3 |
| #define ACTION_ALL 4 |
| #define ACTION_LNK 5 |
| |
| |
| /* |
| * Action logging requested, specified by the various |
| * -action, -true-action, -false-action and -verbose-action |
| * options |
| */ |
| #define ACTION_LOG_NONE 0 |
| #define ACTION_LOG_TRUE 1 |
| #define ACTION_LOG_FALSE 2 |
| #define ACTION_LOG_VERBOSE ACTION_LOG_TRUE | ACTION_LOG_FALSE |
| |
| struct action_entry { |
| char *name; |
| int type; |
| int args; |
| int file_types; |
| int (*parse_args)(struct action_entry *, int, char **, void **); |
| void (*run_action)(struct action *, struct dir_ent *); |
| }; |
| |
| |
| struct action_data { |
| int depth; |
| char *name; |
| char *pathname; |
| char *subpath; |
| struct stat *buf; |
| struct dir_ent *dir_ent; |
| struct dir_info *root; |
| }; |
| |
| |
| struct action { |
| int type; |
| struct action_entry *action; |
| int args; |
| char **argv; |
| struct expr *expr; |
| void *data; |
| int verbose; |
| }; |
| |
| |
| /* |
| * Uid/gid action specific definitions |
| */ |
| struct uid_info { |
| uid_t uid; |
| }; |
| |
| struct gid_info { |
| gid_t gid; |
| }; |
| |
| struct guid_info { |
| uid_t uid; |
| gid_t gid; |
| }; |
| |
| |
| /* |
| * Mode action specific definitions |
| */ |
| #define ACTION_MODE_SET 0 |
| #define ACTION_MODE_ADD 1 |
| #define ACTION_MODE_REM 2 |
| #define ACTION_MODE_OCT 3 |
| |
| struct mode_data { |
| struct mode_data *next; |
| int operation; |
| int mode; |
| unsigned int mask; |
| char X; |
| }; |
| |
| |
| /* |
| * Empty action specific definitions |
| */ |
| #define EMPTY_ALL 0 |
| #define EMPTY_SOURCE 1 |
| #define EMPTY_EXCLUDED 2 |
| |
| struct empty_data { |
| int val; |
| }; |
| |
| |
| /* |
| * Move action specific definitions |
| */ |
| #define ACTION_MOVE_RENAME 1 |
| #define ACTION_MOVE_MOVE 2 |
| |
| struct move_ent { |
| int ops; |
| struct dir_ent *dir_ent; |
| char *name; |
| struct dir_info *dest; |
| struct move_ent *next; |
| }; |
| |
| |
| /* |
| * Perm test function specific definitions |
| */ |
| #define PERM_ALL 1 |
| #define PERM_ANY 2 |
| #define PERM_EXACT 3 |
| |
| struct perm_data { |
| int op; |
| int mode; |
| }; |
| |
| |
| /* |
| * External function definitions |
| */ |
| extern int parse_action(char *, int verbose); |
| extern void dump_actions(); |
| extern void *eval_frag_actions(struct dir_info *, struct dir_ent *); |
| extern void *get_frag_action(void *); |
| extern int eval_exclude_actions(char *, char *, char *, struct stat *, int, |
| struct dir_ent *); |
| extern void eval_actions(struct dir_info *, struct dir_ent *); |
| extern int eval_empty_actions(struct dir_info *, struct dir_ent *dir_ent); |
| extern void eval_move_actions(struct dir_info *, struct dir_ent *); |
| extern int eval_prune_actions(struct dir_info *, struct dir_ent *); |
| extern void do_move_actions(); |
| extern int read_bytes(int, void *, int); |
| extern int actions(); |
| extern int move_actions(); |
| extern int empty_actions(); |
| extern int read_action_file(char *, int); |
| extern int exclude_actions(); |
| extern int prune_actions(); |
| #endif |