mirror of
				https://gitlab.labs.nic.cz/labs/bird.git
				synced 2024-05-11 16:54:54 +00:00 
			
		
		
		
	Pavel's fault that he's never tested shadowing of declarations in the filters. cf_define_symbol() has been modified to check the scope of the symbol it's given and it if it's an already defined symbol, but in a different scope, a copy is created in the current scope and redefined to the new meaning, the consequence being that it cf_define_symbol() now returns the new symbol you need to use when assigning aux and aux2.
		
			
				
	
	
		
			118 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *	BIRD Internet Routing Daemon -- Configuration File Handling
 | |
|  *
 | |
|  *	(c) 1998--2000 Martin Mares <mj@ucw.cz>
 | |
|  *
 | |
|  *	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"
 | |
| #include "lib/timer.h"
 | |
| 
 | |
| /* 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) */
 | |
|   list tables;				/* Configured routing tables (struct rtable_config) */
 | |
|   list logfiles;			/* Configured log fils (sysdep) */
 | |
|   struct rtable_config *master_rtc;	/* Configuration of master routing table */
 | |
|   u32 router_id;			/* Our Router ID */
 | |
|   unsigned int proto_default_debug;	/* Default protocol debug mask */
 | |
|   int cli_debug;			/* Tracing of CLI connections and commands */
 | |
|   char *err_msg;			/* Parser error message */
 | |
|   int err_lino;				/* Line containing error */
 | |
|   char *file_name;			/* Name of configuration file */
 | |
|   struct symbol **sym_hash;		/* Lexer: symbol hash table */
 | |
|   struct symbol **sym_fallback;		/* Lexer: fallback symbol hash table */
 | |
|   int obstacle_count;			/* Number of items blocking freeing of this config */
 | |
|   int shutdown;				/* This is a pseudo-config for daemon shutdown */
 | |
|   bird_clock_t load_time;		/* When we've got this configuration */
 | |
| };
 | |
| 
 | |
| /* Please don't use these variables in protocols. Use proto_config->global instead. */
 | |
| 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 */
 | |
| 
 | |
| extern int shutting_down;
 | |
| extern bird_clock_t boot_time;
 | |
| 
 | |
| struct config *config_alloc(byte *name);
 | |
| int config_parse(struct config *);
 | |
| int cli_parse(struct config *);
 | |
| void config_free(struct config *);
 | |
| int config_commit(struct config *);
 | |
| void cf_error(char *msg, ...) NORET;
 | |
| void config_add_obstacle(struct config *);
 | |
| void config_del_obstacle(struct config *);
 | |
| void order_shutdown(void);
 | |
| 
 | |
| #define CONF_DONE 0
 | |
| #define CONF_PROGRESS 1
 | |
| #define CONF_QUEUED 2
 | |
| #define CONF_SHUTDOWN 3
 | |
| 
 | |
| /* Pools */
 | |
| 
 | |
| extern linpool *cfg_mem;
 | |
| 
 | |
| #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);
 | |
| 
 | |
| /* Lexer */
 | |
| 
 | |
| extern int (*cf_read_hook)(byte *buf, unsigned int max);
 | |
| 
 | |
| struct symbol {
 | |
|   struct symbol *next;
 | |
|   struct sym_scope *scope;
 | |
|   int class;
 | |
|   int aux;
 | |
|   void *aux2; 
 | |
|   void *def;
 | |
|   char name[1];
 | |
| };
 | |
| 
 | |
| /* Remember to update cf_symbol_class_name() */
 | |
| #define SYM_VOID 0
 | |
| #define SYM_PROTO 1
 | |
| #define SYM_NUMBER 2
 | |
| #define SYM_FUNCTION 3
 | |
| #define SYM_FILTER 4
 | |
| #define SYM_TABLE 5
 | |
| #define SYM_IPA 6
 | |
| 
 | |
| #define SYM_VARIABLE 0x100	/* 0x100-0x1ff are variable types */
 | |
| 
 | |
| extern int conf_lino;
 | |
| 
 | |
| int cf_lex(void);
 | |
| void cf_lex_init(int is_cli);
 | |
| struct symbol *cf_find_symbol(byte *c);
 | |
| struct symbol *cf_default_name(char *template, int *counter);
 | |
| struct symbol *cf_define_symbol(struct symbol *symbol, int type, void *def);
 | |
| void cf_push_scope(struct symbol *);
 | |
| void cf_pop_scope(void);
 | |
| struct symbol *cf_walk_symbols(struct config *cf, struct symbol *sym, int *pos);
 | |
| char *cf_symbol_class_name(struct symbol *sym);
 | |
| 
 | |
| /* Parser */
 | |
| 
 | |
| int cf_parse(void);
 | |
| 
 | |
| /* Sysdep hooks */
 | |
| 
 | |
| void sysdep_preconfig(struct config *);
 | |
| int sysdep_commit(struct config *, struct config *);
 | |
| void sysdep_shutdown_done(void);
 | |
| 
 | |
| #endif
 |