1998-11-28 03:35:10 +08:00
|
|
|
/*
|
|
|
|
* BIRD Internet Routing Daemon -- Configuration File Handling
|
|
|
|
*
|
2000-01-17 00:44:50 +08:00
|
|
|
* (c) 1998--2000 Martin Mares <mj@ucw.cz>
|
1998-11-28 03:35:10 +08:00
|
|
|
*
|
|
|
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _BIRD_CONF_H_
|
|
|
|
#define _BIRD_CONF_H_
|
|
|
|
|
|
|
|
#include "lib/resource.h"
|
2000-03-13 06:44:54 +08:00
|
|
|
#include "lib/timer.h"
|
1998-11-28 03:35:10 +08:00
|
|
|
|
1999-02-06 05:37:34 +08:00
|
|
|
/* 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) */
|
1999-05-18 04:06:19 +08:00
|
|
|
list tables; /* Configured routing tables (struct rtable_config) */
|
1999-12-06 21:44:45 +08:00
|
|
|
list logfiles; /* Configured log fils (sysdep) */
|
1999-05-18 04:06:19 +08:00
|
|
|
struct rtable_config *master_rtc; /* Configuration of master routing table */
|
1999-02-06 05:37:34 +08:00
|
|
|
u32 router_id; /* Our Router ID */
|
2000-03-08 05:50:03 +08:00
|
|
|
unsigned int proto_default_debug; /* Default protocol debug mask */
|
2000-05-30 06:10:18 +08:00
|
|
|
int cli_debug; /* Tracing of CLI connections and commands */
|
1999-02-06 05:37:34 +08:00
|
|
|
char *err_msg; /* Parser error message */
|
|
|
|
int err_lino; /* Line containing error */
|
|
|
|
char *file_name; /* Name of configuration file */
|
1999-11-30 22:03:36 +08:00
|
|
|
struct symbol **sym_hash; /* Lexer: symbol hash table */
|
|
|
|
struct symbol **sym_fallback; /* Lexer: fallback symbol hash table */
|
2000-01-17 00:44:50 +08:00
|
|
|
int obstacle_count; /* Number of items blocking freeing of this config */
|
2000-01-17 01:40:26 +08:00
|
|
|
int shutdown; /* This is a pseudo-config for daemon shutdown */
|
2000-03-13 06:44:54 +08:00
|
|
|
bird_clock_t load_time; /* When we've got this configuration */
|
1999-02-06 05:37:34 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Please don't use these variables in protocols. Use proto_config->global instead. */
|
2000-01-17 00:44:50 +08:00
|
|
|
extern struct config *config; /* Currently active configuration */
|
|
|
|
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 */
|
1999-02-06 05:37:34 +08:00
|
|
|
|
2000-01-17 01:40:26 +08:00
|
|
|
extern int shutting_down;
|
2000-03-13 06:44:54 +08:00
|
|
|
extern bird_clock_t boot_time;
|
2000-01-17 01:40:26 +08:00
|
|
|
|
1999-02-06 05:37:34 +08:00
|
|
|
struct config *config_alloc(byte *name);
|
|
|
|
int config_parse(struct config *);
|
Parse CLI commands. We use the same parser as for configuration files (because
we want to allow filter and similar complex constructs to be used in commands
and we should avoid code duplication), only with CLI_MARKER token prepended
before the whole input.
Defined macro CF_CLI(cmd, args, help) for defining CLI commands in .Y files.
The first argument specifies the command itself, the remaining two arguments
are copied to the help file (er, will be copied after the help file starts
to exist). This macro automatically creates a skeleton rule for the command,
you only need to append arguments as in:
CF_CLI(STEAL MONEY, <$>, [[Steal <$> US dollars or equivalent in any other currency]]): NUM {
cli_msg(0, "%d$ stolen", $3);
} ;
Also don't forget to reset lexer state between inputs.
1999-11-01 01:47:47 +08:00
|
|
|
int cli_parse(struct config *);
|
1999-02-06 05:37:34 +08:00
|
|
|
void config_free(struct config *);
|
2000-01-17 00:44:50 +08:00
|
|
|
int config_commit(struct config *);
|
1999-02-06 05:37:34 +08:00
|
|
|
void cf_error(char *msg, ...) NORET;
|
2000-01-17 00:44:50 +08:00
|
|
|
void config_add_obstacle(struct config *);
|
|
|
|
void config_del_obstacle(struct config *);
|
2000-01-17 01:40:26 +08:00
|
|
|
void order_shutdown(void);
|
2000-01-17 00:44:50 +08:00
|
|
|
|
|
|
|
#define CONF_DONE 0
|
|
|
|
#define CONF_PROGRESS 1
|
|
|
|
#define CONF_QUEUED 2
|
2000-01-17 01:40:26 +08:00
|
|
|
#define CONF_SHUTDOWN 3
|
1999-02-06 05:37:34 +08:00
|
|
|
|
1998-11-30 05:59:37 +08:00
|
|
|
/* Pools */
|
|
|
|
|
1998-12-06 19:59:18 +08:00
|
|
|
extern linpool *cfg_mem;
|
1998-11-28 03:35:10 +08:00
|
|
|
|
1998-12-06 19:59:18 +08:00
|
|
|
#define cfg_alloc(size) lp_alloc(cfg_mem, size)
|
|
|
|
#define cfg_allocu(size) lp_allocu(cfg_mem, size)
|
|
|
|
#define cfg_allocz(size) lp_allocz(cfg_mem, size)
|
|
|
|
char *cfg_strdup(char *c);
|
1998-11-30 05:59:37 +08:00
|
|
|
|
1998-11-28 03:35:10 +08:00
|
|
|
/* Lexer */
|
|
|
|
|
|
|
|
extern int (*cf_read_hook)(byte *buf, unsigned int max);
|
|
|
|
|
|
|
|
struct symbol {
|
|
|
|
struct symbol *next;
|
1999-11-04 21:51:52 +08:00
|
|
|
struct sym_scope *scope;
|
1998-11-28 03:35:10 +08:00
|
|
|
int class;
|
1998-11-28 05:32:45 +08:00
|
|
|
int aux;
|
1999-07-01 17:11:21 +08:00
|
|
|
void *aux2;
|
1998-11-28 03:35:10 +08:00
|
|
|
void *def;
|
|
|
|
char name[1];
|
|
|
|
};
|
|
|
|
|
2000-06-04 00:56:00 +08:00
|
|
|
/* Remember to update cf_symbol_class_name() */
|
1998-11-28 03:35:10 +08:00
|
|
|
#define SYM_VOID 0
|
1998-11-28 05:07:02 +08:00
|
|
|
#define SYM_PROTO 1
|
1998-11-28 05:32:45 +08:00
|
|
|
#define SYM_NUMBER 2
|
1999-11-15 19:34:51 +08:00
|
|
|
#define SYM_FUNCTION 3
|
|
|
|
#define SYM_FILTER 4
|
|
|
|
#define SYM_TABLE 5
|
2000-05-15 19:48:23 +08:00
|
|
|
#define SYM_IPA 6
|
1998-11-28 03:35:10 +08:00
|
|
|
|
1999-11-15 19:34:51 +08:00
|
|
|
#define SYM_VARIABLE 0x100 /* 0x100-0x1ff are variable types */
|
1999-03-30 04:21:28 +08:00
|
|
|
|
1999-02-06 05:37:34 +08:00
|
|
|
extern int conf_lino;
|
|
|
|
|
1998-11-28 03:35:10 +08:00
|
|
|
int cf_lex(void);
|
Parse CLI commands. We use the same parser as for configuration files (because
we want to allow filter and similar complex constructs to be used in commands
and we should avoid code duplication), only with CLI_MARKER token prepended
before the whole input.
Defined macro CF_CLI(cmd, args, help) for defining CLI commands in .Y files.
The first argument specifies the command itself, the remaining two arguments
are copied to the help file (er, will be copied after the help file starts
to exist). This macro automatically creates a skeleton rule for the command,
you only need to append arguments as in:
CF_CLI(STEAL MONEY, <$>, [[Steal <$> US dollars or equivalent in any other currency]]): NUM {
cli_msg(0, "%d$ stolen", $3);
} ;
Also don't forget to reset lexer state between inputs.
1999-11-01 01:47:47 +08:00
|
|
|
void cf_lex_init(int is_cli);
|
1999-05-18 04:06:19 +08:00
|
|
|
struct symbol *cf_find_symbol(byte *c);
|
2000-01-17 19:52:50 +08:00
|
|
|
struct symbol *cf_default_name(char *template, int *counter);
|
2000-06-05 03:30:13 +08:00
|
|
|
struct symbol *cf_define_symbol(struct symbol *symbol, int type, void *def);
|
1999-11-04 21:53:47 +08:00
|
|
|
void cf_push_scope(struct symbol *);
|
|
|
|
void cf_pop_scope(void);
|
2000-01-19 20:30:19 +08:00
|
|
|
struct symbol *cf_walk_symbols(struct config *cf, struct symbol *sym, int *pos);
|
|
|
|
char *cf_symbol_class_name(struct symbol *sym);
|
1998-11-28 03:35:10 +08:00
|
|
|
|
|
|
|
/* Parser */
|
|
|
|
|
|
|
|
int cf_parse(void);
|
|
|
|
|
1999-12-06 21:44:45 +08:00
|
|
|
/* Sysdep hooks */
|
|
|
|
|
|
|
|
void sysdep_preconfig(struct config *);
|
2000-01-17 00:44:50 +08:00
|
|
|
int sysdep_commit(struct config *, struct config *);
|
2000-01-17 01:40:26 +08:00
|
|
|
void sysdep_shutdown_done(void);
|
1999-12-06 21:44:45 +08:00
|
|
|
|
1998-11-28 03:35:10 +08:00
|
|
|
#endif
|