summaryrefslogtreecommitdiffstats
path: root/conf
diff options
context:
space:
mode:
Diffstat (limited to 'conf')
-rw-r--r--conf/Makefile2
-rw-r--r--conf/cf-lex.l47
-rw-r--r--conf/conf.c96
-rw-r--r--conf/conf.h28
4 files changed, 130 insertions, 43 deletions
diff --git a/conf/Makefile b/conf/Makefile
index 270d556..fdcd4c3 100644
--- a/conf/Makefile
+++ b/conf/Makefile
@@ -1,4 +1,4 @@
-source=cf-parse.tab.c cf-lex.c
+source=cf-parse.tab.c cf-lex.c conf.c
root-rel=../
include ../Rules
diff --git a/conf/cf-lex.l b/conf/cf-lex.l
index 81e3b6a..791d4ad 100644
--- a/conf/cf-lex.l
+++ b/conf/cf-lex.l
@@ -1,7 +1,7 @@
/*
* BIRD -- Configuration Lexer
*
- * (c) 1998 Martin Mares <mj@ucw.cz>
+ * (c) 1998--1999 Martin Mares <mj@ucw.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
@@ -15,7 +15,6 @@
#include <stdarg.h>
#include "nest/bird.h"
-#include "lib/string.h"
#include "conf/conf.h"
#include "conf/cf-parse.tab.h"
@@ -34,9 +33,10 @@ static struct keyword {
static struct keyword *kw_hash[KW_HASH_SIZE];
static struct symbol **sym_hash;
static int allow_new_symbols;
-static int cf_lino;
static int default_counter;
+int conf_lino;
+
static int cf_hash(byte *c);
static struct symbol *cf_find_sym(byte *c, unsigned int h0);
@@ -121,11 +121,11 @@ WHITE [ \t]
{WHITE}+
\\\n {
- cf_lino++;
+ conf_lino++;
}
\n {
- cf_lino++;
+ conf_lino++;
return ';';
}
@@ -136,14 +136,14 @@ WHITE [ \t]
. cf_error("Unknown character");
<COMMENT>\n {
- cf_lino++;
+ conf_lino++;
BEGIN(INITIAL);
}
<COMMENT>.
<CCOMM>\*\/ BEGIN(INITIAL);
-<CCOMM>\n cf_lino++;
+<CCOMM>\n conf_lino++;
<CCOMM>\/\* cf_error("Comment nesting not supported");
<CCOMM><<EOF>> cf_error("Unterminated comment");
<CCOMM>.
@@ -206,7 +206,7 @@ cf_lex_init(int flag)
{
if (allow_new_symbols = flag)
sym_hash = cfg_allocz(SYM_HASH_SIZE * sizeof(struct keyword *));
- cf_lino = 1;
+ conf_lino = 1;
default_counter = 1;
}
@@ -222,34 +222,3 @@ cf_lex_init_tables(void)
kw_hash[h] = k;
}
}
-
-void
-cf_error(char *msg, ...)
-{
- /* FIXME */
-
- char buf[1024];
- va_list args;
-
- va_start(args, msg);
- bvsprintf(buf, msg, args);
- die(PATH_CONFIG ", line %d: %s", cf_lino, buf);
-}
-
-void
-cf_allocate(void)
-{
- if (cfg_pool)
- rfree(cfg_pool);
- cfg_pool = rp_new(&root_pool, "Config");
- cfg_mem = lp_new(cfg_pool, 1024);
-}
-
-char *
-cfg_strdup(char *c)
-{
- int l = strlen(c) + 1;
- char *z = cfg_allocu(l);
- memcpy(z, c, l);
- return z;
-}
diff --git a/conf/conf.c b/conf/conf.c
new file mode 100644
index 0000000..06cd3d1
--- /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;
+}
diff --git a/conf/conf.h b/conf/conf.h
index 19ed34e..54f5d5e 100644
--- a/conf/conf.h
+++ b/conf/conf.h
@@ -1,7 +1,7 @@
/*
* BIRD Internet Routing Daemon -- Configuration File Handling
*
- * (c) 1998 Martin Mares <mj@ucw.cz>
+ * (c) 1998--1999 Martin Mares <mj@ucw.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
@@ -11,6 +11,28 @@
#include "lib/resource.h"
+/* Configuration structure */
+
+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) */
+ u32 router_id; /* Our Router ID */
+ u16 this_as; /* Our Autonomous System Number */
+ char *err_msg; /* Parser error message */
+ int err_lino; /* Line containing error */
+ char *file_name; /* Name of configuration file */
+};
+
+extern struct config *config, *new_config;
+/* Please don't use these variables in protocols. Use proto_config->global instead. */
+
+struct config *config_alloc(byte *name);
+int config_parse(struct config *);
+void config_free(struct config *);
+void config_commit(struct config *);
+void cf_error(char *msg, ...) NORET;
+
/* Pools */
extern pool *cfg_pool;
@@ -41,11 +63,11 @@ struct symbol {
#define SYM_FUNCTION 5
#define SYM_FILTER 6
+extern int conf_lino;
+
void cf_lex_init_tables(void);
int cf_lex(void);
void cf_lex_init(int flag);
-void cf_error(char *msg, ...) NORET;
-void cf_allocate(void);
struct symbol *cf_default_name(char *prefix);
/* Parser */