1/*
2 *   $Id: scanner.l,v 1.18 2009/06/19 07:34:07 psavola Exp $
3 *
4 *   Authors:
5 *    Pedro Roque		<roque@di.fc.ul.pt>
6 *    Lars Fenneberg		<lf@elemental.net>
7 *
8 *   This software is Copyright 1996-2000 by the above mentioned author(s),
9 *   All Rights Reserved.
10 *
11 *   The license which is distributed with this software in the file COPYRIGHT
12 *   applies to this software. If your distribution is missing this file, you
13 *   may request it from <pekkas@netcore.fi>.
14 *
15 */
16%{
17#include <config.h>
18#include <includes.h>
19#include <radvd.h>
20#include <gram.h>
21
22extern char *conf_file;
23
24int num_lines = 1;
25%}
26
27digit		[0-9]
28number		({digit})+
29snum		-?({digit})+
30decimal		({number}"."{number})
31hexdigit	([a-f]|[A-F]|[0-9])
32addr1		{hexdigit}{1,4}":"({hexdigit}{1,4}":")*(":"{hexdigit}{1,4})+
33addr2		{hexdigit}{1,4}(":"{hexdigit}{1,4})*"::"
34addr3		({hexdigit}{1,4}":"){7}{hexdigit}{1,4}
35addr		({addr1}|{addr2}|{addr3}|"::")
36whitespace	([ \t])+
37string         [a-zA-Z0-9`~!@#$%\^&*()_\-+=:\[\]<>,\.?\\]{1,15}
38%%
39
40#.*$			{/* ignore comments */}
41\n			{num_lines++;}
42{whitespace}		{}
43
44interface		{ return T_INTERFACE; }
45prefix			{ return T_PREFIX; }
46route			{ return T_ROUTE; }
47RDNSS			{ return T_RDNSS; }
48clients			{ return T_CLIENTS; }
49
50IgnoreIfMissing		{ return T_IgnoreIfMissing; }
51AdvSendAdvert		{ return T_AdvSendAdvert; }
52MaxRtrAdvInterval	{ return T_MaxRtrAdvInterval; }
53MinRtrAdvInterval	{ return T_MinRtrAdvInterval; }
54AdvManagedFlag		{ return T_AdvManagedFlag; }
55AdvOtherConfigFlag	{ return T_AdvOtherConfigFlag; }
56AdvLinkMTU		{ return T_AdvLinkMTU; }
57AdvReachableTime	{ return T_AdvReachableTime; }
58AdvRetransTimer		{ return T_AdvRetransTimer; }
59AdvCurHopLimit		{ return T_AdvCurHopLimit; }
60AdvDefaultLifetime	{ return T_AdvDefaultLifetime; }
61AdvDefaultPreference	{ return T_AdvDefaultPreference; }
62AdvSourceLLAddress	{ return T_AdvSourceLLAddress; }
63
64AdvOnLink		{ return T_AdvOnLink; }
65AdvAutonomous		{ return T_AdvAutonomous; }
66AdvValidLifetime	{ return T_AdvValidLifetime; }
67AdvPreferredLifetime	{ return T_AdvPreferredLifetime; }
68
69AdvRouterAddr		{ return T_AdvRouterAddr; }
70AdvHomeAgentFlag	{ return T_AdvHomeAgentFlag; }
71AdvIntervalOpt		{ return T_AdvIntervalOpt; }
72AdvHomeAgentInfo	{ return T_AdvHomeAgentInfo; }
73UnicastOnly		{ return T_UnicastOnly; }
74
75Base6to4Interface	{ return T_Base6to4Interface; }
76
77HomeAgentPreference	{ return T_HomeAgentPreference; }
78HomeAgentLifetime	{ return T_HomeAgentLifetime; }
79
80AdvRoutePreference	{ return T_AdvRoutePreference; }
81AdvRouteLifetime	{ return T_AdvRouteLifetime; }
82
83AdvRDNSSPreference 	{ return T_AdvRDNSSPreference; }
84AdvRDNSSOpen		{ return T_AdvRDNSSOpenFlag; }
85AdvRDNSSLifetime	{ return T_AdvRDNSSLifetime; }
86
87MinDelayBetweenRAs      { return T_MinDelayBetweenRAs; }
88
89AdvMobRtrSupportFlag	{ return T_AdvMobRtrSupportFlag; }
90
91{addr}		{
92			static struct in6_addr addr;
93			if (inet_pton(AF_INET6, yytext, &addr) < 1) {
94				flog(LOG_ERR, "invalid address in %s, line %d", conf_file,
95					num_lines);
96				return T_BAD_TOKEN;
97			}
98
99			yylval.addr = &addr;
100			return IPV6ADDR;
101		}
102
103{number}	{
104			unsigned long lnum;
105			char *endp;
106			lnum = strtoul(yytext, &endp, 10);
107			if (*yytext == '\0' || *endp != '\0')
108				return T_BAD_TOKEN;
109			if (lnum > 0xFFFFFFFFUL)
110				return T_BAD_TOKEN;	/* XXX */
111			yylval.num = lnum;
112			return NUMBER;
113		}
114
115{snum}		{ yylval.snum = atoi(yytext); return SIGNEDNUMBER; }
116
117{decimal}	{ yylval.dec = atof(yytext); return DECIMAL; }
118
119infinity	{ return INFINITY; }
120
121on			{ yylval.num = 1; return SWITCH; }
122
123off			{ yylval.num = 0; return SWITCH; }
124
125low		{ yylval.snum = -1; return SIGNEDNUMBER; }
126
127medium		{ yylval.snum = 0; return SIGNEDNUMBER; }
128
129high		{ yylval.snum = 1; return SIGNEDNUMBER; }
130
131{string}	{
132			static char name[IFNAMSIZ];
133
134			strncpy(name, yytext, IFNAMSIZ-1);
135			name[IFNAMSIZ-1] = '\0';
136			yylval.str = name;
137			return STRING;
138		}
139
140"{"|"}"|";"|"/"	{ return *yytext; }
141
142.		{ return T_BAD_TOKEN; }
143%%
144