summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conf/cf-lex.l15
-rw-r--r--conf/conf.h5
-rw-r--r--filter/config.Y11
3 files changed, 23 insertions, 8 deletions
diff --git a/conf/cf-lex.l b/conf/cf-lex.l
index ca7bfae1..94c2b2ab 100644
--- a/conf/cf-lex.l
+++ b/conf/cf-lex.l
@@ -183,6 +183,12 @@ cf_find_sym(byte *c, unsigned int h0)
}
struct symbol *
+cf_find_symbol(byte *c)
+{
+ return cf_find_sym(c, cf_hash(c));
+}
+
+struct symbol *
cf_default_name(char *prefix, int *counter)
{
char buf[32];
@@ -199,6 +205,15 @@ cf_default_name(char *prefix, int *counter)
}
void
+cf_define_symbol(struct symbol *sym, int type, void *def)
+{
+ if (sym->class)
+ cf_error("Symbol already defined");
+ sym->class = type;
+ sym->def = def;
+}
+
+void
cf_lex_init(int flag)
{
if (allow_new_symbols = flag)
diff --git a/conf/conf.h b/conf/conf.h
index 83d92c3f..86043245 100644
--- a/conf/conf.h
+++ b/conf/conf.h
@@ -17,6 +17,8 @@ struct config {
pool *pool; /* Pool the configuration is stored in */
linpool *mem; /* Linear pool containing configuration data */
list protos; /* Configured protocol instances (struct proto_config) */
+ list tables; /* Configured routing tables (struct rtable_config) */
+ struct rtable_config *master_rtc; /* Configuration of master routing table */
u32 router_id; /* Our Router ID */
char *err_msg; /* Parser error message */
int err_lino; /* Line containing error */
@@ -60,6 +62,7 @@ struct symbol {
#define SYM_STAT 3 /* statement */
#define SYM_FUNCTION 5
#define SYM_FILTER 6
+#define SYM_TABLE 7
#define SYM_VARIABLE 0x100 /* Reserved 0x100..0x1ff */
@@ -68,7 +71,9 @@ extern int conf_lino;
void cf_lex_init_tables(void);
int cf_lex(void);
void cf_lex_init(int flag);
+struct symbol *cf_find_symbol(byte *c);
struct symbol *cf_default_name(char *prefix, int *counter);
+void cf_define_symbol(struct symbol *symbol, int type, void *def);
/* Parser */
diff --git a/filter/config.Y b/filter/config.Y
index 4fd18157..c7f20148 100644
--- a/filter/config.Y
+++ b/filter/config.Y
@@ -40,9 +40,7 @@ CF_GRAMMAR
CF_ADDTO(conf, filter_def)
filter_def:
FILTER SYM filter_body {
- if ($2->class != SYM_VOID) cf_error("Symbol already defined" );
- $2->class = SYM_FILTER;
- $2->def = $3;
+ cf_define_symbol($2, SYM_FILTER, $3);
$3->name = $2->name;
printf( "We have new filter defined (%s)\n", $2->name )
}
@@ -67,8 +65,7 @@ type:
decls: /* EMPTY */
| type SYM ';' decls {
- if ($2->class != SYM_VOID) cf_error("Symbol already defined, can not use as variable\n" );
- $2->class = SYM_VARIABLE | $1;
+ cf_define_symbol($2, SYM_VARIABLE | $1, NULL);
printf( "New variable %s type %x\n", $2->name, $1 );
}
;
@@ -104,9 +101,7 @@ CF_ADDTO(conf, function_def)
function_def:
FUNCTION SYM function_params function_body {
extern struct f_inst *startup_func;
- if ($2->class != SYM_VOID) cf_error("Symbol already defined" );
- $2->class = SYM_FUNCTION;
- $2->def = $4;
+ cf_define_symbol($2, SYM_FUNCTION, $4);
if (!strcasecmp($2->name, "startup"))
startup_func = $4;
printf("Hmm, we've got one function here - %s\n", $2->name);