mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-09 20:58:44 +00:00
e0f2e42f4f
o Introduced struct filter which serves as an external reference to filter. Using struct symbol for this is unwise since it doesn't allow extra information attached to the filter and it also forces all filters to be named. o Implemented config rule 'filter' which matches either named filter or an embedded unnamed filter (`{ <filter> }'). o Fixed totally bogus comment at the top of filter.h. o Added a missing prototype for f_run() to filter.h.
111 lines
1.9 KiB
Plaintext
111 lines
1.9 KiB
Plaintext
/*
|
|
* BIRD -- Configuration Parser Top
|
|
*
|
|
* (c) 1998--1999 Martin Mares <mj@ucw.cz>
|
|
*
|
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
|
*/
|
|
|
|
CF_HDR
|
|
|
|
#include "nest/bird.h"
|
|
#include "conf/conf.h"
|
|
#include "lib/resource.h"
|
|
#include "lib/socket.h"
|
|
#include "lib/timer.h"
|
|
#include "nest/protocol.h"
|
|
#include "nest/iface.h"
|
|
#include "nest/route.h"
|
|
#include "filter/filter.h"
|
|
|
|
CF_DECLS
|
|
|
|
%union {
|
|
int i;
|
|
ip_addr a;
|
|
struct symbol *s;
|
|
char *t;
|
|
struct f_inst *x;
|
|
struct filter *f;
|
|
}
|
|
|
|
%token END
|
|
%token <i> NUM
|
|
%token <a> IPA
|
|
%token <s> SYM
|
|
%token <t> TEXT
|
|
|
|
%type <i> expr bool pxlen
|
|
|
|
%left '='
|
|
%left '+' '-'
|
|
%left '*' '/' '%'
|
|
|
|
CF_KEYWORDS(DEFINE, ON, OFF, YES, NO)
|
|
|
|
CF_GRAMMAR
|
|
|
|
/* Basic config file structure */
|
|
|
|
config: conf_entries END {
|
|
return 0;
|
|
}
|
|
;
|
|
|
|
conf_entries:
|
|
/* EMPTY */
|
|
| conf_entries conf ';'
|
|
;
|
|
|
|
CF_ADDTO(conf, /* EMPTY */)
|
|
|
|
/* Constant expressions */
|
|
|
|
expr:
|
|
NUM
|
|
| expr '+' expr { $$ = $1 + $3; }
|
|
| expr '-' expr { $$ = $1 - $3; }
|
|
| expr '*' expr { $$ = $1 * $3; }
|
|
| expr '/' expr { if ($3) $$ = $1 / $3; else cf_error("Division by zero"); }
|
|
| expr '%' expr { if ($3) $$ = $1 % $3; else cf_error("Division by zero"); }
|
|
| '(' expr ')' { $$ = $2; }
|
|
| SYM { if ($1->class != SYM_NUMBER) cf_error("Number expected"); else $$ = $1->aux; }
|
|
;
|
|
|
|
CF_ADDTO(conf, definition)
|
|
definition:
|
|
DEFINE SYM '=' expr {
|
|
if ($2->class != SYM_VOID) cf_error("Symbol already defined");
|
|
$2->class = SYM_NUMBER;
|
|
$2->aux = $4;
|
|
}
|
|
;
|
|
|
|
/* Switches */
|
|
|
|
bool:
|
|
expr {$$ = !!$1; }
|
|
| ON { $$ = 1; }
|
|
| YES { $$ = 1; }
|
|
| OFF { $$ = 0; }
|
|
| NO { $$ = 0; }
|
|
| /* Silence means agreement */ { $$ = 1; }
|
|
;
|
|
|
|
/* Prefixes and netmasks */
|
|
|
|
pxlen:
|
|
'/' NUM {
|
|
if ($2 < 0 || $2 > 32) cf_error("Invalid prefix length %d", $2);
|
|
$$ = $2;
|
|
}
|
|
| ':' IPA {
|
|
$$ = ipa_mklen($2);
|
|
if ($$ < 0) cf_error("Invalid netmask %I", $2);
|
|
}
|
|
;
|
|
|
|
CF_CODE
|
|
|
|
CF_END
|