summaryrefslogtreecommitdiffstats
path: root/conf
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>2000-01-16 18:40:26 +0100
committerMartin Mares <mj@ucw.cz>2000-01-16 18:40:26 +0100
commitbf8558bc9cab35f31bccd6a55e51f121370765c4 (patch)
treebf5396b1e4f7a9c2eff282a5f675e0cb59d1704e /conf
parentebc793a5f552bb676014f771d81c074b7dd4345d (diff)
downloadbird-bf8558bc9cab35f31bccd6a55e51f121370765c4.tar
bird-bf8558bc9cab35f31bccd6a55e51f121370765c4.zip
Converted shutdown to a kind of reconfiguration, it's no more handled
as a exception in protocol state machines. Introduced a `shutdown' CLI command. Killed few reconfiguration bugs.
Diffstat (limited to 'conf')
-rw-r--r--conf/conf.c34
-rw-r--r--conf/conf.h6
2 files changed, 37 insertions, 3 deletions
diff --git a/conf/conf.c b/conf/conf.c
index 1c5401b..c3f5234 100644
--- a/conf/conf.c
+++ b/conf/conf.c
@@ -25,6 +25,7 @@ static jmp_buf conf_jmpbuf;
struct config *config, *new_config, *old_config, *future_config;
static event *config_event;
+int shutting_down;
struct config *
config_alloc(byte *name)
@@ -100,11 +101,13 @@ config_del_obstacle(struct config *c)
}
static int
-global_commit(struct config *c, struct config *old)
+global_commit(struct config *new, struct config *old)
{
if (!old)
return 0;
- if (c->router_id != old->router_id)
+ if (!new->router_id)
+ new->router_id = old->router_id;
+ if (new->router_id != old->router_id)
return 1;
return 0;
}
@@ -116,7 +119,7 @@ config_do_commit(struct config *c)
DBG("do_commit\n");
old_config = config;
- config = c;
+ config = new_config = c;
if (old_config)
old_config->obstacle_count++;
DBG("sysdep_commit\n");
@@ -144,6 +147,8 @@ config_done(void *unused)
DBG("config_done\n");
for(;;)
{
+ if (config->shutdown)
+ sysdep_shutdown_done();
log(L_INFO "Reconfigured");
if (old_config)
{
@@ -171,6 +176,12 @@ config_commit(struct config *c)
}
if (old_config) /* Reconfiguration already in progress */
{
+ if (shutting_down)
+ {
+ log(L_INFO "New configuration discarded due to shutdown");
+ config_free(c);
+ return CONF_SHUTDOWN;
+ }
if (future_config)
{
log(L_INFO "Queueing new configuration, ignoring the one already queued");
@@ -195,6 +206,23 @@ config_commit(struct config *c)
}
void
+order_shutdown(void)
+{
+ struct config *c;
+
+ if (shutting_down)
+ return;
+ log(L_INFO "Shutting down");
+ c = lp_alloc(config->mem, sizeof(struct config));
+ memcpy(c, config, sizeof(struct config));
+ init_list(&c->protos);
+ init_list(&c->tables);
+ c->shutdown = 1;
+ config_commit(c);
+ shutting_down = 1;
+}
+
+void
cf_error(char *msg, ...)
{
char buf[1024];
diff --git a/conf/conf.h b/conf/conf.h
index 7d13ae9..9fe133e 100644
--- a/conf/conf.h
+++ b/conf/conf.h
@@ -27,6 +27,7 @@ struct config {
struct symbol **sym_hash; /* Lexer: symbol hash table */
struct symbol **sym_fallback; /* Lexer: fallback symbol hash table */
int obstacle_count; /* Number of items blocking freeing of this config */
+ int shutdown; /* This is a pseudo-config for daemon shutdown */
};
/* Please don't use these variables in protocols. Use proto_config->global instead. */
@@ -35,6 +36,8 @@ extern struct config *new_config; /* Configuration being parsed */
extern struct config *old_config; /* Old configuration when reconfiguration is in progress */
extern struct config *future_config; /* New config held here if recon requested during recon */
+extern int shutting_down;
+
struct config *config_alloc(byte *name);
int config_parse(struct config *);
int cli_parse(struct config *);
@@ -43,10 +46,12 @@ int config_commit(struct config *);
void cf_error(char *msg, ...) NORET;
void config_add_obstacle(struct config *);
void config_del_obstacle(struct config *);
+void order_shutdown(void);
#define CONF_DONE 0
#define CONF_PROGRESS 1
#define CONF_QUEUED 2
+#define CONF_SHUTDOWN 3
/* Pools */
@@ -98,5 +103,6 @@ int cf_parse(void);
void sysdep_preconfig(struct config *);
int sysdep_commit(struct config *, struct config *);
+void sysdep_shutdown_done(void);
#endif