xref: /openbsd-src/usr.sbin/nsd/configlexer.lex (revision bf87c3c07c3ad89262e2b8cae09f17e70aa9e1ee)
162ac0c33Sjakob %{
262ac0c33Sjakob /*
362ac0c33Sjakob  * configlexer.lex - lexical analyzer for NSD config file
462ac0c33Sjakob  *
5d3fecca9Ssthen  * Copyright (c) 2001-2006, NLnet Labs. All rights reserved
662ac0c33Sjakob  *
762ac0c33Sjakob  * See LICENSE for the license.
862ac0c33Sjakob  *
962ac0c33Sjakob  */
108d298c9fSsthen /* because flex keeps having sign-unsigned compare problems that are unfixed*/
118d298c9fSsthen #if defined(__clang__)||(defined(__GNUC__)&&((__GNUC__ >4)||(defined(__GNUC_MINOR__)&&(__GNUC__ ==4)&&(__GNUC_MINOR__ >=2))))
128d298c9fSsthen #pragma GCC diagnostic ignored "-Wsign-compare"
138d298c9fSsthen #endif
1462ac0c33Sjakob #include <ctype.h>
1562ac0c33Sjakob #include <errno.h>
1662ac0c33Sjakob #include <string.h>
1762ac0c33Sjakob #include <strings.h>
1815ed76cbSbrad #ifdef HAVE_GLOB_H
1915ed76cbSbrad # include <glob.h>
2015ed76cbSbrad #endif
2162ac0c33Sjakob 
2262ac0c33Sjakob #include "options.h"
2362ac0c33Sjakob #include "configparser.h"
2462ac0c33Sjakob 
2562ac0c33Sjakob #if 0
2662ac0c33Sjakob #define LEXOUT(s)  printf s /* used ONLY when debugging */
2762ac0c33Sjakob #else
2862ac0c33Sjakob #define LEXOUT(s)
2962ac0c33Sjakob #endif
3062ac0c33Sjakob 
3162ac0c33Sjakob struct inc_state {
3215ed76cbSbrad 	char* filename;
3362ac0c33Sjakob 	int line;
3415ed76cbSbrad 	YY_BUFFER_STATE buffer;
3515ed76cbSbrad 	struct inc_state* next;
3662ac0c33Sjakob };
3715ed76cbSbrad static struct inc_state* config_include_stack = NULL;
3815ed76cbSbrad static int inc_depth = 0;
3962ac0c33Sjakob 
config_start_include(const char * filename)4062ac0c33Sjakob static void config_start_include(const char* filename)
4162ac0c33Sjakob {
4262ac0c33Sjakob 	FILE *input;
4315ed76cbSbrad 	struct inc_state* s;
4415ed76cbSbrad 	char* nm;
4515ed76cbSbrad 	if(inc_depth++ > 10000000) {
468d298c9fSsthen 		c_error("too many include files");
4715ed76cbSbrad 		return;
4815ed76cbSbrad 	}
4962ac0c33Sjakob 	if(strlen(filename) == 0) {
508d298c9fSsthen 		c_error("empty include file name");
5162ac0c33Sjakob 		return;
5262ac0c33Sjakob 	}
5315ed76cbSbrad 	s = (struct inc_state*)malloc(sizeof(*s));
5415ed76cbSbrad 	if(!s) {
558d298c9fSsthen 		c_error("include %s: malloc failure", filename);
5662ac0c33Sjakob 		return;
5762ac0c33Sjakob 	}
5815ed76cbSbrad 	nm = strdup(filename);
5915ed76cbSbrad 	if(!nm) {
608d298c9fSsthen 		c_error("include %s: strdup failure", filename);
6115ed76cbSbrad 		free(s);
6215ed76cbSbrad 		return;
6315ed76cbSbrad 	}
6462ac0c33Sjakob 	input = fopen(filename, "r");
6562ac0c33Sjakob 	if(!input) {
668d298c9fSsthen 		c_error("cannot open include file '%s': %s",
6762ac0c33Sjakob 			filename, strerror(errno));
6815ed76cbSbrad 		free(s);
6915ed76cbSbrad 		free(nm);
7062ac0c33Sjakob 		return;
7162ac0c33Sjakob 	}
7262ac0c33Sjakob 	LEXOUT(("switch_to_include_file(%s) ", filename));
7315ed76cbSbrad 	s->filename = cfg_parser->filename;
7415ed76cbSbrad 	s->line = cfg_parser->line;
7515ed76cbSbrad 	s->buffer = YY_CURRENT_BUFFER;
7615ed76cbSbrad 	s->next = config_include_stack;
7715ed76cbSbrad 	config_include_stack = s;
7815ed76cbSbrad 
7915ed76cbSbrad 	cfg_parser->filename = nm;
8062ac0c33Sjakob 	cfg_parser->line = 1;
8162ac0c33Sjakob 	yy_switch_to_buffer(yy_create_buffer(input, YY_BUF_SIZE));
8215ed76cbSbrad }
8315ed76cbSbrad 
config_start_include_glob(const char * filename)8415ed76cbSbrad static void config_start_include_glob(const char* filename)
8515ed76cbSbrad {
8615ed76cbSbrad 	/* check for wildcards */
8715ed76cbSbrad #ifdef HAVE_GLOB
8815ed76cbSbrad 	glob_t g;
895435475dSsthen 	int i, r, flags;
906a6b9a23Sflorian #endif /* HAVE_GLOB */
916a6b9a23Sflorian 	if (cfg_parser->chroot) {
926a6b9a23Sflorian 		int l = strlen(cfg_parser->chroot); /* chroot has trailing slash */
936a6b9a23Sflorian 		if (strncmp(cfg_parser->chroot, filename, l) != 0) {
948d298c9fSsthen 			c_error("include file '%s' is not relative to chroot '%s'",
956a6b9a23Sflorian 				filename, cfg_parser->chroot);
966a6b9a23Sflorian 			return;
976a6b9a23Sflorian 		}
986a6b9a23Sflorian 		filename += l - 1; /* strip chroot without trailing slash */
996a6b9a23Sflorian 	}
1006a6b9a23Sflorian #ifdef HAVE_GLOB
10115ed76cbSbrad 	if(!(!strchr(filename, '*') && !strchr(filename, '?') &&
10215ed76cbSbrad 		 !strchr(filename, '[') && !strchr(filename, '{') &&
10315ed76cbSbrad 		 !strchr(filename, '~'))) {
10415ed76cbSbrad 		 flags = 0
10515ed76cbSbrad #ifdef GLOB_ERR
10615ed76cbSbrad 		 	 | GLOB_ERR
10715ed76cbSbrad #endif
108e02bc0dfSflorian 			 /* do not set GLOB_NOSORT so the results are sorted
109e02bc0dfSflorian 			    and in a predictable order. */
11015ed76cbSbrad #ifdef GLOB_BRACE
11115ed76cbSbrad 			 | GLOB_BRACE
11215ed76cbSbrad #endif
11315ed76cbSbrad #ifdef GLOB_TILDE
11415ed76cbSbrad 			 | GLOB_TILDE
11515ed76cbSbrad #endif
11615ed76cbSbrad 		;
11715ed76cbSbrad 		memset(&g, 0, sizeof(g));
11815ed76cbSbrad 		r = glob(filename, flags, NULL, &g);
11915ed76cbSbrad 		if(r) {
12015ed76cbSbrad 			/* some error */
12115ed76cbSbrad 			globfree(&g);
12215ed76cbSbrad 			if(r == GLOB_NOMATCH)
12315ed76cbSbrad 				return; /* no matches for pattern */
12415ed76cbSbrad 			config_start_include(filename); /* let original deal with it */
12515ed76cbSbrad 			return;
12615ed76cbSbrad 		}
12715ed76cbSbrad 		/* process files found, if any */
1285435475dSsthen 		for(i=(int)g.gl_pathc-1; i>=0; i--) {
12915ed76cbSbrad 			config_start_include(g.gl_pathv[i]);
13015ed76cbSbrad 		}
13115ed76cbSbrad 		globfree(&g);
13215ed76cbSbrad 		return;
13315ed76cbSbrad 	}
13415ed76cbSbrad #endif /* HAVE_GLOB */
13515ed76cbSbrad 	config_start_include(filename);
13662ac0c33Sjakob }
13762ac0c33Sjakob 
config_end_include(void)13862ac0c33Sjakob static void config_end_include(void)
13962ac0c33Sjakob {
14015ed76cbSbrad 	struct inc_state* s = config_include_stack;
14115ed76cbSbrad 	--inc_depth;
14215ed76cbSbrad 	if(!s) return;
14315ed76cbSbrad 	free(cfg_parser->filename);
14415ed76cbSbrad 	cfg_parser->filename = s->filename;
14515ed76cbSbrad 	cfg_parser->line = s->line;
14662ac0c33Sjakob 	yy_delete_buffer(YY_CURRENT_BUFFER);
14715ed76cbSbrad 	yy_switch_to_buffer(s->buffer);
14815ed76cbSbrad 	config_include_stack = s->next;
14915ed76cbSbrad 	free(s);
15062ac0c33Sjakob }
15162ac0c33Sjakob 
15262ac0c33Sjakob #ifndef yy_set_bol /* compat definition, for flex 2.4.6 */
15362ac0c33Sjakob #define yy_set_bol(at_bol) \
15462ac0c33Sjakob         { \
15562ac0c33Sjakob 	        if ( ! yy_current_buffer ) \
15662ac0c33Sjakob 	                yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
15762ac0c33Sjakob 	        yy_current_buffer->yy_ch_buf[0] = ((at_bol)?'\n':' '); \
15862ac0c33Sjakob         }
15962ac0c33Sjakob #endif
16062ac0c33Sjakob 
16162ac0c33Sjakob %}
162d3fecca9Ssthen %option noinput
163d3fecca9Ssthen %option nounput
164d3fecca9Ssthen %{
165d3fecca9Ssthen #ifndef YY_NO_UNPUT
166d3fecca9Ssthen #define YY_NO_UNPUT 1
167d3fecca9Ssthen #endif
168d3fecca9Ssthen #ifndef YY_NO_INPUT
169d3fecca9Ssthen #define YY_NO_INPUT 1
170d3fecca9Ssthen #endif
171d3fecca9Ssthen %}
17262ac0c33Sjakob 
17362ac0c33Sjakob SPACE   [ \t]
17462ac0c33Sjakob LETTER  [a-zA-Z]
17562ac0c33Sjakob UNQUOTEDLETTER [^\"\n\r \t\\]|\\.
17662ac0c33Sjakob NEWLINE [\r\n]
17762ac0c33Sjakob COMMENT \#
17862ac0c33Sjakob COLON 	\:
17962ac0c33Sjakob ANY     [^\"\n\r\\]|\\.
18062ac0c33Sjakob 
18162ac0c33Sjakob %x	quotedstring include include_quoted
18262ac0c33Sjakob 
18362ac0c33Sjakob %%
18462ac0c33Sjakob {SPACE}* 		{ LEXOUT(("SP ")); /* ignore */ }
18562ac0c33Sjakob {SPACE}*{COMMENT}.* 	{ LEXOUT(("comment(%s) ", yytext)); /* ignore */ }
18662ac0c33Sjakob server{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_SERVER;}
18762ac0c33Sjakob name{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_NAME;}
18862ac0c33Sjakob ip-address{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_IP_ADDRESS;}
189cdb6bbddSbrad interface{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_IP_ADDRESS;}
19012455795Ssthen ip-transparent{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_IP_TRANSPARENT;}
191275a8d89Sflorian ip-freebind{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_IP_FREEBIND;}
192eab1363eSsthen send-buffer-size{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_SEND_BUFFER_SIZE;}
193eab1363eSsthen receive-buffer-size{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_RECEIVE_BUFFER_SIZE;}
19462ac0c33Sjakob debug-mode{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DEBUG_MODE;}
19518e77612Sflorian use-systemd{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_USE_SYSTEMD;}
19662ac0c33Sjakob hide-version{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_HIDE_VERSION;}
197eab1363eSsthen hide-identity{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_HIDE_IDENTITY;}
198308d2509Sflorian drop-updates{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DROP_UPDATES; }
19962ac0c33Sjakob ip4-only{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_IP4_ONLY;}
20062ac0c33Sjakob ip6-only{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_IP6_ONLY;}
201d3fecca9Ssthen do-ip4{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_DO_IP4;}
202d3fecca9Ssthen do-ip6{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_DO_IP6;}
20362ac0c33Sjakob database{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_DATABASE;}
20462ac0c33Sjakob identity{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_IDENTITY;}
2053126abd5Ssthen version{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_VERSION;}
206a8b34139Sjakob nsid{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_NSID;}
20762ac0c33Sjakob logfile{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_LOGFILE;}
208ac5517e4Sflorian log-only-syslog{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_LOG_ONLY_SYSLOG;}
20962ac0c33Sjakob server-count{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_SERVER_COUNT;}
21062ac0c33Sjakob tcp-count{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_TCP_COUNT;}
211eab1363eSsthen tcp-reject-overflow{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_TCP_REJECT_OVERFLOW;}
21262ac0c33Sjakob tcp-query-count{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_TCP_QUERY_COUNT;}
21362ac0c33Sjakob tcp-timeout{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_TCP_TIMEOUT;}
214275a8d89Sflorian tcp-mss{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_TCP_MSS;}
215275a8d89Sflorian outgoing-tcp-mss{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_OUTGOING_TCP_MSS;}
21662ac0c33Sjakob ipv4-edns-size{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_IPV4_EDNS_SIZE;}
21762ac0c33Sjakob ipv6-edns-size{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_IPV6_EDNS_SIZE;}
21862ac0c33Sjakob pidfile{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_PIDFILE;}
21962ac0c33Sjakob port{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_PORT;}
220a65f413bSsthen reuseport{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_REUSEPORT;}
22162ac0c33Sjakob statistics{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_STATISTICS;}
22262ac0c33Sjakob chroot{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_CHROOT;}
22362ac0c33Sjakob username{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_USERNAME;}
22462ac0c33Sjakob zonesdir{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_ZONESDIR;}
225d3fecca9Ssthen zonelistfile{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_ZONELISTFILE;}
22662ac0c33Sjakob difffile{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_DIFFFILE;}
22762ac0c33Sjakob xfrdfile{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_XFRDFILE;}
228d3fecca9Ssthen xfrdir{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_XFRDIR;}
22962ac0c33Sjakob xfrd-reload-timeout{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_XFRD_RELOAD_TIMEOUT;}
23062ac0c33Sjakob verbosity{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_VERBOSITY;}
23162ac0c33Sjakob zone{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_ZONE;}
23262ac0c33Sjakob zonefile{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_ZONEFILE;}
2339e506f0aSbrad zonestats{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_ZONESTATS;}
23462ac0c33Sjakob allow-notify{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_ALLOW_NOTIFY;}
2356e9bf1eeSflorian size-limit-xfr{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_SIZE_LIMIT_XFR;}
23662ac0c33Sjakob request-xfr{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_REQUEST_XFR;}
23762ac0c33Sjakob notify{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_NOTIFY;}
23862ac0c33Sjakob notify-retry{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_NOTIFY_RETRY;}
23962ac0c33Sjakob provide-xfr{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_PROVIDE_XFR;}
2408d298c9fSsthen allow-query{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_ALLOW_QUERY;}
24162ac0c33Sjakob outgoing-interface{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_OUTGOING_INTERFACE;}
24262ac0c33Sjakob allow-axfr-fallback{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_ALLOW_AXFR_FALLBACK;}
243063644e9Sflorian tls-auth{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_TLS_AUTH;}
244063644e9Sflorian auth-domain-name{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_TLS_AUTH_DOMAIN_NAME;}
245a904e103Sflorian client-cert{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_TLS_AUTH_CLIENT_CERT;}
246a904e103Sflorian client-key{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_TLS_AUTH_CLIENT_KEY;}
247a904e103Sflorian client-key-pw{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_TLS_AUTH_CLIENT_KEY_PW;}
24862ac0c33Sjakob key{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_KEY;}
24962ac0c33Sjakob algorithm{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_ALGORITHM;}
25062ac0c33Sjakob secret{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_SECRET;}
251d3fecca9Ssthen pattern{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_PATTERN;}
2525435475dSsthen include-pattern{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_INCLUDE_PATTERN;}
253d3fecca9Ssthen remote-control{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_REMOTE_CONTROL;}
254d3fecca9Ssthen control-enable{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_CONTROL_ENABLE;}
255d3fecca9Ssthen control-interface{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_CONTROL_INTERFACE;}
256d3fecca9Ssthen control-port{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_CONTROL_PORT;}
257d3fecca9Ssthen server-key-file{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_SERVER_KEY_FILE;}
258d3fecca9Ssthen server-cert-file{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_SERVER_CERT_FILE;}
259d3fecca9Ssthen control-key-file{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_CONTROL_KEY_FILE;}
260d3fecca9Ssthen control-cert-file{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_CONTROL_CERT_FILE;}
26162ac0c33Sjakob AXFR			{ LEXOUT(("v(%s) ", yytext)); return VAR_AXFR;}
26262ac0c33Sjakob UDP			{ LEXOUT(("v(%s) ", yytext)); return VAR_UDP;}
2632c1ae072Ssthen rrl-size{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_RRL_SIZE;}
2642c1ae072Ssthen rrl-ratelimit{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_RRL_RATELIMIT;}
26512455795Ssthen rrl-slip{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_RRL_SLIP;}
26612455795Ssthen rrl-ipv4-prefix-length{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_RRL_IPV4_PREFIX_LENGTH;}
26712455795Ssthen rrl-ipv6-prefix-length{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_RRL_IPV6_PREFIX_LENGTH;}
2682c1ae072Ssthen rrl-whitelist-ratelimit{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_RRL_WHITELIST_RATELIMIT;}
2692c1ae072Ssthen rrl-whitelist{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_RRL_WHITELIST;}
270d3fecca9Ssthen zonefiles-check{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_ZONEFILES_CHECK;}
27115ed76cbSbrad zonefiles-write{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_ZONEFILES_WRITE;}
272e02bc0dfSflorian dnstap{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP;}
273e02bc0dfSflorian dnstap-enable{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_ENABLE;}
274e02bc0dfSflorian dnstap-socket-path{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_SOCKET_PATH; }
2753efee2e1Sflorian dnstap-ip{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_IP; }
2763efee2e1Sflorian dnstap-tls{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_TLS; }
2773efee2e1Sflorian dnstap-tls-server-name{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_TLS_SERVER_NAME; }
2783efee2e1Sflorian dnstap-tls-cert-bundle{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_TLS_CERT_BUNDLE; }
2793efee2e1Sflorian dnstap-tls-client-key-file{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_TLS_CLIENT_KEY_FILE; }
2803efee2e1Sflorian dnstap-tls-client-cert-file{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_TLS_CLIENT_CERT_FILE; }
281e02bc0dfSflorian dnstap-send-identity{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_SEND_IDENTITY; }
282e02bc0dfSflorian dnstap-send-version{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_SEND_VERSION; }
283e02bc0dfSflorian dnstap-identity{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_IDENTITY; }
284e02bc0dfSflorian dnstap-version{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_VERSION; }
285e02bc0dfSflorian dnstap-log-auth-query-messages{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_LOG_AUTH_QUERY_MESSAGES; }
286e02bc0dfSflorian dnstap-log-auth-response-messages{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_DNSTAP_LOG_AUTH_RESPONSE_MESSAGES; }
28715ed76cbSbrad log-time-ascii{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_LOG_TIME_ASCII;}
28815ed76cbSbrad round-robin{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_ROUND_ROBIN;}
289db7d0d02Sflorian minimal-responses{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_MINIMAL_RESPONSES;}
2905435475dSsthen confine-to-zone{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_CONFINE_TO_ZONE;}
291bfd0b123Sflorian refuse-any{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_REFUSE_ANY;}
2926e9bf1eeSflorian max-refresh-time{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_MAX_REFRESH_TIME;}
2936e9bf1eeSflorian min-refresh-time{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_MIN_REFRESH_TIME;}
2946e9bf1eeSflorian max-retry-time{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_MAX_RETRY_TIME;}
2956e9bf1eeSflorian min-retry-time{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_MIN_RETRY_TIME;}
296ac5517e4Sflorian min-expire-time{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_MIN_EXPIRE_TIME;}
2974564029fSflorian store-ixfr{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_STORE_IXFR;}
2984564029fSflorian ixfr-size{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_IXFR_SIZE;}
2994564029fSflorian ixfr-number{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_IXFR_NUMBER;}
3004564029fSflorian create-ixfr{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_CREATE_IXFR;}
301*bf87c3c0Sflorian multi-master-check{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_MULTI_PRIMARY_CHECK;}
302*bf87c3c0Sflorian multi-primary-check{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_MULTI_PRIMARY_CHECK;}
303eab1363eSsthen tls-service-key{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_TLS_SERVICE_KEY;}
304eab1363eSsthen tls-service-ocsp{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_TLS_SERVICE_OCSP;}
305eab1363eSsthen tls-service-pem{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_TLS_SERVICE_PEM;}
306eab1363eSsthen tls-port{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_TLS_PORT;}
307063644e9Sflorian tls-cert-bundle{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_TLS_CERT_BUNDLE; }
308b71395eaSflorian proxy-protocol-port{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_PROXY_PROTOCOL_PORT; }
309063644e9Sflorian answer-cookie{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_ANSWER_COOKIE;}
310063644e9Sflorian cookie-secret{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_COOKIE_SECRET;}
311063644e9Sflorian cookie-secret-file{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_COOKIE_SECRET_FILE;}
312bc6311d7Sflorian xfrd-tcp-max{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_XFRD_TCP_MAX;}
313bc6311d7Sflorian xfrd-tcp-pipeline{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_XFRD_TCP_PIPELINE;}
3143f21e8ccSflorian verify{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_VERIFY; }
3153f21e8ccSflorian enable{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_ENABLE; }
3163f21e8ccSflorian verify-zone{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_VERIFY_ZONE; }
3173f21e8ccSflorian verify-zones{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_VERIFY_ZONES; }
3183f21e8ccSflorian verifier{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_VERIFIER; }
3193f21e8ccSflorian verifier-count{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_VERIFIER_COUNT; }
3203f21e8ccSflorian verifier-feed-zone{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_VERIFIER_FEED_ZONE; }
3213f21e8ccSflorian verifier-timeout{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_VERIFIER_TIMEOUT; }
322*bf87c3c0Sflorian catalog{COLON}		{ LEXOUT(("v(%s) ", yytext)); return VAR_CATALOG; }
323*bf87c3c0Sflorian catalog-member-pattern{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_CATALOG_MEMBER_PATTERN; }
324*bf87c3c0Sflorian catalog-producer-zone{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_CATALOG_PRODUCER_ZONE; }
32562ac0c33Sjakob {NEWLINE}		{ LEXOUT(("NL\n")); cfg_parser->line++;}
32662ac0c33Sjakob 
327308d2509Sflorian servers={UNQUOTEDLETTER}*	{
328308d2509Sflorian 	yyless(yyleng - (yyleng - 8));
329308d2509Sflorian 	LEXOUT(("v(%s) ", yytext));
330308d2509Sflorian 	return VAR_SERVERS;
331308d2509Sflorian }
332308d2509Sflorian bindtodevice={UNQUOTEDLETTER}*	{
333308d2509Sflorian 	yyless(yyleng - (yyleng - 13));
334308d2509Sflorian 	LEXOUT(("v(%s) ", yytext));
335308d2509Sflorian 	return VAR_BINDTODEVICE;
336308d2509Sflorian }
337308d2509Sflorian setfib={UNQUOTEDLETTER}*	{
338308d2509Sflorian 	yyless(yyleng - (yyleng - 7));
339308d2509Sflorian 	LEXOUT(("v(%s) ", yytext));
340308d2509Sflorian 	return VAR_SETFIB;
341308d2509Sflorian }
342308d2509Sflorian 
343308d2509Sflorian cpu-affinity{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_CPU_AFFINITY; }
344308d2509Sflorian xfrd-cpu-affinity{COLON}	{ LEXOUT(("v(%s) ", yytext)); return VAR_XFRD_CPU_AFFINITY; }
345308d2509Sflorian server-[1-9][0-9]*-cpu-affinity{COLON}	{
346308d2509Sflorian 		char *str = yytext;
347308d2509Sflorian 		LEXOUT(("v(%s) ", yytext));
348308d2509Sflorian 		/* Skip server- */
349308d2509Sflorian 		while (*str != '\0' && (*str < '0' || *str > '9')) {
350308d2509Sflorian 			str++;
351308d2509Sflorian 		}
3528d298c9fSsthen 		c_lval.llng = strtoll(str, NULL, 10);
353308d2509Sflorian 		return VAR_SERVER_CPU_AFFINITY;
354308d2509Sflorian 	}
355308d2509Sflorian 
35662ac0c33Sjakob 	/* Quoted strings. Strip leading and ending quotes */
35762ac0c33Sjakob \"			{ BEGIN(quotedstring); LEXOUT(("QS ")); }
35862ac0c33Sjakob <quotedstring><<EOF>>   {
3598d298c9fSsthen         c_error("EOF inside quoted string");
36062ac0c33Sjakob         BEGIN(INITIAL);
36162ac0c33Sjakob }
36262ac0c33Sjakob <quotedstring>{ANY}*    { LEXOUT(("STR(%s) ", yytext)); yymore(); }
36362ac0c33Sjakob <quotedstring>\n        { cfg_parser->line++; yymore(); }
36462ac0c33Sjakob <quotedstring>\" {
36562ac0c33Sjakob         LEXOUT(("QE "));
36662ac0c33Sjakob         BEGIN(INITIAL);
36762ac0c33Sjakob         yytext[yyleng - 1] = '\0';
3688d298c9fSsthen 	c_lval.str = region_strdup(cfg_parser->opt->region, yytext);
36962ac0c33Sjakob         return STRING;
37062ac0c33Sjakob }
37162ac0c33Sjakob 
37262ac0c33Sjakob 	/* include: directive */
37362ac0c33Sjakob include{COLON}		{ LEXOUT(("v(%s) ", yytext)); BEGIN(include); }
37462ac0c33Sjakob <include><<EOF>>	{
3758d298c9fSsthen         c_error("EOF inside include directive");
37662ac0c33Sjakob         BEGIN(INITIAL);
37762ac0c33Sjakob }
37862ac0c33Sjakob <include>{SPACE}*	{ LEXOUT(("ISP ")); /* ignore */ }
37962ac0c33Sjakob <include>{NEWLINE}	{ LEXOUT(("NL\n")); cfg_parser->line++;}
38062ac0c33Sjakob <include>\"		{ LEXOUT(("IQS ")); BEGIN(include_quoted); }
38162ac0c33Sjakob <include>{UNQUOTEDLETTER}*	{
38262ac0c33Sjakob 	LEXOUT(("Iunquotedstr(%s) ", yytext));
38315ed76cbSbrad 	config_start_include_glob(yytext);
38462ac0c33Sjakob 	BEGIN(INITIAL);
38562ac0c33Sjakob }
38662ac0c33Sjakob <include_quoted><<EOF>>	{
3878d298c9fSsthen         c_error("EOF inside quoted string");
38862ac0c33Sjakob         BEGIN(INITIAL);
38962ac0c33Sjakob }
39062ac0c33Sjakob <include_quoted>{ANY}*	{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
39162ac0c33Sjakob <include_quoted>{NEWLINE}	{ cfg_parser->line++; yymore(); }
39262ac0c33Sjakob <include_quoted>\"	{
39362ac0c33Sjakob 	LEXOUT(("IQE "));
39462ac0c33Sjakob 	yytext[yyleng - 1] = '\0';
39515ed76cbSbrad 	config_start_include_glob(yytext);
39662ac0c33Sjakob 	BEGIN(INITIAL);
39762ac0c33Sjakob }
39862ac0c33Sjakob <INITIAL><<EOF>>	{
39962ac0c33Sjakob 	yy_set_bol(1); /* Set beginning of line, so "^" rules match.  */
40015ed76cbSbrad 	if (!config_include_stack) {
40162ac0c33Sjakob 		yyterminate();
40262ac0c33Sjakob 	} else {
40362ac0c33Sjakob 		fclose(yyin);
40462ac0c33Sjakob 		config_end_include();
40562ac0c33Sjakob 	}
40662ac0c33Sjakob }
40762ac0c33Sjakob 
40862ac0c33Sjakob {UNQUOTEDLETTER}*	{ LEXOUT(("unquotedstr(%s) ", yytext));
4098d298c9fSsthen 			c_lval.str = region_strdup(cfg_parser->opt->region, yytext); return STRING; }
41062ac0c33Sjakob 
41162ac0c33Sjakob %%
412