%option nodefault %option nomain %option noyywrap %option prefix="conf_" number [0-9]+ ipaddr [0-9]{1,3}"."[0-9]{1,3}"."[0-9]{1,3}"."[0-9]{1,3} ip6addr ([0-9a-fA-F]*:){2,}[0-9a-fA-F]*(%[0-9a-zA-Z]+)? cidr "/"[0-9]{1,3} atext [A-Za-z0-9!#$%&'*+/=?$^_`}{|~.-]{1,} qtext "\""[!-~]{1,}"\"" mailbox {atext}|{qtext} domainname [A-Za-z0-9._-]+ email {mailbox}"\@"{domainname} comment #.*$ blank [ \t]+ addr [Aa][Dd][Dd][Rr]:? from [Ff][Rr][Oo][Mm]:? rcpt [Rr][Cc][Pp][Tt]:? peer [Pp][Ee][Ee][Rr]:? verbose [Vv][Ee][Rr][Bb][Oo][Ss][Ee] quiet [Qq][Uu][Ii][Ee][Tt] noauth [Nn][Oo][Aa][Uu][Tt][Hh] noaccessdb [Nn][Oo][Aa][Cc][Cc][Ee][Ss][Ss][Dd][Bb] extendedregex [Ee][Xx][Tt][Ee][Nn][Dd][Ee][Dd][Rr][Ee][Gg][Ee][Xx] nospf [Nn][Oo][Ss][Pp][Ff] delayedreject [Dd][Ee][Ll][Aa][Yy][Ee][Dd][Rr][Ee][Jj][Ee][Cc][Tt] testmode [Tt][Ee][Ss][Tt][Mm][Oo][Dd][Ee] greylist [Gg][Rr][Ee][Yy][Ll][Ii][Ss][Tt]:? autowhite [Aa][Uu][Tt][Oo][Ww][Hh][Ii][Tt][Ee]:? pidfile [Pp][Ii][Dd][Ff][Ii][Ll][Ee]:? dumpfile [Dd][Uu][Mm][Pp][Ff][Ii][Ll][Ee]:? subnetmatch [Ss][Uu][Bb][Nn][Ee][Tt][Mm][Aa][Tt][Cc][Hh]:? subnetmatch6 [Ss][Uu][Bb][Nn][Ee][Tt][Mm][Aa][Tt][Cc][Hh]6:? socket [Ss][Oo][Cc][Kk][Ee][Tt]:? user [Uu][Ss][Ee][Rr]:? nodetach [Nn][Oo][Dd][Ee][Tt][Aa][Cc][Hh] report [Rr][Ee][Pp][Oo][Rr][Tt]:? none [Nn][Oo][Nn][Ee] delays [Dd][Ee][Ll][Aa][Yy][Ss] nodelays [Nn][Oo][Dd][Ee][Ll][Aa][Yy][Ss] gldelay [Dd][Ee][Ll][Aa][Yy] lazyaw [Ll][Aa][Zz][Yy][Aa][Ww] all [Aa][Ll][Ll] delay -?[0-9]+[smhdw]? qstring "\""[^"\n]+"\"" regex "/"[^/\n]+"/" dumpfreq [Dd][Uu][Mm][Pp][Ff][Rr][Ee][Qq]:? timeout [Tt][Ii][Mm][Ee][Oo][Uu][Tt]:? domain [Dd][Oo][Mm][Aa][Ii][Nn]:? syncaddr [Ss][Yy][Nn][Cc][Aa][Dd][Dd][Rr]:? syncsrcaddr [Ss][Yy][Nn][Cc][Ss][Rr][Cc][Aa][Dd][Dd][Rr]:? port [Pp][Oo][Rr][Tt] acl [Aa][Cc][Ll] whitelist [Ww][Hh][Ii][Tt][Ee][Ll][Ii][Ss][Tt]:? blacklist [Bb][Ll][Aa][Cc][Kk][Ll][Ii][Ss][Tt]:? default [Dd][Ee][Ff][Aa][Uu][Ll][Tt] drac [Dd][Rr][Aa][Cc] db [Dd][Bb] nodrac [Nn][Oo][Dd][Rr][Aa][Cc] 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] logexpired [Ll][Oo][Gg][Ee][Xx][Pp][Ii][Rr][Ee][Dd] dnsrbl [Dd][Nn][Ss][Rr][Bb][Ll] sm_macro [Ss][Mm]_[Mm][Aa][Cc][Rr][Oo] unset [Uu][Nn][Ss][Ee][Tt] list [Ll][Ii][Ss][Tt] flushaddr [Ff][Ll][Uu][Ss][Hh][Aa][Dd][Dd][Rr] code [Cc][Oo][Dd][Ee] ecode [Ee][Cc][Oo][Dd][Ee] msg [Mm][Ss][Gg] openlist "{" closelist "}" nextln "\\".*"\n" star "*" %s S_REGEX %{ #include "config.h" #ifdef HAVE_SYS_CDEFS_H #ifndef HAVE_BROKEN_RCSID #include #ifdef __RCSID __RCSID("$Id: conf_lex.l,v 1.55.2.2 2006/09/20 07:38:24 manu Exp $"); #endif #endif #endif #include #include #include #define YY_NO_UNPUT int conf_line; int conf_acl_end; %} %% {blank} {comment} {addr} { return ADDR; } {from} { BEGIN(S_REGEX); return FROM; } {rcpt} { BEGIN(S_REGEX); return RCPT; } {peer} { return PEER; } {autowhite} { return AUTOWHITE; } {lazyaw} { return LAZYAW; } {greylist} { return GREYLIST; } {noauth} { return NOAUTH; } {noaccessdb} { return NOACCESSDB; } {extendedregex} { return EXTENDEDREGEX; } {delayedreject} { return DELAYEDREJECT; } {nospf} { return NOSPF; } {quiet} { return QUIET; } {testmode} { return TESTMODE; } {verbose} { return VERBOSE; } {dump_no_time_translation} { return DUMP_NO_TIME_TRANSLATION; } {logexpired} { return LOGEXPIRED; } {dnsrbl} { return DNSRBL; } {sm_macro} { BEGIN(S_REGEX); return SM_MACRO; } {unset} { return UNSET; } {list} { return LIST; } {flushaddr} { return FLUSHADDR; } {code} { return CODE; } {ecode} { return ECODE; } {msg} { return MSG; } {pidfile} { return PIDFILE; } {dumpfile} { return GLDUMPFILE; } {subnetmatch} { return SUBNETMATCH; } {subnetmatch6} { return SUBNETMATCH6; } {socket} { return SOCKET; } {user} { return USER; } {nodetach} { return NODETACH; } {report} { return REPORT; } {none} { return NONE; } {delays} { return DELAYS; } {nodelays} { return NODELAYS; } {gldelay} { return GLXDELAY; } {all} { return ALL; } {dumpfreq} { return GLDUMPFREQ; } {timeout} { return GLTIMEOUT; } {domain} { BEGIN(S_REGEX); return DOMAIN; } {syncaddr} { return SYNCADDR; } {syncsrcaddr} { return SYNCSRCADDR; } {port} { return PORT; } {acl} { return ACL; } {whitelist} { return WHITELIST; } {blacklist} { return BLACKLIST; } {default} { return DEFAULT; } {star} { return STAR; } {drac} { return DRAC; } {nodrac} { return NODRAC; } {db} { return DB; } {qstring} { strncpy(yylval.qstring, yytext, QSTRLEN); yylval.qstring[QSTRLEN] = '\0'; return QSTRING; } {number} { strncpy(yylval.delay, yytext, NUMLEN); yylval.delay[NUMLEN] = '\0'; return TNUMBER; } {delay} { strncpy(yylval.delay, yytext, NUMLEN); yylval.delay[NUMLEN] = '\0'; return TDELAY; } {email} { strncpy(yylval.email, yytext, ADDRLEN); yylval.email[ADDRLEN] = '\0'; return EMAIL; } {ipaddr} { socklen_t salen = sizeof(yylval.ipaddr); if (ipfromstring(yytext, SA(&yylval.ipaddr), &salen, AF_INET) != 1) REJECT; return IPADDR; } {ip6addr} { #ifdef AF_INET6 socklen_t salen = sizeof(yylval.ip6addr); if (ipfromstring(yytext, SA(&yylval.ip6addr), &salen, AF_INET6) != 1) REJECT; #endif return IP6ADDR; } {domainname} { strncpy(yylval.domainname, yytext, ADDRLEN); yylval.domainname[ADDRLEN] = '\0'; return DOMAINNAME; } {regex} { strncpy(yylval.regex, yytext, REGEXLEN); yylval.regex[REGEXLEN] = '\0'; return REGEX; } {cidr} { yylval.cidr = atoi(yytext + 1); return CIDR; } {openlist} { return OPENLIST; } {closelist} { return CLOSELIST; } \n { BEGIN(0); conf_line++; return yytext[0]; } {nextln} { conf_line++; } <*>.|\n { mg_log(LOG_ERR, "unknown token \"%s\" line %d", yytext, conf_line); exit(EX_DATAERR); } %% void yyerror(err) char *err; { mg_log(LOG_ERR, "config error at line %d: %s", conf_line, err); exit(EX_DATAERR); return; }