1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger%{
2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
3aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <stdio.h>
443cc93e3470017f51f20adbef023bd9b53de3a7bosdl.org!shemminger#include <stdlib.h>
5aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <malloc.h>
6aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <string.h>
7aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "ssfilter.h"
8aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
9aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingertypedef struct ssfilter * ssfilter_t;
10aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
11aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define YYSTYPE ssfilter_t
12aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
13aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic struct ssfilter * alloc_node(int type, void *pred)
14aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
15aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct ssfilter *n = malloc(sizeof(*n));
16aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (n == NULL)
17aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		abort();
18aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	n->type = type;
19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	n->pred = pred;
20aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	n->post = NULL;
21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return n;
22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic char		**yy_argv;
25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int		yy_argc;
26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic FILE		*yy_fp;
27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic ssfilter_t	*yy_ret;
28aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
29aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int yylex(void);
30aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
31aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void yyerror(char *s)
32aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
33aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "ss: bison bellows (while parsing filter): \"%s!\"", s);
34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
36aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger%}
37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger%token HOSTCOND DCOND SCOND DPORT SPORT LEQ GEQ NEQ AUTOBOUND
39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger%left '|'
40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger%left '&'
41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger%nonassoc '!'
42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger%%
44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerapplet: null expr
45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                *yy_ret = $2;
47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = $2;
48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | null
50aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        ;
51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingernull:   /* NOTHING */ { $$ = NULL; }
52aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        ;
53aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerexpr:	DCOND HOSTCOND
54aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
55aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		$$ = alloc_node(SSF_DCOND, $2);
56aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
57aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | SCOND HOSTCOND
58ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger        {
59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		$$ = alloc_node(SSF_SCOND, $2);
60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | DPORT GEQ HOSTCOND
62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = alloc_node(SSF_D_GE, $3);
64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | DPORT LEQ HOSTCOND
66aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
67aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = alloc_node(SSF_D_LE, $3);
68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | DPORT '>' HOSTCOND
70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = alloc_node(SSF_NOT, alloc_node(SSF_D_LE, $3));
72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | DPORT '<' HOSTCOND
74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = alloc_node(SSF_NOT, alloc_node(SSF_D_GE, $3));
76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | DPORT '=' HOSTCOND
78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		$$ = alloc_node(SSF_DCOND, $3);
80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | DPORT NEQ HOSTCOND
82aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		$$ = alloc_node(SSF_NOT, alloc_node(SSF_DCOND, $3));
84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | SPORT GEQ HOSTCOND
87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = alloc_node(SSF_S_GE, $3);
89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | SPORT LEQ HOSTCOND
91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = alloc_node(SSF_S_LE, $3);
93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | SPORT '>' HOSTCOND
95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = alloc_node(SSF_NOT, alloc_node(SSF_S_LE, $3));
97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | SPORT '<' HOSTCOND
99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = alloc_node(SSF_NOT, alloc_node(SSF_S_GE, $3));
101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | SPORT '=' HOSTCOND
103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
104aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		$$ = alloc_node(SSF_SCOND, $3);
105aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | SPORT NEQ HOSTCOND
107aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
108aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		$$ = alloc_node(SSF_NOT, alloc_node(SSF_SCOND, $3));
109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | AUTOBOUND
112aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
113aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = alloc_node(SSF_S_AUTO, NULL);
114aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
115aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | expr '|' expr
116aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
117aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = alloc_node(SSF_OR, $1);
118aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	        $$->post = $3;
119aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
120aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | expr expr
121aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
122aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = alloc_node(SSF_AND, $1);
123aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	        $$->post = $2;
124aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
125aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | expr '&' expr
126aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
127aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
128aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = alloc_node(SSF_AND, $1);
129aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	        $$->post = $3;
130aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
131aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | '!' expr
132aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
133aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = alloc_node(SSF_NOT, $2);
134aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
135aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        | '(' expr ')'
136aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        {
137aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                $$ = $2;
138aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        }
139aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger;
140aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger%%
141aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
142aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic char *get_token_from_line(char **ptr)
143aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
144aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	char *tok, *cp = *ptr;
145aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
146aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	while (*cp == ' ' || *cp == '\t') cp++;
147aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
148aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (*cp == 0) {
149aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		*ptr = cp;
150aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return NULL;
151aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
152aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
153aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	tok = cp;
154aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
155aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	while (*cp != 0 && *cp != ' ' && *cp != '\t') {
156aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		/* Backslash escapes everything. */
157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (*cp == '\\') {
158aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			char *tp;
159aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			for (tp = cp; tp != tok; tp--)
160aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				*tp = *(tp-1);
161aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			cp++;
162aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			tok++;
163aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (*cp == 0)
164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				break;
165aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
166aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		cp++;
167aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
168aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (*cp)
169aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		*cp++ = 0;
170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	*ptr = cp;
171aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return tok;
172aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
173aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
174aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint yylex(void)
175aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
176aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	static char argbuf[1024];
177aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	static char *tokptr = argbuf;
178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	static int argc;
179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	char *curtok;
180aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	do {
182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		while (*tokptr == 0) {
183aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			tokptr = NULL;
184aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (argc < yy_argc) {
185aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				tokptr = yy_argv[argc];
186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				argc++;
187aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			} else if (yy_fp) {
188aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				while (tokptr == NULL) {
189aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					if (fgets(argbuf, sizeof(argbuf)-1, yy_fp) == NULL)
190aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger						return 0;
191aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					argbuf[sizeof(argbuf)-1] = 0;
192aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					if (strlen(argbuf) == sizeof(argbuf) - 1) {
193aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger						fprintf(stderr, "Too long line in filter");
194aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger						exit(-1);
195aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					}
196aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					if (argbuf[strlen(argbuf)-1] == '\n')
197aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger						argbuf[strlen(argbuf)-1] = 0;
198aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					if (argbuf[0] == '#' || argbuf[0] == '0')
199aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger						continue;
200aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					tokptr = argbuf;
201aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				}
202aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			} else {
203aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return 0;
204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
205aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	} while ((curtok = get_token_from_line(&tokptr)) == NULL);
207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
208aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, "!") == 0 ||
209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "not") == 0)
210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return '!';
211aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, "&") == 0 ||
212aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "&&") == 0 ||
213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "and") == 0)
214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return '&';
215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, "|") == 0 ||
216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "||") == 0 ||
217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "or") == 0)
218aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return '|';
219aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, "(") == 0)
220aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return '(';
221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, ")") == 0)
222aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return ')';
223aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, "dst") == 0)
224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return DCOND;
225aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, "src") == 0)
226aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return SCOND;
227aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, "dport") == 0)
228aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return DPORT;
229aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, "sport") == 0)
230aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return SPORT;
231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, ">=") == 0 ||
232aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "ge") == 0 ||
233aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "geq") == 0)
234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return GEQ;
235aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, "<=") == 0 ||
236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "le") == 0 ||
237aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "leq") == 0)
238aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return LEQ;
239aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, "!=") == 0 ||
240aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "ne") == 0 ||
241aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "neq") == 0)
242aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return NEQ;
243aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, "=") == 0 ||
244aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "==") == 0 ||
245aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "eq") == 0)
246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return '=';
247aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, ">") == 0 ||
248aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "gt") == 0)
249aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return '>';
250aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, "<") == 0 ||
251aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	    strcmp(curtok, "lt") == 0)
252aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return '<';
253aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (strcmp(curtok, "autobound") == 0)
254aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return AUTOBOUND;
255aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	yylval = (void*)parse_hostcond(curtok);
256aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (yylval == NULL) {
257aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(stderr, "Cannot parse dst/src address.\n");
258aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		exit(1);
259aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
260aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return HOSTCOND;
261aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
262aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
263aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint ssfilter_parse(struct ssfilter **f, int argc, char **argv, FILE *fp)
264aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
265aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	yy_argc = argc;
266aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	yy_argv = argv;
267aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	yy_fp   = fp;
268aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	yy_ret  = f;
269aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
270aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (yyparse()) {
271aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(stderr, " Sorry.\n");
272aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
273aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
274aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
275aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
276