summaryrefslogtreecommitdiff
path: root/conf/conf.c
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1999-02-05 21:37:34 +0000
committerMartin Mares <mj@ucw.cz>1999-02-05 21:37:34 +0000
commit31b3e1bbf5bc823ec5cf6d88931132f00e6c52b9 (patch)
treeb3c3da837ca2079a222dfc99ab479bd040ba21ad /conf/conf.c
parentc4c63eecc37a744c53c23da89b1ba09b9640cb6e (diff)
Implemented new configuration/reconfiguration interface and defined protocol
state machines. Full explanation will follow soon.
Diffstat (limited to 'conf/conf.c')
-rw-r--r--conf/conf.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/conf/conf.c b/conf/conf.c
new file mode 100644
index 00000000..06cd3d19
--- /dev/null
+++ b/conf/conf.c
@@ -0,0 +1,96 @@
+/*
+ * BIRD Internet Routing Daemon -- Configuration File Handling
+ *
+ * (c) 1999 Martin Mares <mj@ucw.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#include <setjmp.h>
+#include <stdarg.h>
+
+#include "nest/bird.h"
+#include "nest/protocol.h"
+#include "nest/iface.h"
+#include "lib/resource.h"
+#include "lib/string.h"
+#include "conf/conf.h"
+#include "filter/filter.h"
+
+static jmp_buf conf_jmpbuf;
+
+struct config *config, *new_config;
+
+struct config *
+config_alloc(byte *name)
+{
+ pool *p = rp_new(&root_pool, "Config");
+ linpool *l = lp_new(p, 1024);
+ struct config *c = lp_allocz(l, sizeof(struct config));
+
+ c->pool = p;
+ cfg_mem = c->mem = l;
+ init_list(&c->protos);
+ c->file_name = cfg_strdup(name);
+ return c;
+}
+
+int
+config_parse(struct config *c)
+{
+ struct proto_config *p;
+
+ debug("Parsing configuration file <%s>\n", c->file_name);
+ new_config = c;
+ cfg_pool = c->pool;
+ cfg_mem = c->mem;
+ if (setjmp(conf_jmpbuf))
+ return 0;
+ cf_lex_init(1);
+ cf_lex_init_tables();
+ protos_preconfig(c);
+ cf_parse();
+#if 0 /* FIXME: We don't have interface list yet :( */
+ if (!c->router_id && !(c->router_id = auto_router_id()))
+ cf_error("Cannot determine router ID (no suitable network interface found), please configure it manually");
+#endif
+ filters_postconfig(); /* FIXME: Do we really need this? */
+ protos_postconfig(c);
+ return 1;
+}
+
+void
+config_free(struct config *c)
+{
+ rfree(c->pool);
+}
+
+void
+config_commit(struct config *c)
+{
+ config = c;
+ protos_commit(c);
+}
+
+void
+cf_error(char *msg, ...)
+{
+ char buf[1024];
+ va_list args;
+
+ va_start(args, msg);
+ if (bvsnprintf(buf, sizeof(buf), msg, args) < 0)
+ strcpy(buf, "<bug: error message too long>");
+ new_config->err_msg = cfg_strdup(buf);
+ new_config->err_lino = conf_lino;
+ longjmp(conf_jmpbuf, 1);
+}
+
+char *
+cfg_strdup(char *c)
+{
+ int l = strlen(c) + 1;
+ char *z = cfg_allocu(l);
+ memcpy(z, c, l);
+ return z;
+}