Annotation of embedaddon/bird/conf/confbase.Y, revision 1.1
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;
! 46: struct filter *f;
! 47: struct f_tree *e;
! 48: struct f_trie *trie;
! 49: struct f_val v;
! 50: struct f_path_mask *h;
! 51: struct password_item *p;
! 52: struct rt_show_data *ra;
! 53: struct roa_show_data *ro;
! 54: struct sym_show_data *sd;
! 55: struct lsadb_show_data *ld;
! 56: struct iface *iface;
! 57: struct roa_table *rot;
! 58: void *g;
! 59: bird_clock_t time;
! 60: struct prefix px;
! 61: struct proto_spec ps;
! 62: struct timeformat *tf;
! 63: }
! 64:
! 65: %token END CLI_MARKER INVALID_TOKEN ELSECOL DDOT
! 66: %token GEQ LEQ NEQ AND OR
! 67: %token PO PC
! 68: %token <i> NUM ENUM
! 69: %token <i32> RTRID
! 70: %token <a> IPA
! 71: %token <s> SYM
! 72: %token <t> TEXT
! 73: %type <iface> ipa_scope
! 74:
! 75: %type <i> expr bool pxlen
! 76: %type <i32> expr_us
! 77: %type <time> datetime
! 78: %type <a> ipa
! 79: %type <px> prefix prefix_or_ipa
! 80: %type <t> text
! 81: %type <t> text_or_none
! 82:
! 83: %nonassoc PREFIX_DUMMY
! 84: %left AND OR
! 85: %nonassoc '=' '<' '>' '~' GEQ LEQ NEQ NMA PO PC
! 86: %left '+' '-'
! 87: %left '*' '/' '%'
! 88: %left '!'
! 89: %nonassoc '.'
! 90:
! 91: CF_KEYWORDS(DEFINE, ON, OFF, YES, NO, S, MS, US, PORT)
! 92:
! 93: CF_GRAMMAR
! 94:
! 95: /* Basic config file structure */
! 96:
! 97: config: conf_entries END { return 0; }
! 98: | CLI_MARKER cli_cmd { return 0; }
! 99: ;
! 100:
! 101: conf_entries:
! 102: /* EMPTY */
! 103: | conf_entries conf
! 104: ;
! 105:
! 106: CF_ADDTO(conf, ';')
! 107:
! 108:
! 109: /* Constant expressions */
! 110:
! 111: CF_ADDTO(conf, definition)
! 112: definition:
! 113: DEFINE SYM '=' term ';' {
! 114: struct f_val *val = cfg_alloc(sizeof(struct f_val));
! 115: *val = f_eval($4, cfg_mem);
! 116: if (val->type == T_RETURN) cf_error("Runtime error");
! 117: cf_define_symbol($2, SYM_CONSTANT | val->type, val);
! 118: }
! 119: ;
! 120:
! 121: expr:
! 122: NUM
! 123: | '(' term ')' { $$ = f_eval_int($2); }
! 124: | SYM {
! 125: if ($1->class != (SYM_CONSTANT | T_INT)) cf_error("Number expected");
! 126: $$ = SYM_VAL($1).i; }
! 127: ;
! 128:
! 129:
! 130: expr_us:
! 131: expr S { $$ = (u32) $1 * 1000000; }
! 132: | expr MS { $$ = (u32) $1 * 1000; }
! 133: | expr US { $$ = (u32) $1 * 1; }
! 134: ;
! 135:
! 136: /* expr_u16: expr { check_u16($1); $$ = $1; }; */
! 137:
! 138: /* Switches */
! 139:
! 140: bool:
! 141: expr { $$ = !!$1; }
! 142: | ON { $$ = 1; }
! 143: | YES { $$ = 1; }
! 144: | OFF { $$ = 0; }
! 145: | NO { $$ = 0; }
! 146: | /* Silence means agreement */ { $$ = 1; }
! 147: ;
! 148:
! 149: /* Addresses, prefixes and netmasks */
! 150:
! 151: ipa:
! 152: IPA
! 153: | SYM {
! 154: if ($1->class != (SYM_CONSTANT | T_IP)) cf_error("IP address expected");
! 155: $$ = SYM_VAL($1).px.ip;
! 156: }
! 157: ;
! 158:
! 159: ipa_scope:
! 160: /* empty */ { $$ = NULL; }
! 161: | '%' SYM { $$ = if_get_by_name($2->name); }
! 162: ;
! 163:
! 164: prefix:
! 165: ipa pxlen {
! 166: if (!ip_is_prefix($1, $2)) cf_error("Invalid prefix");
! 167: $$.addr = $1; $$.len = $2;
! 168: }
! 169: ;
! 170:
! 171: prefix_or_ipa:
! 172: prefix
! 173: | ipa { $$.addr = $1; $$.len = BITS_PER_IP_ADDRESS; }
! 174: ;
! 175:
! 176: pxlen:
! 177: '/' expr {
! 178: if ($2 < 0 || $2 > BITS_PER_IP_ADDRESS) cf_error("Invalid prefix length %d", $2);
! 179: $$ = $2;
! 180: }
! 181: | ':' ipa {
! 182: $$ = ipa_masklen($2);
! 183: if ($$ < 0) cf_error("Invalid netmask %I", $2);
! 184: }
! 185: ;
! 186:
! 187: datetime:
! 188: TEXT {
! 189: $$ = tm_parse_datetime($1);
! 190: if (!$$)
! 191: cf_error("Invalid date and time");
! 192: }
! 193: ;
! 194:
! 195: text:
! 196: TEXT
! 197: | SYM {
! 198: if ($1->class != (SYM_CONSTANT | T_STRING)) cf_error("String expected");
! 199: $$ = SYM_VAL($1).s;
! 200: }
! 201: ;
! 202:
! 203: text_or_none:
! 204: TEXT { $$ = $1; }
! 205: | { $$ = NULL; }
! 206: ;
! 207:
! 208: CF_CODE
! 209:
! 210: CF_END
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>