conf.h 7.46 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
 *
 *	Can be freely distributed and used under the terms of the GNU GPL.
 */

#ifndef _BIRD_CONF_H_
#define _BIRD_CONF_H_

12 13
#include "sysdep/config.h"
#include "lib/ip.h"
14
#include "lib/hash.h"
15
#include "lib/resource.h"
16
#include "lib/timer.h"
17

18 19 20 21 22 23
/* 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) */
24
  list tables;				/* Configured routing tables (struct rtable_config) */
Ondřej Zajíček's avatar
Ondřej Zajíček committed
25
  list logfiles;			/* Configured log files (sysdep) */
26
  list tests;				/* Configured unit tests (f_bt_test_suite) */
27
  list symbols;				/* Configured symbols in config order */
28

29
  int mrtdump_file;			/* Configured MRTDump file (sysdep, fd in unix) */
30
  char *syslog_name;			/* Name used for syslog (NULL -> no syslog) */
31
  struct rtable_config *def_tables[NET_MAX]; /* Default routing tables for each network */
32
  struct iface_patt *router_id_from;	/* Configured list of router ID iface patterns */
33

34
  u32 router_id;			/* Our Router ID */
35 36
  unsigned proto_default_debug;		/* Default protocol debug mask */
  unsigned proto_default_mrtdump;	/* Default protocol mrtdump mask */
37 38 39 40
  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 */
41
  u32 gr_wait;				/* Graceful restart wait timeout (sec) */
42

43
  int cli_debug;			/* Tracing of CLI connections and commands */
44 45 46 47
  int latency_debug;			/* I/O loop tracks duration of each event */
  u32 latency_limit;			/* Events with longer duration are logged (us) */
  u32 watchdog_warning;			/* I/O loop watchdog limit for warning (us) */
  u32 watchdog_timeout;			/* Watchdog timeout (in seconds, 0 = disabled) */
48 49
  char *err_msg;			/* Parser error message */
  int err_lino;				/* Line containing error */
50
  int err_chno;				/* Character where the parser stopped */
51 52 53
  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 */
54 55
  HASH(struct symbol) sym_hash;		/* Lexer: symbol hash table */
  struct config *fallback;		/* Link to regular config for CLI parsing */
Ondřej Zajíček's avatar
Ondřej Zajíček committed
56
  struct sym_scope *root_scope;		/* Scope for root symbols */
57
  int obstacle_count;			/* Number of items blocking freeing of this config */
58
  int shutdown;				/* This is a pseudo-config for daemon shutdown */
59
  int gr_down;				/* This is a pseudo-config for graceful restart */
60
  btime load_time;			/* When we've got this configuration */
61 62 63
};

/* Please don't use these variables in protocols. Use proto_config->global instead. */
64 65
extern struct config *config;		/* Currently active configuration */
extern struct config *new_config;	/* Configuration being parsed */
66

67
struct config *config_alloc(const char *name);
68
int config_parse(struct config *);
69
int cli_parse(struct config *);
70
void config_free(struct config *);
71
int config_commit(struct config *, int type, uint timeout);
72 73
int config_confirm(void);
int config_undo(void);
74 75
int config_status(void);
btime config_timer_status(void);
76
void config_init(void);
77
void cf_error(const char *msg, ...) NORET;
78 79
void config_add_obstacle(struct config *);
void config_del_obstacle(struct config *);
80
void order_shutdown(int gr);
81

82 83 84 85 86 87 88 89 90 91 92 93 94
#define RECONFIG_NONE	0
#define RECONFIG_HARD	1
#define RECONFIG_SOFT	2
#define RECONFIG_UNDO	3

#define CONF_DONE	0
#define CONF_PROGRESS	1
#define CONF_QUEUED	2
#define CONF_UNQUEUED	3
#define CONF_CONFIRM	4
#define CONF_SHUTDOWN	-1
#define CONF_NOTHING	-2

95

96 97
/* Pools */

98
extern linpool *cfg_mem;
99

100 101 102
#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)
Ondřej Zajíček's avatar
Ondřej Zajíček committed
103
char *cfg_strdup(const char *c);
104
void cfg_copy_list(list *dest, list *src, unsigned node_size);
105

106 107
/* Lexer */

Pavel Tvrdík's avatar
Pavel Tvrdík committed
108
extern int (*cf_read_hook)(byte *buf, uint max, int fd);
109 110

struct symbol {
111
  node n;				/* In list of symbols in config */
112
  struct symbol *next;
Martin Mareš's avatar
Martin Mareš committed
113
  struct sym_scope *scope;
114 115 116 117 118 119 120 121 122
  int class;				/* SYM_* */
  uint flags;				/* SYM_FLAG_* */

  union {
    struct proto_config *proto;		/* For SYM_PROTO and SYM_TEMPLATE */
    const struct f_line *function;	/* For SYM_FUNCTION */
    const struct filter *filter;	/* For SYM_FILTER */
    struct rtable_config *table;	/* For SYM_TABLE */
    struct f_dynamic_attr *attribute;	/* For SYM_ATTRIBUTE */
123 124
    struct f_val *val;			/* For SYM_CONSTANT */
    uint offset;			/* For SYM_VARIABLE */
125 126 127
  };

  char name[0];
128 129
};

130 131 132
struct sym_scope {
  struct sym_scope *next;		/* Next on scope stack */
  struct symbol *name;			/* Name of this scope */
133
  uint slots;				/* Variable slots */
134 135 136
  int active;				/* Currently entered */
};

137 138
#define SYM_MAX_LEN 64

139
/* Remember to update cf_symbol_class_name() */
140
#define SYM_VOID 0
141
#define SYM_PROTO 1
142
#define SYM_TEMPLATE 2
Martin Mareš's avatar
Martin Mareš committed
143 144 145
#define SYM_FUNCTION 3
#define SYM_FILTER 4
#define SYM_TABLE 5
Maria Matejka's avatar
Maria Matejka committed
146
#define SYM_ATTRIBUTE 6
147

Martin Mareš's avatar
Martin Mareš committed
148
#define SYM_VARIABLE 0x100	/* 0x100-0x1ff are variable types */
Maria Matejka's avatar
Maria Matejka committed
149
#define SYM_VARIABLE_RANGE SYM_VARIABLE ... (SYM_VARIABLE | 0xff)
150
#define SYM_CONSTANT 0x200	/* 0x200-0x2ff are variable types */
Maria Matejka's avatar
Maria Matejka committed
151
#define SYM_CONSTANT_RANGE SYM_CONSTANT ... (SYM_CONSTANT | 0xff)
152

153 154 155 156 157
#define SYM_TYPE(s) ((s)->val->type)
#define SYM_VAL(s) ((s)->val->val)

/* Symbol flags */
#define SYM_FLAG_SAME 0x1	/* For SYM_FUNCTION and SYM_FILTER */
158

159
struct include_file_stack {
160 161 162 163
  void *buffer;				/* Internal lexer state */
  char *file_name;			/* File name */
  int fd;				/* File descriptor */
  int lino;				/* Current line num */
164 165
  int chno;				/* Current char num (on current line) */
  int toklen;				/* Current token length */
166 167 168 169
  int depth;				/* Include depth, 0 = cannot include */

  struct include_file_stack *prev;	/* Previous record in stack */
  struct include_file_stack *up;	/* Parent (who included this file) */
170 171
};

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

Ondřej Zajíček's avatar
Ondřej Zajíček committed
174 175
extern struct sym_scope *conf_this_scope;

176
int cf_lex(void);
177
void cf_lex_init(int is_cli, struct config *c);
178 179
void cf_lex_unwind(void);

180
struct symbol *cf_find_symbol(const struct config *cfg, const byte *c);
181

182
struct symbol *cf_get_symbol(const byte *c);
183
struct symbol *cf_default_name(char *template, int *counter);
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
struct symbol *cf_localize_symbol(struct symbol *sym);

/**
 * cf_define_symbol - define meaning of a symbol
 * @sym: symbol to be defined
 * @type: symbol class to assign
 * @def: class dependent data
 *
 * Defines new meaning of a symbol. If the symbol is an undefined
 * one (%SYM_VOID), it's just re-defined to the new type. If it's defined
 * in different scope, a new symbol in current scope is created and the
 * meaning is assigned to it. If it's already defined in the current scope,
 * an error is reported via cf_error().
 *
 * Result: Pointer to the newly defined symbol. If we are in the top-level
 * scope, it's the same @sym as passed to the function.
 */
#define cf_define_symbol(sym_, type_, var_, def_) ({ \
    struct symbol *sym = cf_localize_symbol(sym_); \
    sym->class = type_; \
    sym->var_ = def_; \
    sym; })

Martin Mareš's avatar
Martin Mareš committed
207 208
void cf_push_scope(struct symbol *);
void cf_pop_scope(void);
209
char *cf_symbol_class_name(struct symbol *sym);
210 211 212

/* Parser */

213
extern char *cf_text;
214 215
int cf_parse(void);

216 217 218
/* Sysdep hooks */

void sysdep_preconfig(struct config *);
219
int sysdep_commit(struct config *, struct config *);
220
void sysdep_shutdown_done(void);
221

222
#endif