diff --git a/filter/f-util.c b/filter/f-util.c index ba6e7772..e1824c5f 100644 --- a/filter/f-util.c +++ b/filter/f-util.c @@ -19,6 +19,7 @@ f_new_inst(void) ret = cfg_alloc(sizeof(struct f_inst)); ret->code = ret->aux = 0; ret->arg1 = ret->arg2 = ret->next = NULL; + ret->lineno = conf_lino; return ret; } diff --git a/filter/filter.c b/filter/filter.c index 344368e6..a805363a 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -43,6 +43,8 @@ #define P(a,b) ((a<<8) | b) +struct f_inst *startup_func = NULL, *test1_func, *test2_func; + #define CMP_ERROR 999 static int @@ -187,7 +189,7 @@ static int f_flags; static rta *f_rta_copy; #define runtime(x) do { \ - log( L_ERR x ); \ + log( L_ERR "filters, line %d: %s", what->lineno, x); \ res.type = T_RETURN; \ res.val.i = F_ERROR; \ return res; \ @@ -230,22 +232,6 @@ interpret(struct f_inst *what) default: runtime( "Usage of unknown type" ); } break; - case '-': - TWOARGS_C; - switch (res.type = v1.type) { - case T_VOID: runtime( "Can not operate with values of type void" ); - case T_INT: res.val.i = v1.val.i - v2.val.i; break; - default: runtime( "Usage of unknown type" ); - } - break; - case '*': - TWOARGS_C; - switch (res.type = v1.type) { - case T_VOID: runtime( "Can not operate with values of type void" ); - case T_INT: res.val.i = v1.val.i * v2.val.i; break; - default: runtime( "Usage of unknown type" ); - } - break; case '/': TWOARGS_C; switch (res.type = v1.type) { @@ -598,8 +584,6 @@ i_same(struct f_inst *f1, struct f_inst *f2) switch(f1->code) { case ',': /* fall through */ case '+': - case '-': - case '*': case '/': case P('!','='): case P('=','='): @@ -681,22 +665,24 @@ f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struc return res.val.i; } -int -f_eval_int(struct f_inst *expr) +void +filters_postconfig(void) { struct f_val res; - f_flags = 0; - f_tmp_attrs = NULL; - f_rte = NULL; - f_rte_old = NULL; - f_rta_copy = NULL; - f_pool = cfg_mem; - res = interpret(expr); - if (res.type != T_INT) - cf_error("Integer expression expected"); - return res.val.i; -} +#if 1 + if (!i_same(test1_func, test2_func)) + bug("i_same does not work"); +#endif + if (startup_func) { + debug( "Launching startup function...\n" ); + f_pool = lp_new(&root_pool, 1024); + res = interpret(startup_func); + if (res.type == F_ERROR) + die( "Startup function resulted in error." ); + debug( "done\n" ); + } +} /** * filter_same - compare two filters diff --git a/filter/filter.h b/filter/filter.h index 3a62cd7e..f17f0765 100644 --- a/filter/filter.h +++ b/filter/filter.h @@ -25,12 +25,13 @@ struct f_inst { /* Instruction */ int i; void *p; } a2; + int lineno; }; #define arg1 a1.p #define arg2 a2.p -struct f_prefix { +struct prefix { ip_addr ip; int len; #define LEN_MASK 0xff @@ -45,7 +46,7 @@ struct f_val { union { int i; /* ip_addr ip; Folded into prefix */ - struct f_prefix px; + struct prefix px; char *s; struct f_tree *t; struct adata *ad; @@ -58,6 +59,7 @@ struct filter { struct f_inst *root; }; +void filters_postconfig(void); struct f_inst *f_new_inst(void); struct f_inst *f_new_dynamic_attr(int type, int f_type, int code); /* Type as core knows it, type as filters know it, and code of dynamic attribute */ struct f_tree *f_new_tree(void); @@ -70,7 +72,6 @@ struct ea_list; struct rte; int f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struct linpool *tmp_pool, int flags); -int f_eval_int(struct f_inst *expr); char *filter_name(struct filter *filter); int filter_same(struct filter *new, struct filter *old);