detect interfaces that are going down (via rtnetlink)
[olsrd.git] / src / cfgparser / oscan.lex
1 %{
2
3 /*
4  * The olsr.org Optimized Link-State Routing daemon(olsrd)
5  * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without 
9  * modification, are permitted provided that the following conditions 
10  * are met:
11  *
12  * * Redistributions of source code must retain the above copyright 
13  *   notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above copyright 
15  *   notice, this list of conditions and the following disclaimer in 
16  *   the documentation and/or other materials provided with the 
17  *   distribution.
18  * * Neither the name of olsr.org, olsrd nor the names of its 
19  *   contributors may be used to endorse or promote products derived 
20  *   from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
26  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
30  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
32  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
33  * POSSIBILITY OF SUCH DAMAGE.
34  *
35  * Visit http://www.olsr.org for more information.
36  *
37  * If you find this software useful feel free to make a donation
38  * to the project. For more information see the website or contact
39  * the copyright holders.
40  *
41  */
42
43
44 #define YYSTYPE struct conf_token *
45
46 #include <stdio.h>
47 #include <stdlib.h>
48 #include <string.h>
49 #include <sys/types.h>
50 #include <sys/socket.h>
51 #include <netinet/in.h>
52 #include <arpa/inet.h>
53
54 #include "olsrd_conf.h"
55
56 #include "oparse.h"
57  
58 /* Prototypes */
59 int yyget_lineno(void);
60 FILE * yyget_in(void);
61 FILE* yyget_out(void);
62 int yyget_leng(void);
63 char *yyget_text(void);
64 void yyset_lineno(int);
65 void yyset_in(FILE *);
66 void yyset_out(FILE *);
67 int yyget_debug(void);
68 void yyset_debug(int);
69 int yylex_destroy(void);
70 int yylex(void);
71
72 static struct conf_token *get_conf_token(void);
73 static struct conf_token *get_string_token(const char * const s, const size_t n);
74 static struct conf_token *get_integer_token(const char * const s);
75 static struct conf_token *get_floating_token(const char * const s);
76 static struct conf_token *get_boolean_token(const bool b);
77
78 static struct conf_token *get_conf_token(void)
79 {
80     struct conf_token *t = calloc(1, sizeof(struct conf_token));
81     if (t == NULL) {
82         fprintf(stderr, "Cannot allocate %d bytes for an configuration token.\n", (int)sizeof(struct conf_token));
83     }
84     return t;
85 }
86
87 static struct conf_token *get_string_token(const char * const s, const size_t n)
88 {
89     struct conf_token *rv = get_conf_token();
90     if (rv != NULL) {
91         rv->string = malloc(n + 1);
92         if (rv->string == NULL) {
93           fprintf(stderr, "Cannot allocate %lu bytes for string token data.\n", (unsigned long)(n+1)); /* size_t on 64bit */
94             free(rv);
95             return NULL;
96         }
97         memcpy(rv->string, s, n);
98         rv->string[n] = '\0';
99     }
100     return rv;
101 }
102
103 static struct conf_token *get_integer_token(const char * const s)
104 {
105     struct conf_token *rv = get_conf_token();
106     if (rv != NULL) {
107         rv->integer = strtol(s, NULL, 0);
108     }
109     return rv;
110 }
111
112 static struct conf_token *get_floating_token(const char * const s)
113 {
114     struct conf_token *rv = get_conf_token();
115     if (rv != NULL) {
116         rv->floating = 0.0;
117         sscanf(s, "%f", &rv->floating);
118     }
119     return rv;
120 }
121
122 static struct conf_token *get_boolean_token(const bool b)
123 {
124     struct conf_token *rv = get_conf_token();
125     if (rv != NULL) {
126         rv->boolean = b;
127     }
128     return rv;
129 }
130
131 %}
132
133 %option never-interactive
134 %option noalways-interactive
135 %option nomain
136 %option nostack
137 %option noyywrap
138
139 DECDIGIT [0-9]
140 FLOAT {DECDIGIT}+\.{DECDIGIT}+
141 HEX8 [a-fA-F0-9]
142 QUAD {DECDIGIT}{1,3}
143
144 IPV4ADDR {QUAD}\.{QUAD}\.{QUAD}\.{QUAD}
145
146 HEX16 {HEX8}{1,4}
147
148 IP6PAT2 ({HEX16}:){1}:({HEX16}:){0,5}{HEX16}
149 IP6PAT3 ({HEX16}:){2}:({HEX16}:){0,4}{HEX16}
150 IP6PAT4 ({HEX16}:){3}:({HEX16}:){0,3}{HEX16}
151 IP6PAT5 ({HEX16}:){4}:({HEX16}:){0,2}{HEX16}
152 IP6PAT6 ({HEX16}:){5}:({HEX16}:){0,1}{HEX16}
153 IP6PAT7 ({HEX16}:){6}:({HEX16})
154 IP6PAT1 ({HEX16}:){7}{HEX16}
155 IP6PAT8 ({HEX16}:){1,7}:
156 IP6PAT9 ::
157
158 IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{IP6PAT8}|{IP6PAT9}
159
160 %%
161
162 \s*"#".*\n {
163     current_line++;
164     return TOK_COMMENT;
165 }
166
167 \/ {
168     yylval = NULL;
169     return TOK_SLASH;
170 }
171
172 \{ {
173     yylval = NULL;
174     return TOK_OPEN;
175 }
176
177 \} {
178     yylval = NULL;
179     return TOK_CLOSE;
180 }
181
182 \"[^\"]*\" {
183     yylval = get_string_token(yytext + 1, yyleng - 2);
184     if (yylval == NULL) {
185         yyterminate();
186     }
187     return TOK_STRING;
188 }
189
190 0x{HEX8}+ {
191     yylval = get_integer_token(yytext);
192     return TOK_INTEGER;
193 }
194
195 {FLOAT} {
196     yylval = get_floating_token(yytext);
197     return TOK_FLOAT;
198 }
199
200 {IPV4ADDR} {
201     yylval = get_string_token(yytext, yyleng + 1);
202     if (yylval == NULL) {
203         yyterminate();
204     }
205     return TOK_IP4_ADDR;
206 }
207 {IPV6ADDR} {
208     yylval = get_string_token(yytext, yyleng + 1);
209     if (yylval == NULL) {
210         yyterminate();
211     }
212     return TOK_IP6_ADDR;
213 }
214
215 "default" {
216     yylval = NULL;
217     return TOK_DEFAULT;
218 }
219
220 {DECDIGIT}+ {
221     yylval = get_integer_token(yytext);
222     return TOK_INTEGER;
223 }
224
225
226 "yes" {
227     yylval = get_boolean_token(true);
228     return TOK_BOOLEAN;
229 }
230
231 "no" {
232     yylval = get_boolean_token(false);
233     return TOK_BOOLEAN;
234 }
235
236 "site-local" {
237     yylval = get_boolean_token(true);
238     return TOK_IP6TYPE;
239 }
240
241 "global" {
242     yylval = get_boolean_token(false);
243     return TOK_IP6TYPE;
244 }
245
246 "Host" {
247     yylval = NULL;
248     return TOK_HOSTLABEL;
249 }
250
251 "Net" {
252     yylval = NULL;
253     return TOK_NETLABEL;
254 }
255
256 "MaxConnections" {
257     yylval = NULL;
258     return TOK_MAXIPC;
259 }
260
261 "DebugLevel" {
262     yylval = NULL;
263     return TOK_DEBUGLEVEL;
264 }
265
266 "IpVersion" {
267     yylval = NULL;
268     return TOK_IPVERSION;
269 }
270
271 "NicChgsPollInt" {
272     yylval = NULL;
273     return TOK_NICCHGSPOLLRT;
274 }
275
276 "Hna4" {
277     yylval = NULL;
278     return TOK_HNA4;
279 }
280
281 "Hna6" {
282     yylval = NULL;
283     return TOK_HNA6;
284 }
285
286 "LoadPlugin" {
287     yylval = NULL;
288     return TOK_PLUGIN;
289 }
290
291 "PlParam" {
292     yylval = NULL;
293     return TOK_PLPARAM;
294 }
295
296 "Interface" {
297     yylval = NULL;
298     return TOK_INTERFACE;
299 }
300
301 "AllowNoInt" {
302     yylval = NULL;
303     return TOK_NOINT;
304 }
305
306 "TosValue" {
307     yylval = NULL;
308     return TOK_TOS;
309 }
310
311
312 "OlsrPort" {
313   yylval = NULL;
314   return TOK_OLSRPORT;
315 }
316
317 "RtTable" {
318   yylval = NULL;
319   return TOK_RTTABLE;
320 }
321
322 "RtProto" {
323   yylval = NULL;
324   return TOK_RTPROTO;
325 }
326
327 "RtTableDefault" {
328   yylval = NULL;
329   return TOK_RTTABLE_DEFAULT;
330 }
331
332 "Willingness" {
333     yylval = NULL;
334     return TOK_WILLINGNESS;
335 }
336
337 "IpcConnect" {
338     yylval = NULL;
339     return TOK_IPCCON;
340 }
341
342 "FIBMetric" {
343     yylval = NULL;
344     return TOK_FIBMETRIC;
345 }
346
347 "UseHysteresis" {
348     yylval = NULL;
349     return TOK_USEHYST;
350 }
351
352 "HystScaling" {
353     yylval = NULL;
354     return TOK_HYSTSCALE;
355 }
356
357 "HystThrHigh" {
358     yylval = NULL;
359     return TOK_HYSTUPPER;
360 }
361
362 "HystThrLow" {
363     yylval = NULL;
364     return TOK_HYSTLOWER;
365 }
366
367 "Pollrate" {
368     yylval = NULL;
369     return TOK_POLLRATE;
370 }
371
372
373 "TcRedundancy" {
374     yylval = NULL;
375     return TOK_TCREDUNDANCY;
376 }
377
378 "MprCoverage" {
379     yylval = NULL;
380     return TOK_MPRCOVERAGE;
381 }
382
383 "LinkQualityLevel" {
384     yylval = NULL;
385     return TOK_LQ_LEVEL;
386 }
387
388 "LinkQualityFishEye" {
389     yylval = NULL;
390     return TOK_LQ_FISH;
391 }
392
393 "LinkQualityDijkstraLimit" {
394     yylval = NULL;
395     return TOK_LQ_DLIMIT;
396 }
397
398 "LinkQualityAging" {
399     yylval = NULL;
400     return TOK_LQ_AGING;
401 }
402
403 "LinkQualityAlgorithm" {
404     yylval = NULL;
405     return TOK_LQ_PLUGIN;
406 }
407
408 "LinkQualityWinSize" {
409     yylval = NULL;
410     return TOK_LQ_WSIZE;
411 }
412
413 "NatThreshold" {
414     yylval = NULL;
415     return TOK_LQ_NAT_THRESH;
416 }
417
418 "LinkQualityMult" {
419     yylval = NULL;
420     return TOK_LQ_MULT;
421 }
422
423 "MinTCVTime" {
424     yylval = NULL;
425     return TOK_MIN_TC_VTIME;
426 }
427
428 "LockFile" {
429     yylval = NULL;
430     return TOK_LOCK_FILE;
431 }
432
433 "ClearScreen" {
434     yylval = NULL;
435     return TOK_CLEAR_SCREEN;
436 }
437
438 "Weight" {
439     yylval = NULL;
440     return TOK_IFWEIGHT;
441 }
442
443 "Ip4Broadcast" {
444     yylval = NULL;
445     return TOK_IP4BROADCAST;
446 }
447 "Mode" {
448     yylval = NULL;
449     return TOK_IFMODE;
450 }
451 "Ip6AddrType" {
452     yylval = NULL;
453     return TOK_IP6ADDRTYPE;
454 }
455 "Ip6MulticastSite" {
456     yylval = NULL;
457     return TOK_IP6MULTISITE;
458 }
459 "Ip6MulticastGlobal" {
460     yylval = NULL;
461     return TOK_IP6MULTIGLOBAL;
462 }
463 "HelloInterval" {
464     yylval = NULL;
465     return TOK_HELLOINT;
466 }
467 "HelloValidityTime" {
468     yylval = NULL;
469     return TOK_HELLOVAL;
470 }
471 "TcInterval" {
472     yylval = NULL;
473     return TOK_TCINT;
474 }
475 "TcValidityTime" {
476     yylval = NULL;
477     return TOK_TCVAL;
478 }
479 "MidInterval" {
480     yylval = NULL;
481     return TOK_MIDINT;
482 }
483 "MidValidityTime" {
484     yylval = NULL;
485     return TOK_MIDVAL;
486 }
487 "HnaInterval" {
488     yylval = NULL;
489     return TOK_HNAINT;
490 }
491 "HnaValidityTime" {
492     yylval = NULL;
493     return TOK_HNAVAL;
494 }
495 "AutoDetectChanges" {
496     yylval = NULL;
497     return TOK_AUTODETCHG;
498 }
499
500
501 \n|\r\n {
502     current_line++;
503 }
504
505 \ |\t
506
507 . {
508   /* Do nothing */
509   //fprintf(stderr, "Failed to parse line %d of configuration file.\n",
510   //      current_line);
511   //yyterminate();
512   //yy_fatal_error("Parsing failed.\n");
513
514   /* To avoid compiler warning (stupid...) */
515   if(0)
516     yyunput(0, NULL);
517 }
518
519 %%