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
|
|
|
|
2011-09-12 03:21:47 +08:00
|
|
|
#define BIRD_FNAME_MAX 255 /* Would be better to use some UNIX define */
|
|
|
|
|
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) */
|
2010-01-03 19:17:52 +08:00
|
|
|
int mrtdump_file; /* Configured MRTDump file (sysdep, fd in unix) */
|
2010-04-07 17:00:36 +08:00
|
|
|
char *syslog_name; /* Name used for syslog (NULL -> no syslog) */
|
1999-05-18 04:06:19 +08:00
|
|
|
struct rtable_config *master_rtc; /* Configuration of master routing table */
|
2010-01-03 19:17:52 +08:00
|
|
|
|
1999-02-06 05:37:34 +08:00
|
|
|
u32 router_id; /* Our Router ID */
|
2009-06-23 17:08:30 +08:00
|
|
|
ip_addr listen_bgp_addr; /* Listening BGP socket should use this address */
|
|
|
|
unsigned listen_bgp_port; /* Listening BGP socket should use this port (0 is default) */
|
|
|
|
u32 listen_bgp_flags; /* Listening BGP socket should use these flags */
|
2010-01-03 19:17:52 +08:00
|
|
|
unsigned proto_default_debug; /* Default protocol debug mask */
|
|
|
|
unsigned proto_default_mrtdump; /* Default protocol mrtdump mask */
|
2010-02-03 07:19:24 +08:00
|
|
|
struct timeformat tf_route; /* Time format for 'show route' */
|
|
|
|
struct timeformat tf_proto; /* Time format for 'show protocol' */
|
|
|
|
struct timeformat tf_log; /* Time format for the logfile */
|
|
|
|
struct timeformat tf_base; /* Time format for other purposes */
|
|
|
|
|
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 */
|
2011-09-12 03:21:47 +08:00
|
|
|
char *err_file_name; /* File name containing error */
|
|
|
|
char *file_name; /* Name of main configuration file */
|
|
|
|
int file_fd; /* File descriptor of main 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 *);
|
2009-06-20 05:49:34 +08:00
|
|
|
int config_commit(struct config *, int type);
|
|
|
|
#define RECONFIG_HARD 0
|
|
|
|
#define RECONFIG_SOFT 1
|
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 */
|
|
|
|
|
2011-09-12 03:21:47 +08:00
|
|
|
extern int (*cf_read_hook)(byte *buf, unsigned int max, int fd);
|
|
|
|
extern int (*cf_open_hook)(char *filename);
|
1998-11-28 03:35:10 +08:00
|
|
|
|
|
|
|
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;
|
2008-12-25 18:55:27 +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
|
|
|
|
2011-09-12 03:21:47 +08:00
|
|
|
struct include_file_stack {
|
|
|
|
void *stack; /* Internal lexer state */
|
|
|
|
unsigned int conf_lino; /* Current file lineno (at include) */
|
|
|
|
char conf_fname[BIRD_FNAME_MAX]; /* Current file name */
|
|
|
|
int conf_fd; /* Current file descriptor */
|
|
|
|
struct include_file_stack *prev;
|
|
|
|
struct include_file_stack *next;
|
|
|
|
};
|
|
|
|
|
2011-10-10 07:01:58 +08:00
|
|
|
extern struct include_file_stack *ifs;
|
2011-09-12 03:21:47 +08:00
|
|
|
|
1999-02-06 05:37:34 +08:00
|
|
|
|
1998-11-28 03:35:10 +08:00
|
|
|
int cf_lex(void);
|
2011-09-12 03:21:47 +08:00
|
|
|
void cf_lex_init(int is_cli, struct config *c);
|
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
|