Annotation of embedaddon/bird/conf/confbase.Y, revision 1.1.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>