File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird2 / conf / conf.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Oct 21 16:03:56 2019 UTC (4 years, 8 months ago) by misho
Branches: bird2, MAIN
CVS tags: v2_0_7p0, HEAD
bird2 ver 2.0.7

    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: /* Configuration structure */
   19: 
   20: struct config {
   21:   pool *pool;				/* Pool the configuration is stored in */
   22:   linpool *mem;				/* Linear pool containing configuration data */
   23:   list protos;				/* Configured protocol instances (struct proto_config) */
   24:   list tables;				/* Configured routing tables (struct rtable_config) */
   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:   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:   int err_chno;				/* Character where the parser stopped */
   51:   char *err_file_name;			/* File name containing error */
   52:   char *file_name;			/* Name of main configuration file */
   53:   int file_fd;				/* File descriptor of main configuration file */
   54:   HASH(struct symbol) sym_hash;		/* Lexer: symbol hash table */
   55:   struct config *fallback;		/* Link to regular config for CLI parsing */
   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: extern struct config *config;		/* Currently active configuration */
   65: 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: int config_confirm(void);
   73: int config_undo(void);
   74: int config_status(void);
   75: btime config_timer_status(void);
   76: void config_init(void);
   77: void cf_error(const char *msg, ...) NORET;
   78: void config_add_obstacle(struct config *);
   79: void config_del_obstacle(struct config *);
   80: void order_shutdown(int gr);
   81: 
   82: #define RECONFIG_NONE	0
   83: #define RECONFIG_HARD	1
   84: #define RECONFIG_SOFT	2
   85: #define RECONFIG_UNDO	3
   86: 
   87: #define CONF_DONE	0
   88: #define CONF_PROGRESS	1
   89: #define CONF_QUEUED	2
   90: #define CONF_UNQUEUED	3
   91: #define CONF_CONFIRM	4
   92: #define CONF_SHUTDOWN	-1
   93: #define CONF_NOTHING	-2
   94: 
   95: 
   96: /* Pools */
   97: 
   98: extern linpool *cfg_mem;
   99: 
  100: #define cfg_alloc(size) lp_alloc(cfg_mem, size)
  101: #define cfg_allocu(size) lp_allocu(cfg_mem, size)
  102: #define cfg_allocz(size) lp_allocz(cfg_mem, size)
  103: char *cfg_strdup(const char *c);
  104: void cfg_copy_list(list *dest, list *src, unsigned node_size);
  105: 
  106: /* Lexer */
  107: 
  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;
  113:   struct sym_scope *scope;
  114:   int class;				/* SYM_* */
  115:   uint flags;				/* SYM_FLAG_* */
  116: 
  117:   union {
  118:     struct proto_config *proto;		/* For SYM_PROTO and SYM_TEMPLATE */
  119:     const struct f_line *function;	/* For SYM_FUNCTION */
  120:     const struct filter *filter;	/* For SYM_FILTER */
  121:     struct rtable_config *table;	/* For SYM_TABLE */
  122:     struct f_dynamic_attr *attribute;	/* For SYM_ATTRIBUTE */
  123:     struct f_val *val;			/* For SYM_CONSTANT */
  124:     uint offset;			/* For SYM_VARIABLE */
  125:   };
  126: 
  127:   char name[0];
  128: };
  129: 
  130: struct sym_scope {
  131:   struct sym_scope *next;		/* Next on scope stack */
  132:   struct symbol *name;			/* Name of this scope */
  133:   uint slots;				/* Variable slots */
  134:   int active;				/* Currently entered */
  135: };
  136: 
  137: #define SYM_MAX_LEN 64
  138: 
  139: /* Remember to update cf_symbol_class_name() */
  140: #define SYM_VOID 0
  141: #define SYM_PROTO 1
  142: #define SYM_TEMPLATE 2
  143: #define SYM_FUNCTION 3
  144: #define SYM_FILTER 4
  145: #define SYM_TABLE 5
  146: #define SYM_ATTRIBUTE 6
  147: 
  148: #define SYM_VARIABLE 0x100	/* 0x100-0x1ff are variable types */
  149: #define SYM_VARIABLE_RANGE SYM_VARIABLE ... (SYM_VARIABLE | 0xff)
  150: #define SYM_CONSTANT 0x200	/* 0x200-0x2ff are variable types */
  151: #define SYM_CONSTANT_RANGE SYM_CONSTANT ... (SYM_CONSTANT | 0xff)
  152: 
  153: #define SYM_TYPE(s) ((s)->val->type)
  154: #define SYM_VAL(s) ((s)->val->val)
  155: 
  156: /* Symbol flags */
  157: #define SYM_FLAG_SAME 0x1	/* For SYM_FUNCTION and SYM_FILTER */
  158: 
  159: struct include_file_stack {
  160:   void *buffer;				/* Internal lexer state */
  161:   char *file_name;			/* File name */
  162:   int fd;				/* File descriptor */
  163:   int lino;				/* Current line num */
  164:   int chno;				/* Current char num (on current line) */
  165:   int toklen;				/* Current token length */
  166:   int depth;				/* Include depth, 0 = cannot include */
  167: 
  168:   struct include_file_stack *prev;	/* Previous record in stack */
  169:   struct include_file_stack *up;	/* Parent (who included this file) */
  170: };
  171: 
  172: extern struct include_file_stack *ifs;
  173: 
  174: extern struct sym_scope *conf_this_scope;
  175: 
  176: int cf_lex(void);
  177: void cf_lex_init(int is_cli, struct config *c);
  178: void cf_lex_unwind(void);
  179: 
  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: struct symbol *cf_localize_symbol(struct symbol *sym);
  185: 
  186: /**
  187:  * cf_define_symbol - define meaning of a symbol
  188:  * @sym: symbol to be defined
  189:  * @type: symbol class to assign
  190:  * @def: class dependent data
  191:  *
  192:  * Defines new meaning of a symbol. If the symbol is an undefined
  193:  * one (%SYM_VOID), it's just re-defined to the new type. If it's defined
  194:  * in different scope, a new symbol in current scope is created and the
  195:  * meaning is assigned to it. If it's already defined in the current scope,
  196:  * an error is reported via cf_error().
  197:  *
  198:  * Result: Pointer to the newly defined symbol. If we are in the top-level
  199:  * scope, it's the same @sym as passed to the function.
  200:  */
  201: #define cf_define_symbol(sym_, type_, var_, def_) ({ \
  202:     struct symbol *sym = cf_localize_symbol(sym_); \
  203:     sym->class = type_; \
  204:     sym->var_ = def_; \
  205:     sym; })
  206: 
  207: void cf_push_scope(struct symbol *);
  208: void cf_pop_scope(void);
  209: char *cf_symbol_class_name(struct symbol *sym);
  210: 
  211: /* Parser */
  212: 
  213: extern char *cf_text;
  214: int cf_parse(void);
  215: 
  216: /* Sysdep hooks */
  217: 
  218: void sysdep_preconfig(struct config *);
  219: int sysdep_commit(struct config *, struct config *);
  220: void sysdep_shutdown_done(void);
  221: 
  222: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>