Annotation of embedaddon/bird/conf/confbase.Y, revision 1.1.1.2

1.1       misho       1: /*
                      2:  *     BIRD -- Configuration Parser Top
                      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: CF_HDR
                     10: 
                     11: #define PARSER 1
                     12: 
                     13: #include "nest/bird.h"
                     14: #include "conf/conf.h"
                     15: #include "lib/resource.h"
                     16: #include "lib/socket.h"
                     17: #include "lib/timer.h"
                     18: #include "lib/string.h"
                     19: #include "nest/protocol.h"
                     20: #include "nest/iface.h"
                     21: #include "nest/route.h"
                     22: #include "nest/cli.h"
                     23: #include "filter/filter.h"
                     24: 
                     25: /* FIXME: Turn on YYERROR_VERBOSE and work around lots of bison bugs? */
                     26: 
                     27: CF_DEFINES
                     28: 
                     29: static void
                     30: check_u16(unsigned val)
                     31: {
                     32:   if (val > 0xFFFF)
                     33:     cf_error("Value %d out of range (0-65535)", val);
                     34: }
                     35: 
                     36: CF_DECLS
                     37: 
                     38: %union {
                     39:   int i;
                     40:   u32 i32;
                     41:   ip_addr a;
                     42:   struct symbol *s;
                     43:   char *t;
                     44:   struct rtable_config *r;
                     45:   struct f_inst *x;
1.1.1.2 ! misho      46:   struct f_dynamic_attr fda;
        !            47:   struct f_static_attr fsa;
1.1       misho      48:   struct filter *f;
                     49:   struct f_tree *e;
                     50:   struct f_trie *trie;
                     51:   struct f_val v;
                     52:   struct f_path_mask *h;
                     53:   struct password_item *p;
                     54:   struct rt_show_data *ra;
                     55:   struct roa_show_data *ro;
                     56:   struct sym_show_data *sd;
                     57:   struct lsadb_show_data *ld;
1.1.1.2 ! misho      58:   struct mrt_dump_data *md;
1.1       misho      59:   struct iface *iface;
                     60:   struct roa_table *rot;
                     61:   void *g;
                     62:   bird_clock_t time;
                     63:   struct prefix px;
                     64:   struct proto_spec ps;
                     65:   struct timeformat *tf;
                     66: }
                     67: 
                     68: %token END CLI_MARKER INVALID_TOKEN ELSECOL DDOT
                     69: %token GEQ LEQ NEQ AND OR
                     70: %token PO PC
                     71: %token <i> NUM ENUM
                     72: %token <i32> RTRID
                     73: %token <a> IPA
                     74: %token <s> SYM
                     75: %token <t> TEXT
                     76: %type <iface> ipa_scope
                     77: 
                     78: %type <i> expr bool pxlen
                     79: %type <i32> expr_us
                     80: %type <time> datetime
                     81: %type <a> ipa
                     82: %type <px> prefix prefix_or_ipa
1.1.1.2 ! misho      83: %type <t> text opttext
1.1       misho      84: %type <t> text_or_none
                     85: 
                     86: %nonassoc PREFIX_DUMMY
                     87: %left AND OR
                     88: %nonassoc '=' '<' '>' '~' GEQ LEQ NEQ NMA PO PC
                     89: %left '+' '-'
                     90: %left '*' '/' '%'
                     91: %left '!'
                     92: %nonassoc '.'
                     93: 
                     94: CF_KEYWORDS(DEFINE, ON, OFF, YES, NO, S, MS, US, PORT)
                     95: 
                     96: CF_GRAMMAR
                     97: 
                     98: /* Basic config file structure */
                     99: 
                    100: config: conf_entries END { return 0; }
                    101:  | CLI_MARKER cli_cmd { return 0; }
                    102:  ;
                    103: 
                    104: conf_entries:
                    105:    /* EMPTY */
                    106:  | conf_entries conf
                    107:  ;
                    108: 
                    109: CF_ADDTO(conf, ';')
                    110: 
                    111: 
                    112: /* Constant expressions */
                    113: 
                    114: CF_ADDTO(conf, definition)
                    115: definition:
                    116:    DEFINE SYM '=' term ';' {
                    117:      struct f_val *val = cfg_alloc(sizeof(struct f_val));
                    118:      *val = f_eval($4, cfg_mem);
                    119:      if (val->type == T_RETURN) cf_error("Runtime error");
                    120:      cf_define_symbol($2, SYM_CONSTANT | val->type, val);
                    121:    }
                    122:  ;
                    123: 
                    124: expr:
                    125:    NUM
                    126:  | '(' term ')' { $$ = f_eval_int($2); }
                    127:  | SYM {
                    128:      if ($1->class != (SYM_CONSTANT | T_INT)) cf_error("Number expected");
                    129:      $$ = SYM_VAL($1).i; }
                    130:  ;
                    131: 
                    132: 
                    133: expr_us:
                    134:    expr S  { $$ = (u32) $1 * 1000000; }
                    135:  | expr MS { $$ = (u32) $1 * 1000; }
                    136:  | expr US { $$ = (u32) $1 * 1; }
                    137:  ;
                    138: 
                    139: /* expr_u16: expr { check_u16($1); $$ = $1; }; */
                    140: 
                    141: /* Switches */
                    142: 
                    143: bool:
                    144:    expr { $$ = !!$1; }
                    145:  | ON { $$ = 1; }
                    146:  | YES { $$ = 1; }
                    147:  | OFF { $$ = 0; }
                    148:  | NO { $$ = 0; }
                    149:  | /* Silence means agreement */ { $$ = 1; }
                    150:  ;
                    151: 
                    152: /* Addresses, prefixes and netmasks */
                    153: 
                    154: ipa:
                    155:    IPA
                    156:  | SYM {
                    157:      if ($1->class != (SYM_CONSTANT | T_IP)) cf_error("IP address expected");
                    158:      $$ = SYM_VAL($1).px.ip;
                    159:    }
                    160:  ;
                    161: 
                    162: ipa_scope:
                    163:    /* empty */ { $$ = NULL; }
                    164:  | '%' SYM { $$ = if_get_by_name($2->name); }
                    165:  ;
                    166: 
                    167: prefix:
                    168:    ipa pxlen {
                    169:      if (!ip_is_prefix($1, $2)) cf_error("Invalid prefix");
                    170:      $$.addr = $1; $$.len = $2;
                    171:    }
                    172:  ;
                    173: 
                    174: prefix_or_ipa:
                    175:    prefix
                    176:  | ipa { $$.addr = $1; $$.len = BITS_PER_IP_ADDRESS; }
                    177:  ;
                    178: 
                    179: pxlen:
                    180:    '/' expr {
                    181:      if ($2 < 0 || $2 > BITS_PER_IP_ADDRESS) cf_error("Invalid prefix length %d", $2);
                    182:      $$ = $2;
                    183:    }
                    184:  | ':' ipa {
                    185:      $$ = ipa_masklen($2);
                    186:      if ($$ < 0) cf_error("Invalid netmask %I", $2);
                    187:    }
                    188:  ;
                    189: 
                    190: datetime:
                    191:    TEXT {
                    192:      $$ = tm_parse_datetime($1);
                    193:      if (!$$)
                    194:        cf_error("Invalid date and time");
                    195:    }
                    196:  ;
                    197: 
                    198: text:
                    199:    TEXT
                    200:  | SYM {
                    201:      if ($1->class != (SYM_CONSTANT | T_STRING)) cf_error("String expected");
                    202:      $$ = SYM_VAL($1).s;
                    203:    }
                    204:  ;
                    205: 
1.1.1.2 ! misho     206: opttext:
        !           207:     TEXT
        !           208:  | /* empty */ { $$ = NULL; }
        !           209:  ;
        !           210: 
1.1       misho     211: text_or_none:
                    212:    TEXT { $$ = $1; }
                    213:  |      { $$ = NULL; }
                    214:  ;
                    215: 
                    216: CF_CODE
                    217: 
                    218: CF_END

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