iplang_l.l revision 31183
1%e 1500
2%p 4000
3%a 4000
4%o 6000
5%{
6/*
7 * Copyright (C) 1997 by Darren Reed.
8 *
9 * Redistribution and use in source and binary forms are permitted
10 * provided that this notice is preserved and due credit is given
11 * to the original author and the contributors.
12 *
13 * $Id: iplang_l.l,v 2.0.2.15.2.1 1997/11/05 11:04:04 darrenr Exp $
14 */
15#include <stdio.h>
16#include <string.h>
17#include <sys/param.h>
18#if defined(__SVR4) || defined(__sysv__)
19#include <sys/stream.h>
20#endif
21#include <sys/types.h>
22#include <netinet/in_systm.h>
23#include <netinet/in.h>
24#include "y.tab.h"
25#include "ip_compat.h"
26#include "ipf.h"
27
28#ifndef	__P
29# ifdef __STDC__
30#  define	__P(x)	x
31# else
32#  define	__P(x)	()
33# endif
34#endif
35
36extern int opts;
37
38int lineNum = 0, proto = 0, oldproto = 0, next = -1, laststate = 0;
39int *prstack = NULL, numpr = 0, state = 0, token = 0;
40
41void    yyerror __P((char *));
42void	push_proto __P((void));
43void	pop_proto __P((void));
44int	next_state __P((int, int));
45int	next_item __P((int));
46int	save_token __P((void));
47void	swallow __P((void));
48int	yylex __P((void));
49%}
50
51%%
52[ \t\r]	;
53\n	{ lineNum++; swallow(); }
54interface |
55iface	{ return next_state(IL_INTERFACE, -1); }
56name |
57ifname	{ return next_state(IL_IFNAME, IL_TOKEN); }
58router	{ return next_state(IL_DEFROUTER, IL_TOKEN); }
59mtu 	{ return next_state(IL_MTU, IL_NUMBER); }
60eaddr	{ return next_state(IL_EADDR, IL_TOKEN); }
61v4addr	{ return next_state(IL_V4ADDR, IL_TOKEN); }
62ipv4	{ return next_state(IL_IPV4, -1); }
63v	{ return next_state(IL_V4V, IL_TOKEN); }
64proto	{ return next_state(IL_V4PROTO, IL_TOKEN); }
65hl	{ return next_state(IL_V4HL, IL_TOKEN); }
66id	{ return next_state(IL_V4ID, IL_TOKEN); }
67ttl	{ return next_state(IL_V4TTL, IL_TOKEN); }
68tos	{ return next_state(IL_V4TOS, IL_TOKEN); }
69src	{ return next_state(IL_V4SRC, IL_TOKEN); }
70dst	{ return next_state(IL_V4DST, IL_TOKEN); }
71opt	{ return next_state(IL_OPT, -1); }
72len	{ return next_state(IL_LEN, IL_TOKEN); }
73off	{ return next_state(IL_OFF, IL_TOKEN); }
74sum	{ return next_state(IL_SUM, IL_TOKEN); }
75tcp	{ return next_state(IL_TCP, -1); }
76sport	{ return next_state(IL_SPORT, IL_TOKEN); }
77dport	{ return next_state(IL_DPORT, IL_TOKEN); }
78seq	{ return next_state(IL_TCPSEQ, IL_TOKEN); }
79ack	{ return next_state(IL_TCPACK, IL_TOKEN); }
80flags	{ return next_state(IL_TCPFL, IL_TOKEN); }
81urp	{ return next_state(IL_TCPURP, IL_TOKEN); }
82win	{ return next_state(IL_TCPWIN, IL_TOKEN); }
83udp	{ return next_state(IL_UDP, -1); }
84send	{ return next_state(IL_SEND, -1); }
85via	{ return next_state(IL_VIA, IL_TOKEN); }
86arp	{ return next_state(IL_ARP, -1); }
87data	{ return next_state(IL_DATA, -1); }
88value	{ return next_state(IL_DVALUE, IL_TOKEN); }
89file	{ return next_state(IL_DFILE, IL_TOKEN); }
90nop	{ return next_state(IL_IPO_NOP, -1); }
91eol	{ return next_state(IL_IPO_EOL, -1); }
92rr	{ return next_state(IL_IPO_RR, -1);  }
93zsu	{ return next_state(IL_IPO_ZSU, -1); }
94mtup	{ return next_state(IL_IPO_MTUP, -1); }
95mtur	{ return next_state(IL_IPO_MTUR, -1); }
96encode	{ return next_state(IL_IPO_ENCODE, -1); }
97ts	{ return next_state(IL_IPO_TS, -1); }
98tr	{ return next_state(IL_IPO_TR, -1); }
99sec	{ return next_state(IL_IPO_SEC, -1); }
100secclass	{ return next_state(IL_IPO_SECCLASS, IL_TOKEN); }
101lsrr	{ return next_state(IL_IPO_LSRR, -1); }
102esec	{ return next_state(IL_IPO_ESEC, -1); }
103cipso	{ return next_state(IL_IPO_CIPSO, -1); }
104satid	{ return next_state(IL_IPO_SATID, -1); }
105ssrr	{ return next_state(IL_IPO_SSRR, -1); }
106addext	{ return next_state(IL_IPO_ADDEXT, -1); }
107visa	{ return next_state(IL_IPO_VISA, -1); }
108imitd	{ return next_state(IL_IPO_IMITD, -1); }
109eip	{ return next_state(IL_IPO_EIP, -1); }
110finn	{ return next_state(IL_IPO_FINN, -1); }
111mss	{ return next_state(IL_TCPO_MSS, IL_TOKEN); }
112wscale	{ return next_state(IL_TCPO_MSS, IL_TOKEN); }
113reserv-4	{ return next_state(IL_IPS_RESERV4, -1); }
114topsecret	{ return next_state(IL_IPS_TOPSECRET, -1); }
115secret		{ return next_state(IL_IPS_SECRET, -1); }
116reserv-3	{ return next_state(IL_IPS_RESERV3, -1); }
117confid		{ return next_state(IL_IPS_CONFID, -1); }
118unclass		{ return next_state(IL_IPS_UNCLASS, -1); }
119reserv-2	{ return next_state(IL_IPS_RESERV2, -1); }
120reserv-1	{ return next_state(IL_IPS_RESERV1, -1); }
121icmp		{ return next_state(IL_ICMP, -1); }
122type		{ return next_state(IL_ICMPTYPE, -1); }
123code		{ return next_state(IL_ICMPCODE, -1); }
124echorep		{ return next_state(IL_ICMP_ECHOREPLY, -1); }
125unreach		{ return next_state(IL_ICMP_UNREACH, -1); }
126squench		{ return next_state(IL_ICMP_SOURCEQUENCH, -1); }
127redir		{ return next_state(IL_ICMP_REDIRECT, -1); }
128echo		{ return next_state(IL_ICMP_ECHO, -1); }
129routerad	{ return next_state(IL_ICMP_ROUTERADVERT, -1); }
130routersol	{ return next_state(IL_ICMP_ROUTERSOLICIT, -1); }
131timex		{ return next_state(IL_ICMP_TIMXCEED, -1); }
132paramprob	{ return next_state(IL_ICMP_PARAMPROB, -1); }
133timest		{ return next_state(IL_ICMP_TSTAMP, -1); }
134timestrep	{ return next_state(IL_ICMP_TSTAMPREPLY, -1); }
135inforeq		{ return next_state(IL_ICMP_IREQ, -1); }
136inforep		{ return next_state(IL_ICMP_IREQREPLY, -1); }
137maskreq		{ return next_state(IL_ICMP_MASKREQ, -1); }
138maskrep		{ return next_state(IL_ICMP_MASKREPLY, -1); }
139net-unr		{ return next_state(IL_ICMP_UNREACH_NET, -1); }
140host-unr	{ return next_state(IL_ICMP_UNREACH_HOST, -1); }
141proto-unr	{ return next_state(IL_ICMP_UNREACH_PROTOCOL, -1); }
142port-unr	{ return next_state(IL_ICMP_UNREACH_PORT, -1); }
143needfrag	{ return next_state(IL_ICMP_UNREACH_NEEDFRAG, -1); }
144srcfail		{ return next_state(IL_ICMP_UNREACH_SRCFAIL, -1); }
145net-unk		{ return next_state(IL_ICMP_UNREACH_NET_UNKNOWN, -1); }
146host-unk	{ return next_state(IL_ICMP_UNREACH_HOST_UNKNOWN, -1); }
147isolate		{ return next_state(IL_ICMP_UNREACH_ISOLATED, -1); }
148net-prohib	{ return next_state(IL_ICMP_UNREACH_NET_PROHIB, -1); }
149host-prohib	{ return next_state(IL_ICMP_UNREACH_HOST_PROHIB, -1); }
150net-tos		{ return next_state(IL_ICMP_UNREACH_TOSNET, -1); }
151host-tos	{ return next_state(IL_ICMP_UNREACH_TOSHOST, -1); }
152filter-prohib	{ return next_state(IL_ICMP_UNREACH_FILTER_PROHIB, -1); }
153host-preced	{ return next_state(IL_ICMP_UNREACH_HOST_PRECEDENCE, -1); }
154cutoff-preced	{ return next_state(IL_ICMP_UNREACH_PRECEDENCE_CUTOFF, -1); }
155net-redir	{ return next_state(IL_ICMP_REDIRECT_NET, -1); }
156host-redir	{ return next_state(IL_ICMP_REDIRECT_HOST, -1); }
157tos-net-redir	{ return next_state(IL_ICMP_REDIRECT_TOSNET, -1); }
158tos-host-redir	{ return next_state(IL_ICMP_REDIRECT_TOSHOST, -1); }
159intrans		{ return next_state(IL_ICMP_TIMXCEED_INTRANS, -1); }
160reass		{ return next_state(IL_ICMP_TIMXCEED_REASS, -1); }
161optabsent	{ return next_state(IL_ICMP_PARAMPROB_OPTABSENT, -1); }
162otime		{ return next_state(IL_ICMP_OTIME, -1); }
163rtime		{ return next_state(IL_ICMP_RTIME, -1); }
164ttime		{ return next_state(IL_ICMP_TTIME, -1); }
165icmpseq		{ return next_state(IL_ICMP_SEQ, -1); }
166icmpid		{ return next_state(IL_ICMP_SEQ, -1); }
167\{	{ push_proto(); return next_item('{'); }
168\}	{ pop_proto(); return next_item('}'); }
169\.	{ return next_item(IL_DOT); }
170;	{ return next_item(';'); }
171[0-9]+	{ return next_item(IL_NUMBER); }
172[0-9a-fA-F]	{ return next_item(IL_HEXDIGIT); }
173:	{ return next_item(IL_COLON); }
174#[^\n]*	{ return next_item(IL_COMMENT); }
175[^ {}\n\t;]*	{ return next_item(IL_TOKEN); }
176\"[^\"]*\"	{ return next_item(IL_TOKEN); }
177%%
178void    yyerror(msg)
179char    *msg;
180{
181	fprintf(stderr, "%s error at \"%s\", line %d\n", msg, yytext,
182		lineNum + 1);
183	exit(1);
184}
185
186
187void push_proto()
188{
189	numpr++;
190	if (!prstack)
191		prstack = (int *)malloc(sizeof(int));
192	else
193		prstack = (int *)realloc((char *)prstack, numpr * sizeof(int));
194	prstack[numpr - 1] = oldproto;
195}
196
197
198void pop_proto()
199{
200	numpr--;
201	proto = prstack[numpr];
202	if (!numpr) {
203		free(prstack);
204		prstack = NULL;
205		return;
206	}
207	prstack = (int *)realloc((char *)prstack, numpr * sizeof(int));
208}
209
210
211int save_token()
212{
213	static char *buf = NULL;
214
215	if (buf && (buf == yylval.str))
216		free(buf);
217	buf = yylval.str = strdup(yytext);
218	return IL_TOKEN;
219}
220
221
222int next_item(nstate)
223int nstate;
224{
225	if (next == IL_TOKEN) {
226		next = -1;
227		return save_token();
228	}
229	next = -1;
230	if (nstate == IL_NUMBER)
231		yylval.num = atoi(yytext);
232	token++;
233	return nstate;
234}
235
236
237int next_state(nstate, fornext)
238int nstate, fornext;
239{
240	token++;
241
242	if (next == IL_TOKEN) {
243		next = -1;
244		return save_token();
245	}
246
247	next = fornext;
248
249	switch (nstate)
250	{
251	case IL_IPV4 :
252	case IL_TCP :
253	case IL_UDP :
254	case IL_ICMP :
255	case IL_DATA :
256	case IL_INTERFACE :
257	case IL_ARP :
258		oldproto = proto;
259		proto = nstate;
260		break;
261	case IL_SUM :
262		if (proto == IL_IPV4)
263			nstate = IL_V4SUM;
264		else if (proto == IL_TCP)
265			nstate = IL_TCPSUM;
266		else if (proto == IL_UDP)
267			nstate = IL_UDPSUM;
268		break;
269	case IL_OPT :
270		if (proto == IL_IPV4)
271			nstate = IL_V4OPT;
272		else if (proto == IL_TCP)
273			nstate = IL_TCPOPT;
274		break;
275	case IL_IPO_NOP :
276		if (proto == IL_TCP)
277			nstate = IL_TCPO_NOP;
278		break;
279	case IL_IPO_EOL :
280		if (proto == IL_TCP)
281			nstate = IL_TCPO_EOL;
282		break;
283	case IL_IPO_TS :
284		if (proto == IL_TCP)
285			nstate = IL_TCPO_TS;
286		break;
287	case IL_OFF :
288		if (proto == IL_IPV4)
289			nstate = IL_V4OFF;
290		else if (proto == IL_TCP)
291			nstate = IL_TCPOFF;
292		break;
293	case IL_LEN :
294		if (proto == IL_IPV4)
295			nstate = IL_V4LEN;
296		else if (proto == IL_UDP)
297			nstate = IL_UDPLEN;
298		break;
299	}
300	return nstate;
301}
302
303
304void swallow()
305{
306	int c = input();
307
308	if (c == '#') {
309		while ((c != '\n') && (c != EOF))
310			c = input();
311	}
312	unput(c);
313}
314