1/*	$NetBSD: policy_token.l,v 1.7 2007/07/18 12:07:50 vanhu Exp $	*/
2
3/* Id: policy_token.l,v 1.12 2005/05/05 12:32:18 manubsd Exp */
4
5/*
6 * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the project nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34%{
35#ifdef HAVE_CONFIG_H
36#include "config.h"
37#endif
38
39#include <sys/types.h>
40#include <sys/param.h>
41#include <sys/socket.h>
42#include <net/pfkeyv2.h>
43#include <netinet/in.h>
44#include PATH_IPSEC_H
45
46#include <stdlib.h>
47#include <limits.h>
48#include <string.h>
49#include <unistd.h>
50#include <errno.h>
51
52#include "libpfkey.h"
53
54#if !defined(__NetBSD__) && !defined(__FreeBSD__) && !defined(__linux__)  && \
55!defined(__APPLE__) && !defined(__MACH__)
56#include "y.tab.h"
57#else
58#include "policy_parse.h"
59#endif
60#define yylval __libipseclval	/* XXX */
61
62int yylex __P((void));
63%}
64
65%option noyywrap
66%option nounput
67%option noinput
68
69/* common section */
70nl		\n
71ws		[ \t]+
72digit		[0-9]
73hexdigit	[0-9A-Fa-f]
74special		[()+\|\?\*,]
75dot		\.
76comma		\,
77hyphen		\-
78colon		\:
79slash		\/
80bcl		\{
81ecl		\}
82blcl		\[
83elcl		\]
84percent		\%
85semi		\;
86plus	\+
87usec		{dot}{digit}{1,6}
88comment		\#.*
89ccomment	"/*"
90bracketstring	\<[^>]*\>
91quotedstring	\"[^"]*\"
92decstring	{digit}+
93hexpair		{hexdigit}{hexdigit}
94hexstring	0[xX]{hexdigit}+
95octetstring	{octet}({dot}{octet})+
96ipaddress	[a-zA-Z0-9:\._][a-zA-Z0-9:\._]*(%[a-zA-Z0-9]+)?
97
98%%
99
100in		{ yylval.num = IPSEC_DIR_INBOUND; return(DIR); }
101out		{ yylval.num = IPSEC_DIR_OUTBOUND; return(DIR); }
102fwd		{
103#ifdef HAVE_POLICY_FWD
104		  yylval.num = IPSEC_DIR_FWD; return(DIR);
105#else
106		  yylval.num = IPSEC_DIR_INBOUND; return(DIR);
107#endif
108		}
109
110priority	{ return(PRIORITY); }
111prio	{ return(PRIORITY); }
112low	{ yylval.num32 = PRIORITY_LOW; return(PRIO_BASE); }
113def { yylval.num32 = PRIORITY_DEFAULT; return(PRIO_BASE); }
114high	{ yylval.num32 = PRIORITY_HIGH; return(PRIO_BASE); }
115{plus}	{ return(PLUS); }
116{decstring}	{
117			yylval.val.len = strlen(yytext);
118			yylval.val.buf = yytext;
119			return(PRIO_OFFSET);
120}
121
122discard		{ yylval.num = IPSEC_POLICY_DISCARD; return(ACTION); }
123none		{ yylval.num = IPSEC_POLICY_NONE; return(ACTION); }
124ipsec		{ yylval.num = IPSEC_POLICY_IPSEC; return(ACTION); }
125bypass		{ yylval.num = IPSEC_POLICY_BYPASS; return(ACTION); }
126entrust		{ yylval.num = IPSEC_POLICY_ENTRUST; return(ACTION); }
127
128esp		{ yylval.num = IPPROTO_ESP; return(PROTOCOL); }
129ah		{ yylval.num = IPPROTO_AH; return(PROTOCOL); }
130ipcomp		{ yylval.num = IPPROTO_IPCOMP; return(PROTOCOL); }
131
132transport	{ yylval.num = IPSEC_MODE_TRANSPORT; return(MODE); }
133tunnel		{ yylval.num = IPSEC_MODE_TUNNEL; return(MODE); }
134
135me		{ return(ME); }
136any		{ return(ANY); }
137
138default		{ yylval.num = IPSEC_LEVEL_DEFAULT; return(LEVEL); }
139use		{ yylval.num = IPSEC_LEVEL_USE; return(LEVEL); }
140require		{ yylval.num = IPSEC_LEVEL_REQUIRE; return(LEVEL); }
141unique{colon}{decstring} {
142			yylval.val.len = strlen(yytext + 7);
143			yylval.val.buf = yytext + 7;
144			return(LEVEL_SPECIFY);
145		}
146unique		{ yylval.num = IPSEC_LEVEL_UNIQUE; return(LEVEL); }
147{slash}		{ return(SLASH); }
148
149{ipaddress}	{
150			yylval.val.len = strlen(yytext);
151			yylval.val.buf = yytext;
152			return(IPADDRESS);
153		}
154
155{hyphen}	{ return(HYPHEN); }
156
157{blcl}{decstring}{elcl} {
158			/* Remove leading '[' and trailing ']' */
159			yylval.val.buf = yytext + 1;
160			yylval.val.len = strlen(yytext) - 2;
161
162			return(PORT);
163		}
164
165{ws}		{ ; }
166{nl}		{ ; }
167
168%%
169
170void __policy__strbuffer__init__ __P((char *));
171void __policy__strbuffer__free__ __P((void));
172
173static YY_BUFFER_STATE strbuffer;
174
175void
176__policy__strbuffer__init__(msg)
177	char *msg;
178{
179	if (YY_CURRENT_BUFFER)
180		yy_delete_buffer(YY_CURRENT_BUFFER);
181	strbuffer = (YY_BUFFER_STATE)yy_scan_string(msg);
182	yy_switch_to_buffer(strbuffer);
183
184	return;
185}
186
187void
188__policy__strbuffer__free__()
189{
190	yy_delete_buffer(strbuffer);
191
192	return;
193}
194