diff options
Diffstat (limited to 'src/cli_val.h')
-rw-r--r-- | src/cli_val.h | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/src/cli_val.h b/src/cli_val.h new file mode 100644 index 0000000..8a98a88 --- /dev/null +++ b/src/cli_val.h @@ -0,0 +1,206 @@ +#ifndef CLI_DEF_H +#define CLI_DEF_H + +#define BITWISE 0 /* no partial commit */ + +#define boolean int +#define TRUE 1 +#define FALSE 0 + +/* allocation unit for vals in valstruct */ +#define MULTI_ALLOC 5 /* we have room if cnt%MULTI_ALLOC != 0 */ + +typedef enum { + do_del_mode, + del_mode, + create_mode, + update_mode +}vtw_cmode; +typedef enum { + ERROR_TYPE, + INT_TYPE, + IPV4_TYPE, + IPV4NET_TYPE, + IPV6_TYPE, + IPV6NET_TYPE, + MACADDR_TYPE, + DOMAIN_TYPE, /*end of addr types */ + TEXT_TYPE, + BOOL_TYPE +}vtw_type_e; + +typedef enum { + EQ_COND = 1, + NE_COND, + LT_COND, + LE_COND, + GT_COND, + GE_COND, + IN_COND, + TOP_COND +}vtw_cond_e; +/* IN_COND is like EQ for singular compare, but OR for multivalue right operand */ + +typedef enum { + LIST_OP, /* right is next, left is list elem */ + HELP_OP, /* right is help string, left is elem */ + EXEC_OP, /* left command string, right help string */ + PATTERN_OP, /* left to var, right to pattern */ + OR_OP, + AND_OP, + NOT_OP, + COND_OP, /* aux field specifies cond type (GT, GE, etc.)*/ + VAL_OP, /* for strings used in other nodes */ + VAR_OP, /* string points to var */ + B_QUOTE_OP, /* string points to operand to be executed */ + ASSIGN_OP /* left to var, right to exp */ +}vtw_oper_e; + +typedef struct { + vtw_type_e val_type; + char *val; + int cnt; /* >0 means multivalue */ + char **vals; /* We might union with val */ + boolean free_me; +}valstruct; + +typedef struct vtw_node{ + vtw_oper_e vtw_node_oper; + struct vtw_node *vtw_node_left; + struct vtw_node *vtw_node_right; + char *vtw_node_string; + int vtw_node_aux; + vtw_type_e vtw_node_type; + valstruct vtw_node_val; /* we'll union it later */ +}vtw_node; + +typedef struct { + vtw_node *vtw_list_head; + vtw_node *vtw_list_tail; +}vtw_list; + +typedef struct { + int t_lev; + int m_lev; +}vtw_mark; + +typedef enum { + delete_act, + create_act, + activate_act, + update_act, + syntax_act, + commit_act, + begin_act, + end_act, + top_act +}vtw_act_type; + +typedef struct { + vtw_type_e def_type; + char *def_type_help; + char *def_default; + boolean tag; + boolean multi; + vtw_list actions[top_act]; +}vtw_def; + +typedef struct { + const char *f_segp; + int f_seglen; + int f_segoff; +} first_seg; +/* the first segment might be ADIR, or CDIR, or MDIR + we reserve space large enough for any one. + If the shorter one is used, it right aligned. + path points to the start of the current first + segment +*/ +typedef struct { + char *path_buf; /* path buffer */ + char *path; /* path */ + int path_len; /* path length used */ + int path_alloc; /* allocated - 1*/ + int *path_ends; /* path ends for dif levels*/ + int path_lev; /* how many used */ + int path_ends_alloc; /* how many allocated */ + int print_offset; /* for additional optional output information */ +} vtw_path; /* vyatta tree walk */ + +typedef struct { + int num; + int partnum; + void **ptrs; + unsigned int *parts; +}vtw_sorted; + +extern int char2val(vtw_def *def, char *value, valstruct *valp); +extern int get_value(char **valpp, vtw_path *pathp); +extern int get_value_to_at_string(vtw_path *pathp); +extern vtw_node * make_node(vtw_oper_e oper, vtw_node *left, + vtw_node *right); +extern vtw_node *make_str_node(char *str); +extern vtw_node *make_var_node(char *str); +extern vtw_node *make_str_node0(char *str, vtw_oper_e op); +extern void append(vtw_list *l, vtw_node *n, int aux); +extern int parse_def(vtw_def *defp, char *path, boolean type_only); + +extern int yy_cli_val_lex(void); +extern void cli_val_start(char *s); +extern void cli_val_done(void); +extern void init_path(vtw_path *path, const char *root); +extern void pop_path(vtw_path *path); +extern void push_path(vtw_path *path, char *segm); +extern void free_def(vtw_def *defp); +extern void free_sorted(vtw_sorted *sortp); +extern void *my_malloc(size_t size, const char *name); +extern void *my_realloc(void *ptr, size_t size, const char *name); + +extern vtw_path m_path, t_path; + +/************************************************* + GLOBAL FUNCTIONS +***************************************************/ +extern void add_val(valstruct *first, valstruct *second); +extern int cli_val_read(char *buf, int max_size); +extern vtw_node *make_val_node(valstruct *val); +extern char *my_strdup(const char *s, const char *name); +extern valstruct str2val(char *cp); +extern void dump_tree(vtw_node *node, int lev); +extern void dump_def(vtw_def *defp); +extern boolean val_cmp(valstruct *left, valstruct *right, vtw_cond_e cond); +extern void out_of_memory(void); +extern boolean validate_value(vtw_def *def, + char *value); +extern void internal_error(int line, char *file); +extern void done(void); +extern void del_value(vtw_def *defp, char *cp); +extern void bye(char *msg, ...); +extern void print_msg(char *msg, ...); +extern void switch_path(first_seg *seg); +extern void vtw_sort(valstruct *valp, vtw_sorted *sortp); +extern void free_val(valstruct *val); +extern void my_free(void *ptr); +extern void touch(void); +extern void dump_log(int argc, char **argv); +extern char *type_to_name(vtw_type_e type); +extern boolean execute_list(vtw_node *cur, vtw_def *def); +extern void touch_dir(const char *dp); + +void mark_paths(vtw_mark *markp); +void restore_paths(vtw_mark *markp); + +extern boolean get_config_lock(const char* adirp, const char* lock_name); + +#define VTWERR_BADPATH -2 +#define VTWERR_OK 0 +#define TAG_NAME "node.tag" +#define DEF_NAME "node.def" +#define VAL_NAME "node.val" +#define MOD_NAME ".modified" +#define OPQ_NAME ".wh.__dir_opaque" +#define LOCK_NAME ".commit.lck" + +#define INTERNAL internal_error(__LINE__, __FILE__) + +#endif |