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