diff options
-rw-r--r-- | filter/config.Y | 8 | ||||
-rw-r--r-- | filter/filter.c | 8 | ||||
-rw-r--r-- | filter/test.conf | 14 |
3 files changed, 21 insertions, 9 deletions
diff --git a/filter/config.Y b/filter/config.Y index a4c1392..d515d17 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -72,7 +72,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN, LEN, DEFINED, ADD, DELETE, CONTAINS, RESET, - APPEND, MATCH, + PREPEND, MATCH, EMPTY, FILTER, WHERE) @@ -388,6 +388,7 @@ term: case SYM_VARIABLE | T_PREFIX: case SYM_VARIABLE | T_IP: case SYM_VARIABLE | T_PATH_MASK: + case SYM_VARIABLE | T_PATH: $$->code = 'C'; $$->a1.p = $1->aux2; break; @@ -417,10 +418,11 @@ term: */ /* Paths */ - | term '.' APPEND '(' term ')' { } + | term '.' PREPEND '(' term ')' { } | term '.' RESET { } - | EMPTY { $$ = f_new_inst(); $$->code = 'E'; $$->aux = T_PATH; } + | '+' EMPTY '+' { $$ = f_new_inst(); $$->code = 'E'; $$->aux = T_PATH; } + | PREPEND '(' term ',' term ')' { $$ = f_new_inst(); $$->code = P('A','p'); $$->a1.p = $3; $$->a2.p = $5; } /* | term '.' LEN { $$->code = P('P','l'); } */ diff --git a/filter/filter.c b/filter/filter.c index 82fb304..d8124b7 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -253,6 +253,8 @@ interpret(struct f_inst *what) case T_IP: case T_PREFIX: case T_PAIR: + case T_PATH: + case T_CLIST: case T_PATH_MASK: if (sym->class != (SYM_VARIABLE | v2.type)) runtime( "Variable of bad type" ); @@ -584,6 +586,7 @@ filters_postconfig(void) struct f_val res; 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." ); @@ -674,10 +677,9 @@ path_format(u8 *p, int len) #define PM_END -1 #define PM_ASTERIX -2 -#define MASK_PLUS do { mask = mask->next; if (mask->val == PM_END) return next == q; \ +#define MASK_PLUS do { mask = mask->next; if (!mask) return next == q; \ asterix = (mask->val == PM_ASTERIX); \ - printf( "Asterix now %d\n", asterix ); \ - if (asterix) { mask = mask->next; if (mask->val == PM_END) { printf( "Quick exit\n" ); return 1; } } \ + if (asterix) { mask = mask->next; if (!mask) { return 1; } } \ } while(0) int diff --git a/filter/test.conf b/filter/test.conf index 94ed556..55cbf33 100644 --- a/filter/test.conf +++ b/filter/test.conf @@ -31,10 +31,18 @@ function fifteen() function paths() bgpmask p; +bgppath p2; { - print "Testing paths"; - p = / 1 2 3 4 /; - print p; + p = / 4 3 2 1 /; + print "Testing path masks: ", p; + p2 = prepend( + empty +, 1 ); + p2 = prepend( p2, 2 ); + p2 = prepend( p2, 3 ); + p2 = prepend( p2, 4 ); + print "Testing paths: ", p2; + print "Should be true: ", p2 ~ p; + p2 = prepend( p2, 5 ); + print "Should be false: ", p2 ~ p; } function startup() |