Statistics
| Branch: | Revision:

iof-bird / bird-2.0.1 / conf / conf.h @ 6b3f1a54

History | View | Annotate | Download (5.67 KB)

1
/*
2
 *        BIRD Internet Routing Daemon -- Configuration File Handling
3
 *
4
 *        (c) 1998--2000 Martin Mares <mj@ucw.cz>
5
 *
6
 *        Can be freely distributed and used under the terms of the GNU GPL.
7
 */
8

    
9
#ifndef _BIRD_CONF_H_
10
#define _BIRD_CONF_H_
11

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

    
18

    
19
/* Configuration structure */
20

    
21
struct config {
22
  pool *pool;                                /* Pool the configuration is stored in */
23
  linpool *mem;                                /* Linear pool containing configuration data */
24
  list protos;                                /* Configured protocol instances (struct proto_config) */
25
  list tables;                                /* Configured routing tables (struct rtable_config) */
26
  list logfiles;                        /* Configured log files (sysdep) */
27
  list tests;                                /* Configured unit tests (f_bt_test_suite) */
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
  unsigned proto_default_debug;                /* Default protocol debug mask */
36
  unsigned proto_default_mrtdump;        /* Default protocol mrtdump mask */
37
  struct timeformat tf_route;                /* Time format for 'show route' */
38
  struct timeformat tf_proto;                /* Time format for 'show protocol' */
39
  struct timeformat tf_log;                /* Time format for the logfile */
40
  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
  int latency_debug;                        /* I/O loop tracks duration of each event */
45
  u32 latency_limit;                        /* Events with longer duration are logged (us) */
46
  u32 watchdog_warning;                        /* I/O loop watchdog limit for warning (us) */
47
  u32 watchdog_timeout;                        /* Watchdog timeout (in seconds, 0 = disabled) */
48
  char *err_msg;                        /* Parser error message */
49
  int err_lino;                                /* Line containing error */
50
  char *err_file_name;                        /* File name containing error */
51
  char *file_name;                        /* Name of main configuration file */
52
  int file_fd;                                /* File descriptor of main configuration file */
53
  HASH(struct symbol) sym_hash;                /* Lexer: symbol hash table */
54
  struct config *fallback;                /* Link to regular config for CLI parsing */
55
  int obstacle_count;                        /* Number of items blocking freeing of this config */
56
  int shutdown;                                /* This is a pseudo-config for daemon shutdown */
57
  btime load_time;                        /* When we've got this configuration */
58
};
59

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

    
64
struct config *config_alloc(const char *name);
65
int config_parse(struct config *);
66
int cli_parse(struct config *);
67
void config_free(struct config *);
68
int config_commit(struct config *, int type, uint timeout);
69
int config_confirm(void);
70
int config_undo(void);
71
void config_init(void);
72
void cf_error(const char *msg, ...) NORET;
73
void config_add_obstacle(struct config *);
74
void config_del_obstacle(struct config *);
75
void order_shutdown(void);
76

    
77
#define RECONFIG_NONE        0
78
#define RECONFIG_HARD        1
79
#define RECONFIG_SOFT        2
80
#define RECONFIG_UNDO        3
81

    
82
#define CONF_DONE        0
83
#define CONF_PROGRESS        1
84
#define CONF_QUEUED        2
85
#define CONF_UNQUEUED        3
86
#define CONF_CONFIRM        4
87
#define CONF_SHUTDOWN        -1
88
#define CONF_NOTHING        -2
89

    
90

    
91
/* Pools */
92

    
93
extern linpool *cfg_mem;
94

    
95
#define cfg_alloc(size) lp_alloc(cfg_mem, size)
96
#define cfg_allocu(size) lp_allocu(cfg_mem, size)
97
#define cfg_allocz(size) lp_allocz(cfg_mem, size)
98
char *cfg_strdup(const char *c);
99
void cfg_copy_list(list *dest, list *src, unsigned node_size);
100

    
101
/* Lexer */
102

    
103
extern int (*cf_read_hook)(byte *buf, uint max, int fd);
104

    
105
struct symbol {
106
  struct symbol *next;
107
  struct sym_scope *scope;
108
  int class;
109
  int aux;
110
  void *aux2;
111
  void *def;
112
  char name[1];
113
};
114

    
115
struct sym_scope {
116
  struct sym_scope *next;                /* Next on scope stack */
117
  struct symbol *name;                        /* Name of this scope */
118
  int active;                                /* Currently entered */
119
};
120

    
121
#define SYM_MAX_LEN 64
122

    
123
/* Remember to update cf_symbol_class_name() */
124
#define SYM_VOID 0
125
#define SYM_PROTO 1
126
#define SYM_TEMPLATE 2
127
#define SYM_FUNCTION 3
128
#define SYM_FILTER 4
129
#define SYM_TABLE 5
130

    
131
#define SYM_VARIABLE 0x100        /* 0x100-0x1ff are variable types */
132
#define SYM_CONSTANT 0x200        /* 0x200-0x2ff are variable types */
133

    
134
#define SYM_TYPE(s) (((struct f_val *) (s)->def)->type)
135
#define SYM_VAL(s) (((struct f_val *) (s)->def)->val)
136

    
137
struct include_file_stack {
138
  void *buffer;                                /* Internal lexer state */
139
  char *file_name;                        /* File name */
140
  int fd;                                /* File descriptor */
141
  int lino;                                /* Current line num */
142
  int depth;                                /* Include depth, 0 = cannot include */
143

    
144
  struct include_file_stack *prev;        /* Previous record in stack */
145
  struct include_file_stack *up;        /* Parent (who included this file) */
146
};
147

    
148
extern struct include_file_stack *ifs;
149

    
150

    
151
int cf_lex(void);
152
void cf_lex_init(int is_cli, struct config *c);
153
void cf_lex_unwind(void);
154

    
155
struct symbol *cf_find_symbol(struct config *cfg, byte *c);
156

    
157
struct symbol *cf_get_symbol(byte *c);
158
struct symbol *cf_default_name(char *template, int *counter);
159
struct symbol *cf_define_symbol(struct symbol *symbol, int type, void *def);
160
void cf_push_scope(struct symbol *);
161
void cf_pop_scope(void);
162
char *cf_symbol_class_name(struct symbol *sym);
163

    
164
static inline int cf_symbol_is_constant(struct symbol *sym)
165
{ return (sym->class & 0xff00) == SYM_CONSTANT; }
166

    
167

    
168
/* Parser */
169

    
170
extern char *cf_text;
171
int cf_parse(void);
172

    
173
/* Sysdep hooks */
174

    
175
void sysdep_preconfig(struct config *);
176
int sysdep_commit(struct config *, struct config *);
177
void sysdep_shutdown_done(void);
178

    
179
#endif