xref: /freebsd/usr.sbin/rrenumd/lexer.l (revision 33841545909f4a4ee94aa148b3a9cbcdc1abb02a)
133841545SHajimu UMEMOTO /*	$KAME: lexer.l,v 1.7 2000/11/08 02:40:53 itojun Exp $	*/
2434d523bSKris Kennaway 
39a4365d0SYoshinobu Inoue /*
49a4365d0SYoshinobu Inoue  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
59a4365d0SYoshinobu Inoue  * All rights reserved.
69a4365d0SYoshinobu Inoue  *
79a4365d0SYoshinobu Inoue  * Redistribution and use in source and binary forms, with or without
89a4365d0SYoshinobu Inoue  * modification, are permitted provided that the following conditions
99a4365d0SYoshinobu Inoue  * are met:
109a4365d0SYoshinobu Inoue  * 1. Redistributions of source code must retain the above copyright
119a4365d0SYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer.
129a4365d0SYoshinobu Inoue  * 2. Redistributions in binary form must reproduce the above copyright
139a4365d0SYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer in the
149a4365d0SYoshinobu Inoue  *    documentation and/or other materials provided with the distribution.
159a4365d0SYoshinobu Inoue  * 3. Neither the name of the project nor the names of its contributors
169a4365d0SYoshinobu Inoue  *    may be used to endorse or promote products derived from this software
179a4365d0SYoshinobu Inoue  *    without specific prior written permission.
189a4365d0SYoshinobu Inoue  *
199a4365d0SYoshinobu Inoue  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
209a4365d0SYoshinobu Inoue  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
219a4365d0SYoshinobu Inoue  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
229a4365d0SYoshinobu Inoue  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
239a4365d0SYoshinobu Inoue  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
249a4365d0SYoshinobu Inoue  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
259a4365d0SYoshinobu Inoue  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
269a4365d0SYoshinobu Inoue  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
279a4365d0SYoshinobu Inoue  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
289a4365d0SYoshinobu Inoue  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
299a4365d0SYoshinobu Inoue  * SUCH DAMAGE.
309a4365d0SYoshinobu Inoue  *
319a4365d0SYoshinobu Inoue  * $FreeBSD$
329a4365d0SYoshinobu Inoue  */
339a4365d0SYoshinobu Inoue 
349a4365d0SYoshinobu Inoue %{
3533841545SHajimu UMEMOTO #define YY_NO_UNPUT
3633841545SHajimu UMEMOTO 
379a4365d0SYoshinobu Inoue #include <sys/param.h>
389a4365d0SYoshinobu Inoue #include <sys/ioctl.h>
399a4365d0SYoshinobu Inoue #include <sys/socket.h>
4033841545SHajimu UMEMOTO #include <sys/queue.h>
419a4365d0SYoshinobu Inoue 
429a4365d0SYoshinobu Inoue #include <string.h>
439a4365d0SYoshinobu Inoue 
449a4365d0SYoshinobu Inoue #include <net/if.h>
45434d523bSKris Kennaway #if defined(__FreeBSD__) && __FreeBSD__ >= 3
469a4365d0SYoshinobu Inoue #include <net/if_var.h>
47434d523bSKris Kennaway #endif /* __FreeBSD__ >= 3 */
489a4365d0SYoshinobu Inoue 
499a4365d0SYoshinobu Inoue #include <netinet/in.h>
509a4365d0SYoshinobu Inoue #include <netinet/in_var.h>
519a4365d0SYoshinobu Inoue #include <netinet/icmp6.h>
52434d523bSKris Kennaway 
53434d523bSKris Kennaway #include <arpa/inet.h>
54434d523bSKris Kennaway 
559a4365d0SYoshinobu Inoue #include "y.tab.h"
569a4365d0SYoshinobu Inoue 
579a4365d0SYoshinobu Inoue int lineno = 1;
589a4365d0SYoshinobu Inoue 
599a4365d0SYoshinobu Inoue #define LINEBUF_SIZE 1000
609a4365d0SYoshinobu Inoue char linebuf[LINEBUF_SIZE];
6133841545SHajimu UMEMOTO 
6233841545SHajimu UMEMOTO int parse __P((FILE **));
6333841545SHajimu UMEMOTO void yyerror __P((const char *));
6433841545SHajimu UMEMOTO int yylex __P((void));
659a4365d0SYoshinobu Inoue %}
669a4365d0SYoshinobu Inoue 
679a4365d0SYoshinobu Inoue /* common section */
689a4365d0SYoshinobu Inoue nl		\n
699a4365d0SYoshinobu Inoue ws		[ \t]+
709a4365d0SYoshinobu Inoue digit		[0-9]
719a4365d0SYoshinobu Inoue letter		[0-9A-Za-z]
729a4365d0SYoshinobu Inoue hexdigit	[0-9A-Fa-f]
739a4365d0SYoshinobu Inoue special		[()+\|\?\*,]
749a4365d0SYoshinobu Inoue dot		\.
759a4365d0SYoshinobu Inoue hyphen		\-
769a4365d0SYoshinobu Inoue colon		\:
779a4365d0SYoshinobu Inoue slash		\/
789a4365d0SYoshinobu Inoue bcl		\{
799a4365d0SYoshinobu Inoue ecl		\}
809a4365d0SYoshinobu Inoue semi		\;
819a4365d0SYoshinobu Inoue usec		{dot}{digit}{1,6}
829a4365d0SYoshinobu Inoue comment		\#.*
839a4365d0SYoshinobu Inoue qstring		\"[^"]*\"
849a4365d0SYoshinobu Inoue decstring	{digit}+
859a4365d0SYoshinobu Inoue hexpair		{hexdigit}{hexdigit}
869a4365d0SYoshinobu Inoue hexstring	0[xX]{hexdigit}+
879a4365d0SYoshinobu Inoue octetstring	{octet}({dot}{octet})+
889a4365d0SYoshinobu Inoue ipv4addr	{digit}{1,3}({dot}{digit}{1,3}){0,3}
899a4365d0SYoshinobu Inoue ipv6addr	{hexdigit}{0,4}({colon}{hexdigit}{0,4}){2,7}
909a4365d0SYoshinobu Inoue ipaddrmask	{slash}{digit}{1,3}
919a4365d0SYoshinobu Inoue keyword		{letter}{letter}+
929a4365d0SYoshinobu Inoue name		{letter}(({letter}|{digit}|{hyphen})*({letter}|{digit}))*
939a4365d0SYoshinobu Inoue hostname	{name}(({dot}{name})+{dot}?)?
949a4365d0SYoshinobu Inoue 
959a4365d0SYoshinobu Inoue timeval		{digit}{0,2}
969a4365d0SYoshinobu Inoue days		d{timeval}
979a4365d0SYoshinobu Inoue hours		h{timeval}
989a4365d0SYoshinobu Inoue minutes		m{timeval}
999a4365d0SYoshinobu Inoue seconds		s{timeval}
1009a4365d0SYoshinobu Inoue 
1019a4365d0SYoshinobu Inoue mprefix		match_prefix|match-prefix
1029a4365d0SYoshinobu Inoue uprefix		use_prefix|use-prefix
1039a4365d0SYoshinobu Inoue 
1049a4365d0SYoshinobu Inoue %%
1059a4365d0SYoshinobu Inoue 	/* rrenumd keywords */
1069a4365d0SYoshinobu Inoue debug		{
1079a4365d0SYoshinobu Inoue 			return(DEBUG_CMD);
1089a4365d0SYoshinobu Inoue 		}
1099a4365d0SYoshinobu Inoue dest		{
1109a4365d0SYoshinobu Inoue 			return(DEST_CMD);
1119a4365d0SYoshinobu Inoue 		}
1129a4365d0SYoshinobu Inoue retry		{
1139a4365d0SYoshinobu Inoue 			return(RETRY_CMD);
1149a4365d0SYoshinobu Inoue 		}
1159a4365d0SYoshinobu Inoue seqnum		{
1169a4365d0SYoshinobu Inoue 			return(SEQNUM_CMD);
1179a4365d0SYoshinobu Inoue 		}
1189a4365d0SYoshinobu Inoue add		{
1199a4365d0SYoshinobu Inoue 			yylval.num = RPM_PCO_ADD;
1209a4365d0SYoshinobu Inoue 			return(ADD);
1219a4365d0SYoshinobu Inoue 		}
1229a4365d0SYoshinobu Inoue change		{
1239a4365d0SYoshinobu Inoue 			yylval.num = RPM_PCO_CHANGE;
1249a4365d0SYoshinobu Inoue 			return(CHANGE);
1259a4365d0SYoshinobu Inoue 		 }
1269a4365d0SYoshinobu Inoue setglobal	{
1279a4365d0SYoshinobu Inoue 			yylval.num = RPM_PCO_SETGLOBAL;
1289a4365d0SYoshinobu Inoue 			return(SETGLOBAL);
1299a4365d0SYoshinobu Inoue 		}
1309a4365d0SYoshinobu Inoue {mprefix}	{
1319a4365d0SYoshinobu Inoue 			return(MATCH_PREFIX_CMD);
1329a4365d0SYoshinobu Inoue 		}
1339a4365d0SYoshinobu Inoue maxlen		{
1349a4365d0SYoshinobu Inoue 			return(MAXLEN_CMD);
1359a4365d0SYoshinobu Inoue 		}
1369a4365d0SYoshinobu Inoue minlen		{
1379a4365d0SYoshinobu Inoue 			return(MINLEN_CMD);
1389a4365d0SYoshinobu Inoue 		}
1399a4365d0SYoshinobu Inoue {uprefix}	{
1409a4365d0SYoshinobu Inoue 			return(USE_PREFIX_CMD);
1419a4365d0SYoshinobu Inoue 		}
1429a4365d0SYoshinobu Inoue keeplen		{
1439a4365d0SYoshinobu Inoue 			return(KEEPLEN_CMD);
1449a4365d0SYoshinobu Inoue 		}
1459a4365d0SYoshinobu Inoue 
1469a4365d0SYoshinobu Inoue vltime		{
1479a4365d0SYoshinobu Inoue 			return(VLTIME_CMD);
1489a4365d0SYoshinobu Inoue 		}
1499a4365d0SYoshinobu Inoue pltime		{
1509a4365d0SYoshinobu Inoue 			return(PLTIME_CMD);
1519a4365d0SYoshinobu Inoue 		}
1529a4365d0SYoshinobu Inoue raf_onlink	{
1539a4365d0SYoshinobu Inoue 			return(RAF_ONLINK_CMD);
1549a4365d0SYoshinobu Inoue 		}
1559a4365d0SYoshinobu Inoue raf_auto	{
1569a4365d0SYoshinobu Inoue 			return(RAF_AUTO_CMD);
1579a4365d0SYoshinobu Inoue 		}
1589a4365d0SYoshinobu Inoue rrf_decrvalid	{
1599a4365d0SYoshinobu Inoue 			return(RAF_DECRVALID_CMD);
1609a4365d0SYoshinobu Inoue 		}
1619a4365d0SYoshinobu Inoue rrf_decrprefd	{
1629a4365d0SYoshinobu Inoue 			return(RAF_DECRPREFD_CMD);
1639a4365d0SYoshinobu Inoue 		}
1649a4365d0SYoshinobu Inoue {days}		{
1659a4365d0SYoshinobu Inoue 			yytext++;
1669a4365d0SYoshinobu Inoue 			yylval.num = atoi(yytext);
1679a4365d0SYoshinobu Inoue 			return(DAYS);
1689a4365d0SYoshinobu Inoue 		}
1699a4365d0SYoshinobu Inoue {hours}		{
1709a4365d0SYoshinobu Inoue 			yytext++;
1719a4365d0SYoshinobu Inoue 			yylval.num = atoi(yytext);
1729a4365d0SYoshinobu Inoue 			return(HOURS);
1739a4365d0SYoshinobu Inoue 		}
1749a4365d0SYoshinobu Inoue {minutes}	{
1759a4365d0SYoshinobu Inoue 			yytext++;
1769a4365d0SYoshinobu Inoue 			yylval.num = atoi(yytext);
1779a4365d0SYoshinobu Inoue 			return(MINUTES);
1789a4365d0SYoshinobu Inoue 		}
1799a4365d0SYoshinobu Inoue {seconds}	{
1809a4365d0SYoshinobu Inoue 			yytext++;
1819a4365d0SYoshinobu Inoue 			yylval.num = atoi(yytext);
1829a4365d0SYoshinobu Inoue 			return(SECONDS);
1839a4365d0SYoshinobu Inoue 		}
1849a4365d0SYoshinobu Inoue infinity	{
1859a4365d0SYoshinobu Inoue 			return(INFINITY);
1869a4365d0SYoshinobu Inoue 		}
1879a4365d0SYoshinobu Inoue 
1889a4365d0SYoshinobu Inoue on		{
1899a4365d0SYoshinobu Inoue 			yylval.num = 1;
1909a4365d0SYoshinobu Inoue 			return(ON);
1919a4365d0SYoshinobu Inoue 		}
1929a4365d0SYoshinobu Inoue off		{
1939a4365d0SYoshinobu Inoue 			yylval.num = 0;
1949a4365d0SYoshinobu Inoue 			return(OFF);
1959a4365d0SYoshinobu Inoue 		}
1969a4365d0SYoshinobu Inoue 
1979a4365d0SYoshinobu Inoue 	/* basic rules */
1989a4365d0SYoshinobu Inoue {ws}		;
1999a4365d0SYoshinobu Inoue {nl}		{
2009a4365d0SYoshinobu Inoue 			lineno++;
2019a4365d0SYoshinobu Inoue 		}
2029a4365d0SYoshinobu Inoue {semi}		{
2039a4365d0SYoshinobu Inoue 			return EOS;
2049a4365d0SYoshinobu Inoue 		}
2059a4365d0SYoshinobu Inoue {bcl}		{
2069a4365d0SYoshinobu Inoue 			return BCL;
2079a4365d0SYoshinobu Inoue 		}
2089a4365d0SYoshinobu Inoue {ecl}		{
2099a4365d0SYoshinobu Inoue 			return ECL;
2109a4365d0SYoshinobu Inoue 		}
2119a4365d0SYoshinobu Inoue {qstring}	{
2129a4365d0SYoshinobu Inoue 			yylval.cs.cp = yytext;
2139a4365d0SYoshinobu Inoue 			yylval.cs.len = yyleng;
2149a4365d0SYoshinobu Inoue 			return QSTRING;
2159a4365d0SYoshinobu Inoue 		}
2169a4365d0SYoshinobu Inoue {decstring}	{
2179a4365d0SYoshinobu Inoue 			yylval.cs.cp = yytext;
2189a4365d0SYoshinobu Inoue 			yylval.cs.len = yyleng;
2199a4365d0SYoshinobu Inoue 			return DECSTRING;
2209a4365d0SYoshinobu Inoue 		}
2219a4365d0SYoshinobu Inoue {name}		{
2229a4365d0SYoshinobu Inoue 			yylval.cs.cp = yytext;
2239a4365d0SYoshinobu Inoue 			yylval.cs.len = yyleng;
2249a4365d0SYoshinobu Inoue 			return NAME;
2259a4365d0SYoshinobu Inoue 		}
226434d523bSKris Kennaway {ipv4addr}	{
227434d523bSKris Kennaway 			memset(&yylval.addr4, 0, sizeof(struct in_addr));
228434d523bSKris Kennaway 			if (inet_pton(AF_INET, yytext,
229434d523bSKris Kennaway 				      &yylval.addr4) == 1) {
230434d523bSKris Kennaway 				return IPV4ADDR;
231434d523bSKris Kennaway 			} else {
232434d523bSKris Kennaway 				return ERROR;
233434d523bSKris Kennaway 			}
234434d523bSKris Kennaway 		}
2359a4365d0SYoshinobu Inoue {ipv6addr}	{
2369a4365d0SYoshinobu Inoue 			memset(&yylval.addr6, 0, sizeof(struct in6_addr));
2379a4365d0SYoshinobu Inoue 			if (inet_pton(AF_INET6, yytext,
2389a4365d0SYoshinobu Inoue 				      &yylval.addr6) == 1) {
2399a4365d0SYoshinobu Inoue 				return IPV6ADDR;
2409a4365d0SYoshinobu Inoue 			} else {
2419a4365d0SYoshinobu Inoue 				return ERROR;
2429a4365d0SYoshinobu Inoue 			}
2439a4365d0SYoshinobu Inoue 		}
2449a4365d0SYoshinobu Inoue {ipaddrmask}	{
2459a4365d0SYoshinobu Inoue 			yytext++;
2469a4365d0SYoshinobu Inoue 			yylval.num = atoi(yytext);
2479a4365d0SYoshinobu Inoue 			return(PREFIXLEN);
2489a4365d0SYoshinobu Inoue 		}
2499a4365d0SYoshinobu Inoue {hostname}	{
2509a4365d0SYoshinobu Inoue 			yylval.cs.cp = yytext;
2519a4365d0SYoshinobu Inoue 			yylval.cs.len = yyleng;
2529a4365d0SYoshinobu Inoue 			return HOSTNAME;
2539a4365d0SYoshinobu Inoue 		}
2549a4365d0SYoshinobu Inoue %%
2559a4365d0SYoshinobu Inoue 
2569a4365d0SYoshinobu Inoue int parse(FILE **fp)
2579a4365d0SYoshinobu Inoue {
25833841545SHajimu UMEMOTO 	extern int yyparse __P((void));
25933841545SHajimu UMEMOTO 
2609a4365d0SYoshinobu Inoue 	yyin = *fp;
2619a4365d0SYoshinobu Inoue 
2629a4365d0SYoshinobu Inoue 	if (yyparse())
2639a4365d0SYoshinobu Inoue 		return(-1);
2649a4365d0SYoshinobu Inoue 
2659a4365d0SYoshinobu Inoue 	return(0);
2669a4365d0SYoshinobu Inoue 
2679a4365d0SYoshinobu Inoue }
2689a4365d0SYoshinobu Inoue 
2699a4365d0SYoshinobu Inoue void
2709a4365d0SYoshinobu Inoue yyerror(const char *s)
2719a4365d0SYoshinobu Inoue {
2729a4365d0SYoshinobu Inoue 	printf("%s: at %s in line %d\n", s, yytext, lineno);
2739a4365d0SYoshinobu Inoue }
274