From d272fe22dddcb5c293d6aac18d36e3e3e66406a5 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Mon, 17 Jan 2000 11:52:50 +0000 Subject: [PATCH] Separated `official protocol names' used in status dumps from name templates used for automatic generation of instance names. protocol->name is the official name protocol->template is the name template (usually "name%d"), should be all lowercase. Updated all protocols to define the templates, checked that their configuration grammar includes proto_name which generates the name and interns it in the symbol table. --- TODO | 3 +-- conf/cf-lex.l | 20 +++++++++++++------- conf/conf.h | 2 +- nest/config.Y | 2 +- nest/protocol.h | 1 + nest/rt-dev.c | 1 + proto/ospf/ospf.c | 1 + proto/pipe/pipe.c | 1 + proto/rip/rip.c | 1 + proto/static/static.c | 10 +++++++++- proto/static/static.h | 2 +- sysdep/unix/krt.Y | 4 ++-- sysdep/unix/krt.c | 2 ++ 13 files changed, 35 insertions(+), 15 deletions(-) diff --git a/TODO b/TODO index 7f36a571..7428dfbf 100644 --- a/TODO +++ b/TODO @@ -26,9 +26,7 @@ Core - config: executable config files - config: when parsing prefix, check zero bits - config: useless rules when protocols disabled -- config: remove protocol startup priority hacks? - config: better datetime format -- config: avoid upper case in default protocol names - krt: rescan interfaces when route addition fails? - krt: does PERSIST mode have any sense if kernel syncer is shut down as last? @@ -79,6 +77,7 @@ Cleanup - does everybody test return value of sk_open? - add references to RFC's we did follow - protocols: implement CLI hooks +- protocols: implement reconfigure hook - protocols: use locking Various ideas diff --git a/conf/cf-lex.l b/conf/cf-lex.l index cd6699fd..df0f3c1d 100644 --- a/conf/cf-lex.l +++ b/conf/cf-lex.l @@ -1,7 +1,7 @@ /* * BIRD -- Configuration Lexer * - * (c) 1998--1999 Martin Mares + * (c) 1998--2000 Martin Mares * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -19,6 +19,7 @@ #include "filter/filter.h" #include "conf/conf.h" #include "conf/cf-parse.tab.h" +#include "lib/string.h" static struct keyword { byte *name; @@ -231,19 +232,24 @@ cf_find_symbol(byte *c) } struct symbol * -cf_default_name(char *prefix, int *counter) +cf_default_name(char *template, int *counter) { char buf[32]; struct symbol *s; + char *perc = strchr(template, '%'); - do + for(;;) { - sprintf(buf, "%s%d", prefix, ++(*counter)); + bsprintf(buf, template, ++(*counter)); s = cf_find_sym(buf, cf_hash(buf)); - if (!s) cf_error("Unable to generate default name"); + if (!s) + break; + if (s->class == SYM_VOID) + return s; + if (!perc) + break; } - while (s->class != SYM_VOID); - return s; + cf_error("Unable to generate default name"); } void diff --git a/conf/conf.h b/conf/conf.h index 9fe133ee..178cdb6e 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -90,7 +90,7 @@ extern int conf_lino; int cf_lex(void); void cf_lex_init(int is_cli); struct symbol *cf_find_symbol(byte *c); -struct symbol *cf_default_name(char *prefix, int *counter); +struct symbol *cf_default_name(char *template, int *counter); void cf_define_symbol(struct symbol *symbol, int type, void *def); void cf_push_scope(struct symbol *); void cf_pop_scope(void); diff --git a/nest/config.Y b/nest/config.Y index 0cb11080..4bccc166 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -76,7 +76,7 @@ proto_start: PROTOCOL proto_name: /* EMPTY */ { - struct symbol *s = cf_default_name(this_proto->protocol->name, &this_proto->protocol->name_counter); + struct symbol *s = cf_default_name(this_proto->protocol->template, &this_proto->protocol->name_counter); s->class = SYM_PROTO; s->def = this_proto; this_proto->name = s->name; diff --git a/nest/protocol.h b/nest/protocol.h index d5b5810a..815a7a7b 100644 --- a/nest/protocol.h +++ b/nest/protocol.h @@ -33,6 +33,7 @@ struct symbol; struct protocol { node n; char *name; + char *template; /* Template for automatic generation of names */ unsigned debug; /* Default debugging flags */ int priority; /* Protocol priority (usually 0) */ int name_counter; /* Counter for automatic name generation */ diff --git a/nest/rt-dev.c b/nest/rt-dev.c index 23d9b565..89b22502 100644 --- a/nest/rt-dev.c +++ b/nest/rt-dev.c @@ -88,6 +88,7 @@ dev_reconfigure(struct proto *p, struct proto_config *new) struct protocol proto_device = { name: "Direct", + template: "direct%d", priority: 90, init: dev_init, reconfigure: dev_reconfigure diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c index db773369..e8704a7f 100644 --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@ -90,6 +90,7 @@ ospf_postconfig(struct proto_config *c) struct protocol proto_ospf = { name: "OSPF", + template: "ospf%d", init: ospf_init, dump: ospf_dump, start: ospf_start, diff --git a/proto/pipe/pipe.c b/proto/pipe/pipe.c index f439a154..f1a190f9 100644 --- a/proto/pipe/pipe.c +++ b/proto/pipe/pipe.c @@ -163,6 +163,7 @@ pipe_reconfigure(struct proto *p, struct proto_config *new) struct protocol proto_pipe = { name: "Pipe", + template: "pipe%d", postconfig: pipe_postconfig, init: pipe_init, start: pipe_start, diff --git a/proto/rip/rip.c b/proto/rip/rip.c index d863fa38..b8338a5e 100644 --- a/proto/rip/rip.c +++ b/proto/rip/rip.c @@ -789,6 +789,7 @@ rip_postconfig(struct proto_config *c) struct protocol proto_rip = { name: "RIP", + template: "rip%d", preconfig: rip_preconfig, postconfig: rip_postconfig, get_route_info: rip_get_route_info, diff --git a/proto/static/static.c b/proto/static/static.c index 4217ad03..c006daf0 100644 --- a/proto/static/static.c +++ b/proto/static/static.c @@ -1,7 +1,7 @@ /* * BIRD -- Static Route Generator * - * (c) 1998--1999 Martin Mares + * (c) 1998--2000 Martin Mares * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -175,11 +175,19 @@ static_init(struct proto_config *c) return p; } +static int +static_reconfigure(struct proto *p, struct proto_config *new) +{ + return 0; +} + struct protocol proto_static = { name: "Static", + template: "static%d", init: static_init, dump: static_dump, start: static_start, + reconfigure: static_reconfigure, }; static void diff --git a/proto/static/static.h b/proto/static/static.h index 66451183..5d2bd218 100644 --- a/proto/static/static.h +++ b/proto/static/static.h @@ -1,7 +1,7 @@ /* * BIRD -- Static Route Generator * - * (c) 1998 Martin Mares + * (c) 1998--2000 Martin Mares * * Can be freely distributed and used under the terms of the GNU GPL. */ diff --git a/sysdep/unix/krt.Y b/sysdep/unix/krt.Y index 50f31bba..01264d55 100644 --- a/sysdep/unix/krt.Y +++ b/sysdep/unix/krt.Y @@ -1,7 +1,7 @@ /* * BIRD -- UNIX Kernel Syncer Configuration * - * (c) 1998--1999 Martin Mares + * (c) 1998--2000 Martin Mares * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -70,7 +70,7 @@ kif_proto_start: proto_start DEVICE { } ; -CF_ADDTO(kif_proto, kif_proto_start '{') +CF_ADDTO(kif_proto, kif_proto_start proto_name '{') CF_ADDTO(kif_proto, kif_proto proto_item ';') CF_ADDTO(kif_proto, kif_proto kif_item ';') diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c index bbca8cfa..b321729b 100644 --- a/sysdep/unix/krt.c +++ b/sysdep/unix/krt.c @@ -160,6 +160,7 @@ kif_reconfigure(struct proto *p, struct proto_config *new) struct protocol proto_unix_iface = { name: "Device", + template: "device%d", priority: 100, preconfig: kif_preconfig, init: kif_init, @@ -786,6 +787,7 @@ krt_init(struct proto_config *c) struct protocol proto_unix_kernel = { name: "Kernel", + template: "kernel%d", priority: 80, preconfig: krt_preconfig, postconfig: krt_postconfig,