summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>2000-01-17 11:52:50 +0000
committerMartin Mares <mj@ucw.cz>2000-01-17 11:52:50 +0000
commitd272fe22dddcb5c293d6aac18d36e3e3e66406a5 (patch)
tree20710583efb431b87ce836c068825dc12be7f0d2
parentf7fcb752520759ab3aed274ca608e8e6f96665c8 (diff)
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.
-rw-r--r--TODO3
-rw-r--r--conf/cf-lex.l20
-rw-r--r--conf/conf.h2
-rw-r--r--nest/config.Y2
-rw-r--r--nest/protocol.h1
-rw-r--r--nest/rt-dev.c1
-rw-r--r--proto/ospf/ospf.c1
-rw-r--r--proto/pipe/pipe.c1
-rw-r--r--proto/rip/rip.c1
-rw-r--r--proto/static/static.c10
-rw-r--r--proto/static/static.h2
-rw-r--r--sysdep/unix/krt.Y4
-rw-r--r--sysdep/unix/krt.c2
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 <mj@ucw.cz>
+ * (c) 1998--2000 Martin Mares <mj@ucw.cz>
*
* 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 <mj@ucw.cz>
+ * (c) 1998--2000 Martin Mares <mj@ucw.cz>
*
* 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 <mj@ucw.cz>
+ * (c) 1998--2000 Martin Mares <mj@ucw.cz>
*
* 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 <mj@ucw.cz>
+ * (c) 1998--2000 Martin Mares <mj@ucw.cz>
*
* 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,