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