conf.h 5.12 KB
Newer Older
1 2 3
/*
 *	BIRD Internet Routing Daemon -- Configuration File Handling
 *
4
 *	(c) 1998--2000 Martin Mares <mj@ucw.cz>
5 6 7 8 9 10 11 12
 *
 *	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"
13
#include "lib/timer.h"
14

15 16
#define BIRD_FNAME_MAX 255	/* Would be better to use some UNIX define */

17 18 19 20 21 22
/* 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) */
23
  list tables;				/* Configured routing tables (struct rtable_config) */
24
  list roa_tables;			/* Configured ROA tables (struct roa_table_config) */
25
  list logfiles;			/* Configured log fils (sysdep) */
26

27
  int mrtdump_file;			/* Configured MRTDump file (sysdep, fd in unix) */
Ondřej Zajíček's avatar
Ondřej Zajíček committed
28
  char *syslog_name;			/* Name used for syslog (NULL -> no syslog) */
29
  struct rtable_config *master_rtc;	/* Configuration of master routing table */
30

31
  u32 router_id;			/* Our Router ID */
32 33 34
  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 */
35 36
  unsigned proto_default_debug;		/* Default protocol debug mask */
  unsigned proto_default_mrtdump;	/* Default protocol mrtdump mask */
37 38 39 40 41
  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 */

42
  int cli_debug;			/* Tracing of CLI connections and commands */
43 44
  char *err_msg;			/* Parser error message */
  int err_lino;				/* Line containing error */
45 46 47
  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 */
48 49
  struct symbol **sym_hash;		/* Lexer: symbol hash table */
  struct symbol **sym_fallback;		/* Lexer: fallback symbol hash table */
50
  int obstacle_count;			/* Number of items blocking freeing of this config */
51
  int shutdown;				/* This is a pseudo-config for daemon shutdown */
52
  bird_clock_t load_time;		/* When we've got this configuration */
53 54 55
};

/* Please don't use these variables in protocols. Use proto_config->global instead. */
56 57 58 59
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 */
60

61
extern int shutting_down;
62
extern bird_clock_t boot_time;
63

64 65
struct config *config_alloc(byte *name);
int config_parse(struct config *);
66
int cli_parse(struct config *);
67
void config_free(struct config *);
68 69 70
int config_commit(struct config *, int type);
#define RECONFIG_HARD 0
#define RECONFIG_SOFT 1
71
void cf_error(char *msg, ...) NORET;
72 73
void config_add_obstacle(struct config *);
void config_del_obstacle(struct config *);
74
void order_shutdown(void);
75 76 77 78

#define CONF_DONE 0
#define CONF_PROGRESS 1
#define CONF_QUEUED 2
79
#define CONF_SHUTDOWN 3
80

81 82
/* Pools */

83
extern linpool *cfg_mem;
84

85 86 87 88
#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);
89
void cfg_copy_list(list *dest, list *src, unsigned node_size);
90

91 92
/* Lexer */

93 94
extern int (*cf_read_hook)(byte *buf, unsigned int max, int fd);
extern int (*cf_open_hook)(char *filename);
95 96 97

struct symbol {
  struct symbol *next;
Martin Mareš's avatar
Martin Mareš committed
98
  struct sym_scope *scope;
99
  int class;
100
  int aux;
101
  void *aux2;
102 103 104 105
  void *def;
  char name[1];
};

106
/* Remember to update cf_symbol_class_name() */
107
#define SYM_VOID 0
108
#define SYM_PROTO 1
109
#define SYM_NUMBER 2
Martin Mareš's avatar
Martin Mareš committed
110 111 112
#define SYM_FUNCTION 3
#define SYM_FILTER 4
#define SYM_TABLE 5
Martin Mareš's avatar
Martin Mareš committed
113
#define SYM_IPA 6
114
#define SYM_TEMPLATE 7
115
#define SYM_ROA 8
116

Martin Mareš's avatar
Martin Mareš committed
117
#define SYM_VARIABLE 0x100	/* 0x100-0x1ff are variable types */
118

119 120 121 122 123 124 125 126 127
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;
};

Ondřej Zajíček's avatar
Ondřej Zajíček committed
128
extern struct include_file_stack *ifs;
129

130

131
int cf_lex(void);
132
void cf_lex_init(int is_cli, struct config *c);
133
struct symbol *cf_find_symbol(byte *c);
134
struct symbol *cf_default_name(char *template, int *counter);
135
struct symbol *cf_define_symbol(struct symbol *symbol, int type, void *def);
Martin Mareš's avatar
Martin Mareš committed
136 137
void cf_push_scope(struct symbol *);
void cf_pop_scope(void);
138 139
struct symbol *cf_walk_symbols(struct config *cf, struct symbol *sym, int *pos);
char *cf_symbol_class_name(struct symbol *sym);
140 141 142 143 144

/* Parser */

int cf_parse(void);

145 146 147
/* Sysdep hooks */

void sysdep_preconfig(struct config *);
148
int sysdep_commit(struct config *, struct config *);
149
void sysdep_shutdown_done(void);
150

151
#endif