1 %option nodefault
2 %option nomain
3 %option noyywrap
4 %option prefix="conf_"
5 
6 number		[0-9]+[kM]?
7 ipaddr		[0-9]{1,3}"."[0-9]{1,3}"."[0-9]{1,3}"."[0-9]{1,3}
8 ip6addr		([0-9a-fA-F]*:){2,}[0-9a-fA-F]*(%[0-9a-zA-Z]+)?
9 cidr		"/"[0-9]{1,3}
10 atext		[A-Za-z0-9!#$%&'*+/=?$^_`}{|~.-]{1,}
11 qtext		"\""[!-~]{1,}"\""
12 mailbox		{atext}|{qtext}
13 domainname	[A-Za-z0-9._-]+
14 email		{mailbox}"\@"{domainname}
15 comment		#.*$
16 blank		[ \t]+
17 addr		[Aa][Dd][Dd][Rr]:?
18 helo		[Hh][Ee][Ll][Oo]
19 from		[Ff][Rr][Oo][Mm]:?
20 rawfrom		[Rr][Aa][Ww][Ff][Rr][Oo][Mm]:?
21 rcpt		[Rr][Cc][Pp][Tt]:?
22 peer		[Pp][Ee][Ee][Rr]:?
23 verbose		[Vv][Ee][Rr][Bb][Oo][Ss][Ee]
24 quiet		[Qq][Uu][Ii][Ee][Tt]
25 noauth		[Nn][Oo][Aa][Uu][Tt][Hh]
26 multiracl	[Mm][Uu][Ll][Tt][Ii][Rr][Aa][Cc][Ll]
27 auth		[Aa][Uu][Tt][Hh]
28 tls		[Tt][Ll][Ss]
29 msgsize		[Mm][Ss][Gg][Ss][Ii][Zz][Ee]
30 rcptcount	[Rr][Cc][Pp][Tt][Cc][Oo][Uu][Nn][Tt]
31 noaccessdb	[Nn][Oo][Aa][Cc][Cc][Ee][Ss][Ss][Dd][Bb]
32 extendedregex	[Ee][Xx][Tt][Ee][Nn][Dd][Ee][Dd][Rr][Ee][Gg][Ee][Xx]
33 localaddr	[Ll][Oo][Cc][Aa][ll][Aa][Dd][Dd][Rr]
34 unbracket	[Uu][Nn][Bb][Rr][Aa][Cc][Kk][Ee][Tt]
35 nospf		[Nn][Oo][Ss][Pp][Ff]
36 spf		[Ss][Pp][Ff]
37 dkimcheck	[Dd][Kk][Ii][Mm]
38 pass		[Pp][Aa][Ss][Ss]
39 fail		[Ff][Aa][Ii][Ll]
40 softfail	[Ss][Oo][Ff][Tt][Ff][Aa][Ii][Ll]
41 neutral		[Nn][Ee][Uu][Tt][Rr][Aa][Ll]
42 unknown		[Uu][Nn][Kk][Nn][Oo][Ww][Nn]
43 error		[Ee][Rr][Rr][Oo][Rr]
44 self		[Ss][Ee][Ll][Ff]
45 delayedreject	[Dd][Ee][Ll][Aa][Yy][Ee][Dd][Rr][Ee][Jj][Ee][Cc][Tt]
46 testmode	[Tt][Ee][Ss][Tt][Mm][Oo][Dd][Ee]
47 greylist	[Gg][Rr][Ee][Yy][Ll][Ii][Ss][Tt]:?
48 autowhite	[Aa][Uu][Tt][Oo][Ww][Hh][Ii][Tt][Ee]:?
49 pidfile		[Pp][Ii][Dd][Ff][Ii][Ll][Ee]:?
50 dumpfile	[Dd][Uu][Mm][Pp][Ff][Ii][Ll][Ee]:?
51 subnetmatch	[Ss][Uu][Bb][Nn][Ee][Tt][Mm][Aa][Tt][Cc][Hh]:?
52 subnetmatch6	[Ss][Uu][Bb][Nn][Ee][Tt][Mm][Aa][Tt][Cc][Hh]6:?
53 socket		[Ss][Oo][Cc][Kk][Ee][Tt]:?
54 user		[Uu][Ss][Ee][Rr]:?
55 nodetach	[Nn][Oo][Dd][Ee][Tt][Aa][Cc][Hh]
56 report		[Rr][Ee][Pp][Oo][Rr][Tt]:?
57 stat		[Ss][Tt][Aa][Tt]
58 none		[Nn][Oo][Nn][Ee]
59 delays		[Dd][Ee][Ll][Aa][Yy][Ss]
60 nodelays	[Nn][Oo][Dd][Ee][Ll][Aa][Yy][Ss]
61 gldelay		[Dd][Ee][Ll][Aa][Yy]
62 tarpit		[Tt][Aa][Rr][Pp][Ii][Tt]
63 tarpit_scope	[Tt][Aa][Rr][Pp][Ii][Tt]_[Ss][Cc][Oo][Pp][Ee]
64 session		[Ss][Ee][Ss][Ss][Ii][Oo][Nn]
65 command		[Cc][Oo][Mm][Aa][Nn][Dd]
66 lazyaw		[Ll][Aa][Zz][Yy][Aa][Ww]
67 all		[Aa][Ll][Ll]
68 delay		-?[0-9]+[smhdw]?
69 qstring		"\""([^"\n]|\\\")*"\""
70 regex		"/"([^/\n]|\\"/")+"/"
71 dumpfreq	[Dd][Uu][Mm][Pp][Ff][Rr][Ee][Qq]:?
72 binddn		[Bb][Ii][Nn][Dd][Dd][Nn]
73 bindpw		[Bb][Ii][Nn][Dd][Pp][Ww]
74 timeout		[Tt][Ii][Mm][Ee][Oo][Uu][Tt]:?
75 time		[Tt][Ii][Mm][Ee]
76 domain		[Dd][Oo][Mm][Aa][Ii][Nn]:?
77 syncaddr	[Ss][Yy][Nn][Cc][Aa][Dd][Dd][Rr]:?
78 syncsrcaddr	[Ss][Yy][Nn][Cc][Ss][Rr][Cc][Aa][Dd][Dd][Rr]:?
79 syncmaxqlen	[Ss][Yy][Nn][Cc][Mm][Aa][Xx][Qq][Ll][Ee][Nn]:?
80 port		[Pp][Oo][Rr][Tt]
81 acl		[Aa][Cc][Ll]
82 racl		[Rr][Aa][Cc][Ll]
83 dacl		[Dd][Aa][Cc][Ll]
84 whitelist	[Ww][Hh][Ii][Tt][Ee][Ll][Ii][Ss][Tt]:?
85 blacklist	[Bb][Ll][Aa][Cc][Kk][Ll][Ii][Ss][Tt]:?
86 continue	[Cc][Oo][Nn][Tt][Ii][Nn][Uu][Ee]
87 default		[Dd][Ee][Ff][Aa][Uu][Ll][Tt]
88 drac		[Dd][Rr][Aa][Cc]
89 db		[Dd][Bb]
90 nodrac		[Nn][Oo][Dd][Rr][Aa][Cc]
91 dump_no_time_translation [Dd][Uu][Mm][Pp]_[Nn][Oo]_[Tt][Ii][Mm][Ee]_[Tt][Rr][Aa][Nn][Ss][Ll][Aa][Tt][Ii][Oo][Nn]
92 logexpired    [Ll][Oo][Gg][Ee][Xx][Pp][Ii][Rr][Ee][Dd]
93 dnsrbl		[Dd][Nn][Ss][Rr][Bb][Ll]
94 sm_macro	[Ss][Mm]_[Mm][Aa][Cc][Rr][Oo]
95 urlcheck	[Uu][Rr][Ll][Cc][Hh][Ee][Cc][Kk]
96 postmsg		[Pp][Oo][Ss][Tt][Mm][Ss][Gg]
97 getprop		[Gg][Ee][Tt][Pp][Rr][Oo][Pp]
98 fork		[Ff][Oo][Rr][Kk]
99 set		[Ss][Ee][Tt]
100 rset		[Rr][Ss][Ee][Tt]
101 clear		[Cc][Ll][Ee][Aa][Rr]
102 noencode	[Nn][Oo][Ee][Nn][Cc][Oo][Dd][Ee]
103 noescape	[Nn][Oo][Ee][Ss][Cc][Aa][Pp][Ee]
104 unset		[Uu][Nn][Ss][Ee][Tt]
105 list		[Ll][Ii][Ss][Tt]
106 flushaddr	[Ff][Ll][Uu][Ss][Hh][Aa][Dd][Dd][Rr]
107 nolog		[Nn][Oo][Ll][Oo][Gg]
108 log		[Ll][Oo][Gg]
109 code		[Cc][Oo][Dd][Ee]
110 ecode		[Ee][Cc][Oo][Dd][Ee]
111 msg		[Mm][Ss][Gg]
112 header		[Hh][Ee][Aa][Dd][Ee][Rr]
113 addheader	[Aa][Dd][Dd][Hh][Ee][Aa][Dd][Ee][Rr]
114 addfooter	[Aa][Dd][Dd][Ff][Oo][Oo][Tt][Ee][Rr]
115 subjtag		[Ss][Uu][Bb][Jj][Tt][Aa][Gg]
116 body		[Bb][Oo][Dd][Yy]
117 maxpeek		[Mm][Aa][Xx][Pp][Ee][Ee][Kk]
118 geoipdb		[Gg][Ee][Oo][Ii][Pp][Dd][Bb]
119 geoipv6db	[Gg][Ee][Oo][Ii][Pp][Vv]6[Dd][Bb]
120 geoip2db	[Gg][Ee][Oo][Ii][Pp]2[Dd][Bb]
121 geoip		[Gg][Ee][Oo][Ii][Pp]
122 ldapconf	[Ll][Dd][Aa][Pp][Cc][Oo][Nn][Ff]
123 ldapcheck	[Ll][Dd][Aa][Pp][Cc][Hh][Ee][Cc][Kk]
124 fixldapcheck	[Ff][Ii][Xx][Ll][Dd][Aa][Pp][Cc][Hh][Ee][Cc][Kk]
125 domatch		[Dd][Oo][Mm][Aa][Tt][Cc][Hh]
126 logfac		[Ll][Oo][Gg][Ff][Aa][Cc]
127 log_kern	[Kk][Ee][Rr][Nn]
128 log_user	[Uu][Ss][Ee][Rr]
129 log_mail	[Mm][Aa][Ii][Ll]
130 log_daemon	[Dd][Aa][Ee][Mm][Oo][Nn]
131 log_auth	[Aa][Uu][Tt][Hh]
132 log_syslog	[Ss][Yy][Ss][Ll][Oo][Gg]
133 log_lpr		[Ll][Pp][Rr]
134 log_news	[Nn][Ee][Ww][Ss]
135 log_uucp	[Uu][Uu][Cc][Pp]
136 log_cron	[Cc][Rr][Oo][Nn]
137 log_authpriv	[Aa][Uu][Tt][Hh][Pp][Rr][Ii][Vv]
138 log_ftp		[Ff][Tt][Pp]
139 log_local0	[Ll][Oo][Cc][Aa][Ll]0
140 log_local1	[Ll][Oo][Cc][Aa][Ll]1
141 log_local2	[Ll][Oo][Cc][Aa][Ll]2
142 log_local3	[Ll][Oo][Cc][Aa][Ll]3
143 log_local4	[Ll][Oo][Cc][Aa][Ll]4
144 log_local5	[Ll][Oo][Cc][Aa][Ll]5
145 log_local6	[Ll][Oo][Cc][Aa][Ll]6
146 log_local7	[Ll][Oo][Cc][Aa][Ll]7
147 p0fsock		[Pp]0[Ff][Ss][Oo][Cc][Kk]
148 p0f		[Pp]0[Ff]
149 spamdsock	[Ss][Pp][Aa][Mm][Dd][Ss][Oo][Cc][Kk]
150 spamdsockt	[Ii][Nn][Ee][Tt]|[Uu][Nn][Ii][Xx]
151 spamd		[Ss][Pp][Aa][Mm][Dd]
152 ratelimit	[Rr][Aa][Tt][Ee][Ll][Ii][Mm][Ii][Tt]
153 key		[Kk][Ee][Yy]
154 openlist	"{"
155 closelist	"}"
156 nextln		"\\".*"\n"
157 star		"*"
158 slash		"/"
159 minus		"-"
160 comma		","
161 eqset		"="
162 incset		"+="
163 decset		"-="
164 eq		"=="
165 ne		"!="
166 ge		">="
167 le		"<="
168 gt		">"
169 lt		"<"
170 no		[Nn][Oo]
171 not		[Nn][Oo][Tt]
172 neg		"!"
173 prop		"$"[-_A-Za-z0-9]*[_A-Za-z0-9]
174 domainexact	[Dd][Oo][Mm][Aa][Ii][Nn][Ee][Xx][Aa][Cc][Tt]
175 mx		[Mm][Xx]
176 data		[Dd][Aa][Tt][Aa]
177 tsig		[Tt][Ss][Ii][Gg]
178 nsupdate	[Nn][Ss][Uu][Pp][Dd][Aa][Tt][Ee]
179 servers		[Ss][Ee][Rr][Vv][Ee][Rr][Ss]
180 rname		[Rr][Nn][Aa][Mm][Ee]
181 rvalue		[Rr][Vv][Aa][Ll][Uu][Ee]
182 ttl		[Tt][Tt][Ll]
183 class		[Cc][Ll][Aa][Ss][Ss]
184 type		[Tt][Yy][Pp][Ee]
185 
186 %s S_REGEX
187 %s S_SPF
188 %s S_DKIM
189 %x S_LOGFAC
190 %x S_CLOCKSPEC1 S_CLOCKSPEC2
191 
192 %{
193 	#include "config.h"
194 
195 	#ifdef HAVE_SYS_CDEFS_H
196 	#ifndef HAVE_BROKEN_RCSID
197 	#include <sys/cdefs.h>
198 	#ifdef __RCSID
199 	__RCSID("$Id: conf_lex.l,v 1.112 2016/11/24 04:11:37 manu Exp $");
200 	#endif
201 	#endif
202 	#endif
203 
204 	#include <string.h>
205 	#include <errno.h>
206 	#include <sysexits.h>
207 	#ifdef USE_DMALLOC
208 	#include <dmalloc.h>
209 	#endif
210 
211 	#define YY_NO_UNPUT
212 
213 	int conf_line;
214 	int conf_acl_end;
215 	int conf_racl_end;
216 	int conf_dacl_end;
217 %}
218 
219 %%
220 <*>{blank}
221 {comment}
222 {eqset}		{ return EQSET; }
223 {incset}	{ return INCSET; }
224 {decset}	{ return DECSET; }
225 {eq}		{ yylval.op = OP_EQ; return OP; }
226 {ne}		{ yylval.op = OP_NE; return OP; }
227 {lt}		{ yylval.op = OP_LT; return OP; }
228 {gt}		{ yylval.op = OP_GT; return OP; }
229 {le}		{ yylval.op = OP_LE; return OP; }
230 {ge}		{ yylval.op = OP_GE; return OP; }
231 {no}		{ return NO; }
232 {not}		{ return NO; }
233 {neg}		{ return NO; }
234 {prop}		{
235 			BEGIN(S_REGEX);
236 			strncpy(yylval.prop, yytext, QSTRLEN);
237 			yylval.qstring[QSTRLEN] = '\0';
238 			return PROP;
239 		}
240 {addr}		{ return ADDR; }
241 {helo}		{ BEGIN(S_REGEX); return HELO; }
242 {from}		{ BEGIN(S_REGEX); return FROM; }
243 {rawfrom}	{ BEGIN(S_REGEX); return RAWFROM; }
244 {rcpt}		{ BEGIN(S_REGEX); return RCPT; }
245 {peer}		{ return PEER; }
246 {autowhite}	{ return AUTOWHITE; }
247 {lazyaw}	{ return LAZYAW; }
248 {greylist}	{ return GREYLIST; }
249 {noauth}	{ return NOAUTH; }
250 {multiracl}	{ return MULTIRACL; }
251 {auth}		{ BEGIN(S_REGEX); return AUTH; }
252 {tls}		{ BEGIN(S_REGEX); return TLS; }
253 {msgsize}	{ return MSGSIZE; }
254 {rcptcount}	{ return RCPTCOUNT; }
255 {noaccessdb}	{ return NOACCESSDB; }
256 {extendedregex}	{ return EXTENDEDREGEX; }
257 {delayedreject}	{ return DELAYEDREJECT; }
258 {localaddr}	{ return LOCALADDR; }
259 {unbracket}	{ return UNBRACKET; }
260 {nospf}		{ return NOSPF; }
261 {spf}		{ BEGIN(S_SPF); return SPF; }
262 {dkimcheck}	{ BEGIN(S_DKIM); return DKIMCHECK; }
263 {pass}		{ BEGIN(0);
264 		  yylval.spf_status = MGSPF_PASS; return SPF_STATUS; }
265 {fail}		{ BEGIN(0);
266 		  yylval.spf_status = MGSPF_FAIL; return SPF_STATUS; }
267 {softfail}	{ BEGIN(0);
268 		  yylval.spf_status = MGSPF_SOFTFAIL; return SPF_STATUS; }
269 {neutral}	{ BEGIN(0);
270 		  yylval.spf_status = MGSPF_NEUTRAL; return SPF_STATUS; }
271 {unknown}	{ BEGIN(0);
272 		  yylval.spf_status = MGSPF_UNKNOWN; return SPF_STATUS; }
273 {error}		{ BEGIN(0);
274 		  yylval.spf_status = MGSPF_ERROR; return SPF_STATUS; }
275 <S_SPF>{self}	{ BEGIN(0);
276 		  yylval.spf_status = MGSPF_SELF; return SPF_STATUS; }
277 <S_SPF>{none}	{ BEGIN(0);
278 		  yylval.spf_status = MGSPF_NONE; return SPF_STATUS; }
279 <S_DKIM>{self}	{ BEGIN(0);
280 		  yylval.spf_status = MGSPF_SELF; return SPF_STATUS; }
281 <S_DKIM>{none}	{ BEGIN(0);
282 		  yylval.spf_status = MGSPF_NONE; return SPF_STATUS; }
283 {quiet}		{ return QUIET; }
284 {testmode}	{ return TESTMODE; }
285 {verbose}	{ return VERBOSE; }
286 {dump_no_time_translation}	{ return DUMP_NO_TIME_TRANSLATION; }
287 {logexpired}  { return LOGEXPIRED; }
288 {dnsrbl}  	{ return DNSRBL; }
289 {sm_macro}  	{ BEGIN(S_REGEX); return SM_MACRO; }
290 {urlcheck}  	{ return URLCHECK; }
291 {postmsg}	{ return POSTMSG; }
292 {getprop}	{ return GETPROP; }
293 {clear}		{ return CLEAR; }
294 {noencode}	{ return NOENCODE; }
295 {noescape}	{ return NOESCAPE; }
296 {fork}		{ return FORK; }
297 {set}		{ return SET; }
298 {rset}		{ return RSET; }
299 {unset}  	{ return UNSET; }
300 {list}  	{ return LIST; }
301 {flushaddr}  	{ return FLUSHADDR; }
302 {nolog}  	{ return NOLOG; }
303 {log} 	 	{ return LOG; }
304 {code}  	{ return CODE; }
305 {ecode}  	{ return ECODE; }
306 {msg}	  	{ return MSG; }
307 {header}	{ BEGIN(S_REGEX); return GLHEADER; }
308 {addheader}	{ return ADDHEADER; }
309 {comma}		{ return COMMA; }
310 {addfooter}	{ return ADDFOOTER; }
311 {subjtag}	{ return SUBJTAG; }
312 {body}		{ BEGIN(S_REGEX); return BODY; }
313 {maxpeek}	{ return MAXPEEK; }
314 {geoipdb}	{ return GEOIPDB; }
315 {geoipv6db}	{ return GEOIPV6DB; }
316 {geoip}		{ return GEOIP; }
317 {geoip2db}	{ return GEOIP2DB; }
318 {ldapconf}	{ return LDAPCONF; }
319 {ldapcheck}	{ return LDAPCHECK; }
320 {fixldapcheck}	{ return FIXLDAPCHECK; }
321 {domatch}	{ return DOMATCH; }
322 {p0fsock}	{ return P0FSOCK; }
323 {p0f}		{ BEGIN(S_REGEX); return P0F; }
324 {spamdsock}	{ return SPAMDSOCK; }
325 {spamdsockt}	{
326 			strncpy(yylval.spamdsockt, yytext, QSTRLEN);
327 			yylval.spamdsockt[QSTRLEN] = '\0';
328 			return SPAMDSOCKT;
329 		}
330 {spamd}		{ return SPAMD; }
331 {pidfile}	{ return PIDFILE; }
332 {dumpfile}	{ return GLDUMPFILE; }
333 {subnetmatch}	{ return SUBNETMATCH; }
334 {subnetmatch6}	{ return SUBNETMATCH6; }
335 {socket}	{ return SOCKET; }
336 {user}		{ return USER; }
337 {nodetach}	{ return NODETACH; }
338 {tsig}		{ return TSIG; }
339 {nsupdate}	{ return NSUPDATE; }
340 {servers}	{ return SERVERS; }
341 {rname}		{ return RNAME; }
342 {rvalue}	{ return RVALUE; }
343 {ttl}		{ return TTL; }
344 {class}		{ return CLASS; }
345 {type}		{ return TYPE; }
346 {logfac}	{ BEGIN(S_LOGFAC); return LOGFAC; }
347 <S_LOGFAC>{log_kern}	{ BEGIN(0); return LOGFAC_KERN; }
348 <S_LOGFAC>{log_user}	{ BEGIN(0); return LOGFAC_USER; }
349 <S_LOGFAC>{log_mail}	{ BEGIN(0); return LOGFAC_MAIL; }
350 <S_LOGFAC>{log_daemon}	{ BEGIN(0); return LOGFAC_DAEMON; }
351 <S_LOGFAC>{log_auth}	{ BEGIN(0); return LOGFAC_AUTH; }
352 <S_LOGFAC>{log_syslog}	{ BEGIN(0); return LOGFAC_SYSLOG; }
353 <S_LOGFAC>{log_lpr}	{ BEGIN(0); return LOGFAC_LPR; }
354 <S_LOGFAC>{log_news}	{ BEGIN(0); return LOGFAC_NEWS; }
355 <S_LOGFAC>{log_uucp}	{ BEGIN(0); return LOGFAC_UUCP; }
356 <S_LOGFAC>{log_cron}	{ BEGIN(0); return LOGFAC_CRON; }
357 <S_LOGFAC>{log_authpriv}	{ BEGIN(0); return LOGFAC_AUTHPRIV; }
358 <S_LOGFAC>{log_ftp}	{ BEGIN(0); return LOGFAC_FTP; }
359 <S_LOGFAC>{log_local0}	{ BEGIN(0); return LOGFAC_LOCAL0; }
360 <S_LOGFAC>{log_local1}	{ BEGIN(0); return LOGFAC_LOCAL1; }
361 <S_LOGFAC>{log_local2}	{ BEGIN(0); return LOGFAC_LOCAL2; }
362 <S_LOGFAC>{log_local3}	{ BEGIN(0); return LOGFAC_LOCAL3; }
363 <S_LOGFAC>{log_local4}	{ BEGIN(0); return LOGFAC_LOCAL4; }
364 <S_LOGFAC>{log_local5}	{ BEGIN(0); return LOGFAC_LOCAL5; }
365 <S_LOGFAC>{log_local6}	{ BEGIN(0); return LOGFAC_LOCAL6; }
366 <S_LOGFAC>{log_local7}	{ BEGIN(0); return LOGFAC_LOCAL7; }
367 <S_LOGFAC>{none}	{ BEGIN(0); return NONE; }
368 {ratelimit}		{ return RATELIMIT; }
369 {data}			{ return DATA; }
370 {key}		{ return KEY; }
371 {report}	{ return REPORT; }
372 <INITIAL>{none}	{ return NONE; }
373 {stat}		{ return STAT; }
374 {delays}	{ return DELAYS; }
375 {nodelays}	{ return NODELAYS; }
376 {gldelay}	{ return GLXDELAY; }
377 {tarpit}	{ return TARPIT; }
378 {tarpit_scope}	{ return TARPIT_SCOPE; }
379 {session}	{ return SESSION; }
380 {command}	{ return COMMAND; }
381 {all}		{ return ALL; }
382 {dumpfreq}	{ return GLDUMPFREQ; }
383 {timeout}	{ return GLTIMEOUT; }
384 {binddn}	{ return LDAPBINDDN; }
385 {bindpw}	{ return LDAPBINDPW; }
386 {time}		{ BEGIN(S_CLOCKSPEC1); return TIME; }
387 {domain}	{ BEGIN(S_REGEX); return DOMAIN; }
388 {syncaddr}	{ return SYNCADDR; }
389 {syncsrcaddr}	{ return SYNCSRCADDR; }
390 {syncmaxqlen}	{ return SYNCMAXQLEN; }
391 {port}		{ return PORT; }
392 {acl}		{ return ACL; }
393 {racl}		{ return RACL; }
394 {dacl}		{ return DACL; }
395 {whitelist}	{ return WHITELIST; }
396 {blacklist}	{ return BLACKLIST; }
397 {continue}	{ return CONTINUE; }
398 {default}	{ return DEFAULT; }
399 {domainexact}	{ return DOMAINEXACT; }
400 {mx}            {       return MX; }
401 <INITIAL>{star}		{ return STAR; }
402 <S_CLOCKSPEC2>{star}	{ return STAR; }
403 <*>{slash}	{ return SLASH; }
404 <S_CLOCKSPEC2>{minus}	{ return MINUS; }
405 <S_CLOCKSPEC2>{comma}	{ return COMMA; }
406 {drac}		{ return DRAC; }
407 {nodrac}	{ return NODRAC; }
408 {db}		{ return DB; }
409 <INITIAL,S_REGEX>{qstring}	{
410 			strncpy(yylval.qstring, yytext, QSTRLEN);
411 			yylval.qstring[QSTRLEN] = '\0';
412 			return QSTRING;
413 		}
414 <S_CLOCKSPEC1>"\""	{ BEGIN(S_CLOCKSPEC2); }
415 <S_CLOCKSPEC2>"\""	{ BEGIN(0); }
416 <*>{number}	{
417 			strncpy(yylval.delay, yytext, NUMLEN);
418 			yylval.delay[NUMLEN] = '\0';
419 			return TNUMBER;
420 		}
421 {delay}		{
422 			strncpy(yylval.delay, yytext, NUMLEN);
423 			yylval.delay[NUMLEN] = '\0';
424 			return TDELAY;
425 		}
426 {email}		{
427 			strncpy(yylval.email, yytext, ADDRLEN);
428 			yylval.email[ADDRLEN] = '\0';
429 			return EMAIL;
430 		}
431 {ipaddr}	{
432 			socklen_t salen = sizeof(yylval.ipaddr);
433 
434 			if (ipfromstring(yytext, SA(&yylval.ipaddr), &salen,
435 			     AF_INET) != 1)
436 				REJECT;
437 			return IPADDR;
438 		}
439 {ip6addr}	{
440 #ifdef AF_INET6
441 			socklen_t salen = sizeof(yylval.ip6addr);
442 
443 			if (ipfromstring(yytext, SA(&yylval.ip6addr), &salen,
444 			    AF_INET6) != 1)
445 				REJECT;
446 #endif
447 			return IP6ADDR;
448 		}
449 {domainname}	{
450 			strncpy(yylval.domainname, yytext, ADDRLEN);
451 			yylval.domainname[ADDRLEN] = '\0';
452 			return DOMAINNAME;
453 		}
454 <S_REGEX>{regex} {
455 			strncpy(yylval.regex, yytext, REGEXLEN);
456 			yylval.regex[REGEXLEN] = '\0';
457 			return REGEX;
458 		}
459 {cidr}		{
460 			yylval.cidr = atoi(yytext + 1);
461 			return CIDR;
462 		}
463 {openlist}	{	return OPENLIST; }
464 {closelist}	{	return CLOSELIST; }
465 <*>\n		{
466 			BEGIN(0);
467 			conf_line++;
468 			return yytext[0];
469 		}
470 {nextln}	{	conf_line++; }
471 
472 <*>.|\n		{
473 			mg_log(LOG_ERR, "unknown token \"%s\" line %d",
474 			    yytext, conf_line);
475 			exit(EX_DATAERR);
476 		}
477 %%
478 
479 void
480 yyerror(err)
481 	char *err;
482 {
483 	mg_log(LOG_ERR, "config error at line %d: %s", conf_line, err);
484 	exit(EX_DATAERR);
485 	return;
486 }
487 
488 void
489 conf_dispose_input_file(void) {
490 	conf__flush_buffer(YY_CURRENT_BUFFER);
491 }
492