1158287Smaxim%{
2158287Smaxim/*
3158287Smaxim * configlexer.lex - lexical analyzer for unbound config file
4330449Seadler *
5330449Seadler * Copyright (c) 2001-2006, NLnet Labs. All rights reserved
6158287Smaxim *
7158287Smaxim * See LICENSE for the license.
8158287Smaxim *
9158287Smaxim */
10158287Smaxim#include "config.h"
11158287Smaxim
12158287Smaxim/* because flex keeps having sign-unsigned compare problems that are unfixed*/
13158287Smaxim#if defined(__clang__)||(defined(__GNUC__)&&((__GNUC__ >4)||(defined(__GNUC_MINOR__)&&(__GNUC__ ==4)&&(__GNUC_MINOR__ >=2))))
14158287Smaxim#pragma GCC diagnostic ignored "-Wsign-compare"
15158287Smaxim#endif
16158287Smaxim
17158287Smaxim#include <ctype.h>
18158287Smaxim#include <strings.h>
19158287Smaxim#ifdef HAVE_GLOB_H
20158287Smaxim# include <glob.h>
21158287Smaxim#endif
22158287Smaxim
23158287Smaxim#include "util/config_file.h"
24158287Smaxim#include "configparser.h"
25158287Smaximvoid ub_c_error(const char *message);
26158287Smaxim
27158287Smaxim#if 0
28158287Smaxim#define LEXOUT(s)  printf s /* used ONLY when debugging */
29158287Smaxim#else
30158287Smaxim#define LEXOUT(s)
31158287Smaxim#endif
32158287Smaxim
33158287Smaxim/** avoid warning in about fwrite return value */
34158287Smaxim#define ECHO ub_c_error_msg("syntax error at text: %s", ub_c_text)
35158287Smaxim
36158287Smaxim/** A parser variable, this is a statement in the config file which is
37158287Smaxim * of the form variable: value1 value2 ...  nargs is the number of values. */
38158287Smaxim#define YDVAR(nargs, var) \
39158287Smaxim	num_args=(nargs); \
40158287Smaxim	LEXOUT(("v(%s%d) ", ub_c_text, num_args)); \
41158287Smaxim	if(num_args > 0) { BEGIN(val); } \
42158287Smaxim	return (var);
43158287Smaxim
44158287Smaximstruct inc_state {
45158287Smaxim	char* filename;
46158287Smaxim	int line;
47158287Smaxim	YY_BUFFER_STATE buffer;
48158287Smaxim	struct inc_state* next;
49158287Smaxim	int inc_toplevel;
50158287Smaxim};
51158287Smaximstatic struct inc_state* config_include_stack = NULL;
52158287Smaximstatic int inc_depth = 0;
53202718Sedstatic int inc_prev = 0;
54202718Sedstatic int num_args = 0;
55158287Smaximstatic int inc_toplevel = 0;
56158287Smaxim
57158287Smaximvoid init_cfg_parse(void)
58158287Smaxim{
59202198Sed	config_include_stack = NULL;
60158287Smaxim	inc_depth = 0;
61158287Smaxim	inc_prev = 0;
62158287Smaxim	num_args = 0;
63158287Smaxim	inc_toplevel = 0;
64158287Smaxim}
65158287Smaxim
66250942Sghelmerstatic void config_start_include(const char* filename, int toplevel)
67158287Smaxim{
68158287Smaxim	FILE *input;
69158287Smaxim	struct inc_state* s;
70158287Smaxim	char* nm;
71158287Smaxim	if(inc_depth+1 > 100000) {
72158287Smaxim		ub_c_error_msg("too many include files");
73202198Sed		return;
74158287Smaxim	}
75158287Smaxim	if(*filename == '\0') {
76158287Smaxim		ub_c_error_msg("empty include file name");
77158287Smaxim		return;
78158287Smaxim	}
79166504Srse	s = (struct inc_state*)malloc(sizeof(*s));
80158287Smaxim	if(!s) {
81158287Smaxim		ub_c_error_msg("include %s: malloc failure", filename);
82158287Smaxim		return;
83158287Smaxim	}
84158287Smaxim	if(cfg_parser->chroot && strncmp(filename, cfg_parser->chroot,
85158287Smaxim		strlen(cfg_parser->chroot)) == 0) {
86158287Smaxim		filename += strlen(cfg_parser->chroot);
87158287Smaxim	}
88158287Smaxim	nm = strdup(filename);
89301413Smarkj	if(!nm) {
90158287Smaxim		ub_c_error_msg("include %s: strdup failure", filename);
91158287Smaxim		free(s);
92158287Smaxim		return;
93158287Smaxim	}
94158287Smaxim	input = fopen(filename, "r");
95158287Smaxim	if(!input) {
96202198Sed		ub_c_error_msg("cannot open include file '%s': %s",
97158287Smaxim			filename, strerror(errno));
98158287Smaxim		free(s);
99158287Smaxim		free(nm);
100158287Smaxim		return;
101158287Smaxim	}
102158287Smaxim	LEXOUT(("switch_to_include_file(%s)\n", filename));
103158287Smaxim	inc_depth++;
104158287Smaxim	s->filename = cfg_parser->filename;
105158287Smaxim	s->line = cfg_parser->line;
106158287Smaxim	s->buffer = YY_CURRENT_BUFFER;
107158287Smaxim	s->inc_toplevel = inc_toplevel;
108158287Smaxim	s->next = config_include_stack;
109158287Smaxim	config_include_stack = s;
110158287Smaxim	cfg_parser->filename = nm;
111158287Smaxim	cfg_parser->line = 1;
112158287Smaxim	inc_toplevel = toplevel;
113158287Smaxim	yy_switch_to_buffer(yy_create_buffer(input, YY_BUF_SIZE));
114158287Smaxim}
115158287Smaxim
116158287Smaximstatic void config_start_include_glob(const char* filename, int toplevel)
117158287Smaxim{
118158287Smaxim
119158287Smaxim	/* check for wildcards */
120158287Smaxim#ifdef HAVE_GLOB
121158287Smaxim	glob_t g;
122158287Smaxim	int i, r, flags;
123158287Smaxim	if(!(!strchr(filename, '*') && !strchr(filename, '?') && !strchr(filename, '[') &&
124158287Smaxim		!strchr(filename, '{') && !strchr(filename, '~'))) {
125158287Smaxim		flags = 0
126158287Smaxim#ifdef GLOB_ERR
127158287Smaxim			| GLOB_ERR
128158287Smaxim#endif
129158287Smaxim			 /* do not set GLOB_NOSORT so the results are sorted
130158287Smaxim			    and in a predictable order. */
131158287Smaxim#ifdef GLOB_BRACE
132158287Smaxim			| GLOB_BRACE
133158287Smaxim#endif
134158287Smaxim#ifdef GLOB_TILDE
135158287Smaxim			| GLOB_TILDE
136158287Smaxim#endif
137158287Smaxim		;
138158287Smaxim		memset(&g, 0, sizeof(g));
139158287Smaxim		if(cfg_parser->chroot && strncmp(filename, cfg_parser->chroot,
140158287Smaxim			strlen(cfg_parser->chroot)) == 0) {
141158287Smaxim			filename += strlen(cfg_parser->chroot);
142158287Smaxim		}
143158287Smaxim		r = glob(filename, flags, NULL, &g);
144158287Smaxim		if(r) {
145158287Smaxim			/* some error */
146158287Smaxim			globfree(&g);
147158287Smaxim			if(r == GLOB_NOMATCH)
148158287Smaxim				return; /* no matches for pattern */
149158287Smaxim			config_start_include(filename, toplevel); /* let original deal with it */
150158287Smaxim			return;
151158287Smaxim		}
152158287Smaxim		/* process files found, if any */
153158287Smaxim		for(i=(int)g.gl_pathc-1; i>=0; i--) {
154158287Smaxim			config_start_include(g.gl_pathv[i], toplevel);
155158287Smaxim		}
156158287Smaxim		globfree(&g);
157158287Smaxim		return;
158158287Smaxim	}
159158287Smaxim#endif /* HAVE_GLOB */
160158287Smaxim
161158287Smaxim	config_start_include(filename, toplevel);
162158287Smaxim}
163158287Smaxim
164158287Smaximstatic void config_end_include(void)
165158287Smaxim{
166158287Smaxim	struct inc_state* s = config_include_stack;
167158287Smaxim	--inc_depth;
168158287Smaxim	if(!s) return;
169158287Smaxim	free(cfg_parser->filename);
170158287Smaxim	cfg_parser->filename = s->filename;
171158287Smaxim	cfg_parser->line = s->line;
172158287Smaxim	yy_delete_buffer(YY_CURRENT_BUFFER);
173158287Smaxim	yy_switch_to_buffer(s->buffer);
174158287Smaxim	config_include_stack = s->next;
175158287Smaxim	inc_toplevel = s->inc_toplevel;
176158287Smaxim	free(s);
177158287Smaxim}
178158287Smaxim
179158287Smaxim#ifndef yy_set_bol /* compat definition, for flex 2.4.6 */
180158287Smaxim#define yy_set_bol(at_bol) \
181166504Srse        { \
182158287Smaxim	        if ( ! yy_current_buffer ) \
183158287Smaxim	                yy_current_buffer = yy_create_buffer( ub_c_in, YY_BUF_SIZE ); \
184158287Smaxim	        yy_current_buffer->yy_ch_buf[0] = ((at_bol)?'\n':' '); \
185158287Smaxim        }
186158287Smaxim#endif
187158287Smaxim
188158287Smaxim%}
189158287Smaxim%option noinput
190158287Smaxim%option nounput
191158287Smaxim%{
192158287Smaxim#ifndef YY_NO_UNPUT
193158287Smaxim#define YY_NO_UNPUT 1
194158287Smaxim#endif
195158287Smaxim#ifndef YY_NO_INPUT
196158287Smaxim#define YY_NO_INPUT 1
197158287Smaxim#endif
198158287Smaxim%}
199158287Smaxim
200158287SmaximSPACE   [ \t]
201158287SmaximLETTER  [a-zA-Z]
202158287SmaximUNQUOTEDLETTER [^\'\"\n\r \t\\]|\\.
203158287SmaximUNQUOTEDLETTER_NOCOLON [^\:\'\"\n\r \t\\]|\\.
204158287SmaximNEWLINE [\r\n]
205158287SmaximCOMMENT \#
206158287SmaximCOLON 	\:
207158287SmaximDQANY     [^\"\n\r\\]|\\.
208158287SmaximSQANY     [^\'\n\r\\]|\\.
209158287Smaxim
210158287Smaxim%x	quotedstring singlequotedstr include include_quoted val include_toplevel include_toplevel_quoted
211158287Smaxim
212158287Smaxim%%
213158287Smaxim<INITIAL,val>{SPACE}*	{
214158287Smaxim	LEXOUT(("SP ")); /* ignore */ }
215158287Smaxim<INITIAL,val>{SPACE}*{COMMENT}.*	{
216158287Smaxim	/* note that flex makes the longest match and '.' is any but not nl */
217158287Smaxim	LEXOUT(("comment(%s) ", ub_c_text)); /* ignore */ }
218158287Smaximserver{COLON}			{ YDVAR(0, VAR_SERVER) }
219158287Smaximqname-minimisation{COLON}	{ YDVAR(1, VAR_QNAME_MINIMISATION) }
220158287Smaximqname-minimisation-strict{COLON} { YDVAR(1, VAR_QNAME_MINIMISATION_STRICT) }
221158287Smaximnum-threads{COLON}		{ YDVAR(1, VAR_NUM_THREADS) }
222158287Smaximverbosity{COLON}		{ YDVAR(1, VAR_VERBOSITY) }
223158287Smaximport{COLON}			{ YDVAR(1, VAR_PORT) }
224158287Smaximoutgoing-range{COLON}		{ YDVAR(1, VAR_OUTGOING_RANGE) }
225158287Smaximoutgoing-port-permit{COLON}	{ YDVAR(1, VAR_OUTGOING_PORT_PERMIT) }
226158287Smaximoutgoing-port-avoid{COLON}	{ YDVAR(1, VAR_OUTGOING_PORT_AVOID) }
227158287Smaximoutgoing-num-tcp{COLON}		{ YDVAR(1, VAR_OUTGOING_NUM_TCP) }
228158287Smaximincoming-num-tcp{COLON}		{ YDVAR(1, VAR_INCOMING_NUM_TCP) }
229158287Smaximdo-ip4{COLON}			{ YDVAR(1, VAR_DO_IP4) }
230158287Smaximdo-ip6{COLON}			{ YDVAR(1, VAR_DO_IP6) }
231158287Smaximprefer-ip4{COLON}		{ YDVAR(1, VAR_PREFER_IP4) }
232158287Smaximprefer-ip6{COLON}		{ YDVAR(1, VAR_PREFER_IP6) }
233158287Smaximdo-udp{COLON}			{ YDVAR(1, VAR_DO_UDP) }
234158287Smaximdo-tcp{COLON}			{ YDVAR(1, VAR_DO_TCP) }
235158287Smaximtcp-upstream{COLON}		{ YDVAR(1, VAR_TCP_UPSTREAM) }
236158287Smaximtcp-mss{COLON}			{ YDVAR(1, VAR_TCP_MSS) }
237158287Smaximoutgoing-tcp-mss{COLON}		{ YDVAR(1, VAR_OUTGOING_TCP_MSS) }
238158287Smaximtcp-idle-timeout{COLON}		{ YDVAR(1, VAR_TCP_IDLE_TIMEOUT) }
239158287Smaximedns-tcp-keepalive{COLON}	{ YDVAR(1, VAR_EDNS_TCP_KEEPALIVE) }
240158287Smaximedns-tcp-keepalive-timeout{COLON} { YDVAR(1, VAR_EDNS_TCP_KEEPALIVE_TIMEOUT) }
241158287Smaximssl-upstream{COLON}		{ YDVAR(1, VAR_SSL_UPSTREAM) }
242158287Smaximtls-upstream{COLON}		{ YDVAR(1, VAR_SSL_UPSTREAM) }
243158287Smaximssl-service-key{COLON}		{ YDVAR(1, VAR_SSL_SERVICE_KEY) }
244158287Smaximtls-service-key{COLON}		{ YDVAR(1, VAR_SSL_SERVICE_KEY) }
245158287Smaximssl-service-pem{COLON}		{ YDVAR(1, VAR_SSL_SERVICE_PEM) }
246158287Smaximtls-service-pem{COLON}		{ YDVAR(1, VAR_SSL_SERVICE_PEM) }
247158287Smaximssl-port{COLON}			{ YDVAR(1, VAR_SSL_PORT) }
248158287Smaximtls-port{COLON}			{ YDVAR(1, VAR_SSL_PORT) }
249158287Smaximssl-cert-bundle{COLON}		{ YDVAR(1, VAR_TLS_CERT_BUNDLE) }
250158287Smaximtls-cert-bundle{COLON}		{ YDVAR(1, VAR_TLS_CERT_BUNDLE) }
251158287Smaximtls-win-cert{COLON}		{ YDVAR(1, VAR_TLS_WIN_CERT) }
252158287Smaximadditional-ssl-port{COLON}	{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
253158287Smaximadditional-tls-port{COLON}	{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
254158287Smaximtls-additional-ports{COLON}	{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
255158287Smaximtls-additional-port{COLON}	{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
256158287Smaximtls-session-ticket-keys{COLON}	{ YDVAR(1, VAR_TLS_SESSION_TICKET_KEYS) }
257158287Smaximtls-ciphers{COLON}		{ YDVAR(1, VAR_TLS_CIPHERS) }
258158287Smaximtls-ciphersuites{COLON}		{ YDVAR(1, VAR_TLS_CIPHERSUITES) }
259158287Smaximtls-use-sni{COLON}		{ YDVAR(1, VAR_TLS_USE_SNI) }
260158287Smaximhttps-port{COLON}		{ YDVAR(1, VAR_HTTPS_PORT) }
261158287Smaximhttp-endpoint{COLON}		{ YDVAR(1, VAR_HTTP_ENDPOINT) }
262158287Smaximhttp-max-streams{COLON}		{ YDVAR(1, VAR_HTTP_MAX_STREAMS) }
263158287Smaximhttp-query-buffer-size{COLON}	{ YDVAR(1, VAR_HTTP_QUERY_BUFFER_SIZE) }
264158287Smaximhttp-response-buffer-size{COLON} { YDVAR(1, VAR_HTTP_RESPONSE_BUFFER_SIZE) }
265158287Smaximhttp-nodelay{COLON}		{ YDVAR(1, VAR_HTTP_NODELAY) }
266158287Smaximhttp-notls-downstream{COLON}	{ YDVAR(1, VAR_HTTP_NOTLS_DOWNSTREAM) }
267158287Smaximuse-systemd{COLON}		{ YDVAR(1, VAR_USE_SYSTEMD) }
268158287Smaximdo-daemonize{COLON}		{ YDVAR(1, VAR_DO_DAEMONIZE) }
269158287Smaximinterface{COLON}		{ YDVAR(1, VAR_INTERFACE) }
270158287Smaximip-address{COLON}		{ YDVAR(1, VAR_INTERFACE) }
271158287Smaximoutgoing-interface{COLON}	{ YDVAR(1, VAR_OUTGOING_INTERFACE) }
272158287Smaximinterface-automatic{COLON}	{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) }
273158287Smaximso-rcvbuf{COLON}		{ YDVAR(1, VAR_SO_RCVBUF) }
274158287Smaximso-sndbuf{COLON}		{ YDVAR(1, VAR_SO_SNDBUF) }
275158287Smaximso-reuseport{COLON}		{ YDVAR(1, VAR_SO_REUSEPORT) }
276158287Smaximip-transparent{COLON}		{ YDVAR(1, VAR_IP_TRANSPARENT) }
277158287Smaximip-freebind{COLON}		{ YDVAR(1, VAR_IP_FREEBIND) }
278158287Smaximip-dscp{COLON}		{ YDVAR(1, VAR_IP_DSCP) }
279158287Smaximchroot{COLON}			{ YDVAR(1, VAR_CHROOT) }
280158287Smaximusername{COLON}			{ YDVAR(1, VAR_USERNAME) }
281158287Smaximdirectory{COLON}		{ YDVAR(1, VAR_DIRECTORY) }
282158287Smaximlogfile{COLON}			{ YDVAR(1, VAR_LOGFILE) }
283158287Smaximpidfile{COLON}			{ YDVAR(1, VAR_PIDFILE) }
284240954Skevloroot-hints{COLON}		{ YDVAR(1, VAR_ROOT_HINTS) }
285158287Smaximstream-wait-size{COLON}		{ YDVAR(1, VAR_STREAM_WAIT_SIZE) }
286158287Smaximedns-buffer-size{COLON}		{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
287158287Smaximmsg-buffer-size{COLON}		{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
288158287Smaximmsg-cache-size{COLON}		{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
289158287Smaximmsg-cache-slabs{COLON}		{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
290158287Smaximrrset-cache-size{COLON}		{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
291158287Smaximrrset-cache-slabs{COLON}	{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
292240954Skevlocache-max-ttl{COLON}     	{ YDVAR(1, VAR_CACHE_MAX_TTL) }
293158287Smaximcache-max-negative-ttl{COLON}   { YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
294158287Smaximcache-min-ttl{COLON}     	{ YDVAR(1, VAR_CACHE_MIN_TTL) }
295240954Skevloinfra-host-ttl{COLON}		{ YDVAR(1, VAR_INFRA_HOST_TTL) }
296240954Skevloinfra-lame-ttl{COLON}		{ YDVAR(1, VAR_INFRA_LAME_TTL) }
297158287Smaximinfra-cache-slabs{COLON}	{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
298158287Smaximinfra-cache-numhosts{COLON}	{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
299240954Skevloinfra-cache-lame-size{COLON}	{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
300240954Skevloinfra-cache-min-rtt{COLON}	{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
301240954Skevloinfra-keep-probing{COLON}	{ YDVAR(1, VAR_INFRA_KEEP_PROBING) }
302240954Skevlonum-queries-per-thread{COLON}	{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
303240954Skevlojostle-timeout{COLON}		{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
304240954Skevlodelay-close{COLON}		{ YDVAR(1, VAR_DELAY_CLOSE) }
305240954Skevloudp-connect{COLON}		{ YDVAR(1, VAR_UDP_CONNECT) }
306240954Skevlotarget-fetch-policy{COLON}	{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
307240954Skevloharden-short-bufsize{COLON}	{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
308240954Skevloharden-large-queries{COLON}	{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
309240954Skevloharden-glue{COLON}		{ YDVAR(1, VAR_HARDEN_GLUE) }
310240954Skevloharden-dnssec-stripped{COLON}	{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
311240954Skevloharden-below-nxdomain{COLON}	{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
312240954Skevloharden-referral-path{COLON}	{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
313240954Skevloharden-algo-downgrade{COLON}	{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
314240954Skevlouse-caps-for-id{COLON}		{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
315240954Skevlocaps-whitelist{COLON}		{ YDVAR(1, VAR_CAPS_WHITELIST) }
316240954Skevlocaps-exempt{COLON}		{ YDVAR(1, VAR_CAPS_WHITELIST) }
317158287Smaximunwanted-reply-threshold{COLON}	{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
318158287Smaximprivate-address{COLON}		{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
319158287Smaximprivate-domain{COLON}		{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
320158287Smaximprefetch-key{COLON}		{ YDVAR(1, VAR_PREFETCH_KEY) }
321158287Smaximprefetch{COLON}			{ YDVAR(1, VAR_PREFETCH) }
322158287Smaximdeny-any{COLON}			{ YDVAR(1, VAR_DENY_ANY) }
323158287Smaximstub-zone{COLON}		{ YDVAR(0, VAR_STUB_ZONE) }
324158287Smaximname{COLON}			{ YDVAR(1, VAR_NAME) }
325158287Smaximstub-addr{COLON}		{ YDVAR(1, VAR_STUB_ADDR) }
326158287Smaximstub-host{COLON}		{ YDVAR(1, VAR_STUB_HOST) }
327158287Smaximstub-prime{COLON}		{ YDVAR(1, VAR_STUB_PRIME) }
328158287Smaximstub-first{COLON}		{ YDVAR(1, VAR_STUB_FIRST) }
329158287Smaximstub-no-cache{COLON}		{ YDVAR(1, VAR_STUB_NO_CACHE) }
330158287Smaximstub-ssl-upstream{COLON}	{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
331158287Smaximstub-tls-upstream{COLON}	{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
332158287Smaximforward-zone{COLON}		{ YDVAR(0, VAR_FORWARD_ZONE) }
333158287Smaximforward-addr{COLON}		{ YDVAR(1, VAR_FORWARD_ADDR) }
334158287Smaximforward-host{COLON}		{ YDVAR(1, VAR_FORWARD_HOST) }
335158287Smaximforward-first{COLON}		{ YDVAR(1, VAR_FORWARD_FIRST) }
336158287Smaximforward-no-cache{COLON}		{ YDVAR(1, VAR_FORWARD_NO_CACHE) }
337158287Smaximforward-ssl-upstream{COLON}	{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
338158287Smaximforward-tls-upstream{COLON}	{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
339158287Smaximauth-zone{COLON}		{ YDVAR(0, VAR_AUTH_ZONE) }
340158287Smaximrpz{COLON}			{ YDVAR(0, VAR_RPZ) }
341158287Smaximtags{COLON}			{ YDVAR(1, VAR_TAGS) }
342158287Smaximrpz-action-override{COLON}	{ YDVAR(1, VAR_RPZ_ACTION_OVERRIDE) }
343158287Smaximrpz-cname-override{COLON}	{ YDVAR(1, VAR_RPZ_CNAME_OVERRIDE) }
344158287Smaximrpz-log{COLON}			{ YDVAR(1, VAR_RPZ_LOG) }
345158287Smaximrpz-log-name{COLON}		{ YDVAR(1, VAR_RPZ_LOG_NAME) }
346158287Smaximzonefile{COLON}			{ YDVAR(1, VAR_ZONEFILE) }
347158287Smaximmaster{COLON}			{ YDVAR(1, VAR_MASTER) }
348158287Smaximprimary{COLON}			{ YDVAR(1, VAR_MASTER) }
349158287Smaximurl{COLON}			{ YDVAR(1, VAR_URL) }
350158287Smaximallow-notify{COLON}		{ YDVAR(1, VAR_ALLOW_NOTIFY) }
351158287Smaximfor-downstream{COLON}		{ YDVAR(1, VAR_FOR_DOWNSTREAM) }
352158287Smaximfor-upstream{COLON}		{ YDVAR(1, VAR_FOR_UPSTREAM) }
353158287Smaximfallback-enabled{COLON}		{ YDVAR(1, VAR_FALLBACK_ENABLED) }
354158287Smaximview{COLON}			{ YDVAR(0, VAR_VIEW) }
355158287Smaximview-first{COLON}		{ YDVAR(1, VAR_VIEW_FIRST) }
356158287Smaximdo-not-query-address{COLON}	{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
357158287Smaximdo-not-query-localhost{COLON}	{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
358158287Smaximaccess-control{COLON}		{ YDVAR(2, VAR_ACCESS_CONTROL) }
359158287Smaximsend-client-subnet{COLON}	{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
360158287Smaximclient-subnet-zone{COLON}	{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) }
361158287Smaximclient-subnet-always-forward{COLON} { YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
362158287Smaximclient-subnet-opcode{COLON}	{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) }
363158287Smaximmax-client-subnet-ipv4{COLON}	{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) }
364158287Smaximmax-client-subnet-ipv6{COLON}	{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) }
365158287Smaximmin-client-subnet-ipv4{COLON}	{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV4) }
366158287Smaximmin-client-subnet-ipv6{COLON}	{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV6) }
367158287Smaximmax-ecs-tree-size-ipv4{COLON}	{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV4) }
368158287Smaximmax-ecs-tree-size-ipv6{COLON}	{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) }
369158287Smaximhide-identity{COLON}		{ YDVAR(1, VAR_HIDE_IDENTITY) }
370158287Smaximhide-version{COLON}		{ YDVAR(1, VAR_HIDE_VERSION) }
371158287Smaximhide-trustanchor{COLON}		{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
372158287Smaximidentity{COLON}			{ YDVAR(1, VAR_IDENTITY) }
373158287Smaximversion{COLON}			{ YDVAR(1, VAR_VERSION) }
374158287Smaximmodule-config{COLON}     	{ YDVAR(1, VAR_MODULE_CONF) }
375158287Smaximdlv-anchor{COLON}		{ YDVAR(1, VAR_DLV_ANCHOR) }
376158287Smaximdlv-anchor-file{COLON}		{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
377158287Smaximtrust-anchor-file{COLON}	{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
378158287Smaximauto-trust-anchor-file{COLON}	{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
379158287Smaximtrusted-keys-file{COLON}	{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
380158287Smaximtrust-anchor{COLON}		{ YDVAR(1, VAR_TRUST_ANCHOR) }
381158287Smaximtrust-anchor-signaling{COLON}	{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
382158287Smaximroot-key-sentinel{COLON}	{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) }
383158287Smaximval-override-date{COLON}	{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
384158287Smaximval-sig-skew-min{COLON}		{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
385158287Smaximval-sig-skew-max{COLON}		{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
386158287Smaximval-bogus-ttl{COLON}		{ YDVAR(1, VAR_BOGUS_TTL) }
387158287Smaximval-clean-additional{COLON}	{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
388158287Smaximval-permissive-mode{COLON}	{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
389158287Smaximaggressive-nsec{COLON}		{ YDVAR(1, VAR_AGGRESSIVE_NSEC) }
390158287Smaximignore-cd-flag{COLON}		{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
391158287Smaximserve-expired{COLON}		{ YDVAR(1, VAR_SERVE_EXPIRED) }
392158287Smaximserve-expired-ttl{COLON}	{ YDVAR(1, VAR_SERVE_EXPIRED_TTL) }
393158287Smaximserve-expired-ttl-reset{COLON}	{ YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) }
394158287Smaximserve-expired-reply-ttl{COLON}	{ YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) }
395158287Smaximserve-expired-client-timeout{COLON}	{ YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) }
396158287Smaximserve-original-ttl{COLON}	{ YDVAR(1, VAR_SERVE_ORIGINAL_TTL) }
397158287Smaximfake-dsa{COLON}			{ YDVAR(1, VAR_FAKE_DSA) }
398158287Smaximfake-sha1{COLON}		{ YDVAR(1, VAR_FAKE_SHA1) }
399158287Smaximval-log-level{COLON}		{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
400158287Smaximkey-cache-size{COLON}		{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
401158287Smaximkey-cache-slabs{COLON}		{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
402158287Smaximneg-cache-size{COLON}		{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
403158287Smaximval-nsec3-keysize-iterations{COLON}	{
404158287Smaxim				  YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
405158287Smaximadd-holddown{COLON}		{ YDVAR(1, VAR_ADD_HOLDDOWN) }
406158287Smaximdel-holddown{COLON}		{ YDVAR(1, VAR_DEL_HOLDDOWN) }
407158287Smaximkeep-missing{COLON}		{ YDVAR(1, VAR_KEEP_MISSING) }
408158287Smaximpermit-small-holddown{COLON}	{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
409158287Smaximuse-syslog{COLON}		{ YDVAR(1, VAR_USE_SYSLOG) }
410158287Smaximlog-identity{COLON}		{ YDVAR(1, VAR_LOG_IDENTITY) }
411158287Smaximlog-time-ascii{COLON}		{ YDVAR(1, VAR_LOG_TIME_ASCII) }
412158287Smaximlog-queries{COLON}		{ YDVAR(1, VAR_LOG_QUERIES) }
413158287Smaximlog-replies{COLON}		{ YDVAR(1, VAR_LOG_REPLIES) }
414158287Smaximlog-tag-queryreply{COLON}	{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) }
415158287Smaximlog-local-actions{COLON}       { YDVAR(1, VAR_LOG_LOCAL_ACTIONS) }
416158287Smaximlog-servfail{COLON}		{ YDVAR(1, VAR_LOG_SERVFAIL) }
417158287Smaximlocal-zone{COLON}		{ YDVAR(2, VAR_LOCAL_ZONE) }
418158287Smaximlocal-data{COLON}		{ YDVAR(1, VAR_LOCAL_DATA) }
419158287Smaximlocal-data-ptr{COLON}		{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
420158287Smaximunblock-lan-zones{COLON}	{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
421158287Smaximinsecure-lan-zones{COLON}	{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
422158287Smaximstatistics-interval{COLON}	{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
423158287Smaximstatistics-cumulative{COLON}	{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
424158287Smaximextended-statistics{COLON}	{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
425158287Smaximshm-enable{COLON}		{ YDVAR(1, VAR_SHM_ENABLE) }
426158287Smaximshm-key{COLON}			{ YDVAR(1, VAR_SHM_KEY) }
427158287Smaximremote-control{COLON}		{ YDVAR(0, VAR_REMOTE_CONTROL) }
428158287Smaximcontrol-enable{COLON}		{ YDVAR(1, VAR_CONTROL_ENABLE) }
429158287Smaximcontrol-interface{COLON}	{ YDVAR(1, VAR_CONTROL_INTERFACE) }
430158287Smaximcontrol-port{COLON}		{ YDVAR(1, VAR_CONTROL_PORT) }
431158287Smaximcontrol-use-cert{COLON}		{ YDVAR(1, VAR_CONTROL_USE_CERT) }
432158287Smaximserver-key-file{COLON}		{ YDVAR(1, VAR_SERVER_KEY_FILE) }
433158287Smaximserver-cert-file{COLON}		{ YDVAR(1, VAR_SERVER_CERT_FILE) }
434158287Smaximcontrol-key-file{COLON}		{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
435158287Smaximcontrol-cert-file{COLON}	{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
436158287Smaximpython-script{COLON}		{ YDVAR(1, VAR_PYTHON_SCRIPT) }
437158287Smaximpython{COLON}			{ YDVAR(0, VAR_PYTHON) }
438158287Smaximdynlib-file{COLON}		{ YDVAR(1, VAR_DYNLIB_FILE) }
439158287Smaximdynlib{COLON}			{ YDVAR(0, VAR_DYNLIB) }
440158287Smaximdomain-insecure{COLON}		{ YDVAR(1, VAR_DOMAIN_INSECURE) }
441158287Smaximminimal-responses{COLON}	{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
442158287Smaximrrset-roundrobin{COLON}		{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
443158287Smaximunknown-server-time-limit{COLON} { YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) }
444158287Smaximmax-udp-size{COLON}		{ YDVAR(1, VAR_MAX_UDP_SIZE) }
445158287Smaximdns64-prefix{COLON}		{ YDVAR(1, VAR_DNS64_PREFIX) }
446158287Smaximdns64-synthall{COLON}		{ YDVAR(1, VAR_DNS64_SYNTHALL) }
447158287Smaximdns64-ignore-aaaa{COLON}	{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) }
448158287Smaximdefine-tag{COLON}		{ YDVAR(1, VAR_DEFINE_TAG) }
449158287Smaximlocal-zone-tag{COLON}		{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
450158287Smaximaccess-control-tag{COLON}	{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
451158287Smaximaccess-control-tag-action{COLON} { YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
452158287Smaximaccess-control-tag-data{COLON}	{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
453158287Smaximaccess-control-view{COLON}	{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
454158287Smaximlocal-zone-override{COLON}	{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
455158287Smaximdnstap{COLON}			{ YDVAR(0, VAR_DNSTAP) }
456158287Smaximdnstap-enable{COLON}		{ YDVAR(1, VAR_DNSTAP_ENABLE) }
457158287Smaximdnstap-bidirectional{COLON}	{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) }
458158287Smaximdnstap-socket-path{COLON}	{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
459158287Smaximdnstap-ip{COLON}		{ YDVAR(1, VAR_DNSTAP_IP) }
460158287Smaximdnstap-tls{COLON}		{ YDVAR(1, VAR_DNSTAP_TLS) }
461158287Smaximdnstap-tls-server-name{COLON}	{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) }
462158287Smaximdnstap-tls-cert-bundle{COLON}	{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) }
463158287Smaximdnstap-tls-client-key-file{COLON}	{
464158287Smaxim		YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) }
465158287Smaximdnstap-tls-client-cert-file{COLON}	{
466158287Smaxim		YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) }
467158287Smaximdnstap-send-identity{COLON}	{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
468158287Smaximdnstap-send-version{COLON}	{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
469158287Smaximdnstap-identity{COLON}		{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
470158287Smaximdnstap-version{COLON}		{ YDVAR(1, VAR_DNSTAP_VERSION) }
471158287Smaximdnstap-log-resolver-query-messages{COLON}	{
472158287Smaxim		YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
473158287Smaximdnstap-log-resolver-response-messages{COLON}	{
474158287Smaxim		YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
475158287Smaximdnstap-log-client-query-messages{COLON}		{
476158287Smaxim		YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
477158287Smaximdnstap-log-client-response-messages{COLON}	{
478158287Smaxim		YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
479158287Smaximdnstap-log-forwarder-query-messages{COLON}	{
480158287Smaxim		YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
481158287Smaximdnstap-log-forwarder-response-messages{COLON}	{
482158287Smaxim		YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
483158287Smaximdisable-dnssec-lame-check{COLON} { YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
484158287Smaximip-ratelimit{COLON}		{ YDVAR(1, VAR_IP_RATELIMIT) }
485158287Smaximratelimit{COLON}		{ YDVAR(1, VAR_RATELIMIT) }
486158287Smaximip-ratelimit-slabs{COLON}		{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
487158287Smaximratelimit-slabs{COLON}		{ YDVAR(1, VAR_RATELIMIT_SLABS) }
488158287Smaximip-ratelimit-size{COLON}		{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
489158287Smaximratelimit-size{COLON}		{ YDVAR(1, VAR_RATELIMIT_SIZE) }
490158287Smaximratelimit-for-domain{COLON}	{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
491158287Smaximratelimit-below-domain{COLON}	{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
492158287Smaximip-ratelimit-factor{COLON}		{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
493158287Smaximratelimit-factor{COLON}		{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
494158287Smaximlow-rtt{COLON}			{ YDVAR(1, VAR_LOW_RTT) }
495158287Smaximfast-server-num{COLON}		{ YDVAR(1, VAR_FAST_SERVER_NUM) }
496158287Smaximlow-rtt-pct{COLON}		{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
497158287Smaximlow-rtt-permil{COLON}		{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
498158287Smaximfast-server-permil{COLON}	{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
499158287Smaximresponse-ip-tag{COLON}		{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
500158287Smaximresponse-ip{COLON}		{ YDVAR(2, VAR_RESPONSE_IP) }
501158287Smaximresponse-ip-data{COLON}		{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
502158287Smaximdnscrypt{COLON}			{ YDVAR(0, VAR_DNSCRYPT) }
503158287Smaximdnscrypt-enable{COLON}		{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
504158287Smaximdnscrypt-port{COLON}		{ YDVAR(1, VAR_DNSCRYPT_PORT) }
505158287Smaximdnscrypt-provider{COLON}	{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
506158287Smaximdnscrypt-secret-key{COLON}	{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
507158287Smaximdnscrypt-provider-cert{COLON}	{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
508158287Smaximdnscrypt-provider-cert-rotated{COLON}	{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
509158287Smaximdnscrypt-shared-secret-cache-size{COLON}	{
510158287Smaxim		YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
511158287Smaximdnscrypt-shared-secret-cache-slabs{COLON}	{
512158287Smaxim		YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
513158287Smaximdnscrypt-nonce-cache-size{COLON}	{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
514158287Smaximdnscrypt-nonce-cache-slabs{COLON}	{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
515158287Smaximpad-responses{COLON}		{ YDVAR(1, VAR_PAD_RESPONSES) }
516158287Smaximpad-responses-block-size{COLON}	{ YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) }
517158287Smaximpad-queries{COLON}		{ YDVAR(1, VAR_PAD_QUERIES) }
518158287Smaximpad-queries-block-size{COLON}	{ YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) }
519158287Smaximipsecmod-enabled{COLON}		{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
520158287Smaximipsecmod-ignore-bogus{COLON}	{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
521158287Smaximipsecmod-hook{COLON}		{ YDVAR(1, VAR_IPSECMOD_HOOK) }
522158287Smaximipsecmod-max-ttl{COLON}		{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
523158289Sumeipsecmod-whitelist{COLON}	{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
524158289Sumeipsecmod-allow{COLON}		{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
525158289Sumeipsecmod-strict{COLON}		{ YDVAR(1, VAR_IPSECMOD_STRICT) }
526158287Smaximcachedb{COLON}			{ YDVAR(0, VAR_CACHEDB) }
527158287Smaximbackend{COLON}			{ YDVAR(1, VAR_CACHEDB_BACKEND) }
528158287Smaximsecret-seed{COLON}		{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
529158287Smaximredis-server-host{COLON}	{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
530158287Smaximredis-server-port{COLON}	{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
531158287Smaximredis-timeout{COLON}		{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
532158287Smaximredis-expire-records{COLON}	{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) }
533158287Smaximipset{COLON}			{ YDVAR(0, VAR_IPSET) }
534158287Smaximname-v4{COLON}			{ YDVAR(1, VAR_IPSET_NAME_V4) }
535158287Smaximname-v6{COLON}			{ YDVAR(1, VAR_IPSET_NAME_V6) }
536158287Smaximudp-upstream-without-downstream{COLON} { YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
537158287Smaximtcp-connection-limit{COLON}	{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
538158287Smaximedns-client-string{COLON}	{ YDVAR(2, VAR_EDNS_CLIENT_STRING) }
539158287Smaximedns-client-string-opcode{COLON} { YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) }
540158287Smaximnsid{COLON}			{ YDVAR(1, VAR_NSID ) }
541158287Smaxim<INITIAL,val>{NEWLINE}		{ LEXOUT(("NL\n")); cfg_parser->line++; }
542158287Smaxim
543158287Smaxim	/* Quoted strings. Strip leading and ending quotes */
544158287Smaxim<val>\"			{ BEGIN(quotedstring); LEXOUT(("QS ")); }
545158287Smaxim<quotedstring><<EOF>>   {
546158287Smaxim        ub_c_error("EOF inside quoted string");
547158287Smaxim	if(--num_args == 0) { BEGIN(INITIAL); }
548158287Smaxim	else		    { BEGIN(val); }
549158287Smaxim}
550158287Smaxim<quotedstring>{DQANY}*  { LEXOUT(("STR(%s) ", ub_c_text)); yymore(); }
551158287Smaxim<quotedstring>{NEWLINE} { ub_c_error("newline inside quoted string, no end \"");
552158287Smaxim			  cfg_parser->line++; BEGIN(INITIAL); }
553158287Smaxim<quotedstring>\" {
554158287Smaxim        LEXOUT(("QE "));
555158287Smaxim	if(--num_args == 0) { BEGIN(INITIAL); }
556158287Smaxim	else		    { BEGIN(val); }
557158287Smaxim        ub_c_text[ub_c_leng - 1] = '\0';
558158287Smaxim	ub_c_lval.str = strdup(ub_c_text);
559158287Smaxim	if(!ub_c_lval.str)
560158287Smaxim		ub_c_error("out of memory");
561158287Smaxim        return STRING_ARG;
562158287Smaxim}
563158287Smaxim
564158287Smaxim	/* Single Quoted strings. Strip leading and ending quotes */
565158287Smaxim<val>\'			{ BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
566158287Smaxim<singlequotedstr><<EOF>>   {
567158287Smaxim        ub_c_error("EOF inside quoted string");
568158287Smaxim	if(--num_args == 0) { BEGIN(INITIAL); }
569158287Smaxim	else		    { BEGIN(val); }
570158287Smaxim}
571158287Smaxim<singlequotedstr>{SQANY}*  { LEXOUT(("STR(%s) ", ub_c_text)); yymore(); }
572158287Smaxim<singlequotedstr>{NEWLINE} { ub_c_error("newline inside quoted string, no end '");
573158287Smaxim			     cfg_parser->line++; BEGIN(INITIAL); }
574158287Smaxim<singlequotedstr>\' {
575158287Smaxim        LEXOUT(("SQE "));
576202198Sed	if(--num_args == 0) { BEGIN(INITIAL); }
577202198Sed	else		    { BEGIN(val); }
578250942Sghelmer        ub_c_text[ub_c_leng - 1] = '\0';
579250942Sghelmer	ub_c_lval.str = strdup(ub_c_text);
580250942Sghelmer	if(!ub_c_lval.str)
581250942Sghelmer		ub_c_error("out of memory");
582250942Sghelmer        return STRING_ARG;
583250942Sghelmer}
584250942Sghelmer
585250942Sghelmer	/* include: directive */
586250942Sghelmer<INITIAL,val>include{COLON}	{
587250942Sghelmer	LEXOUT(("v(%s) ", ub_c_text)); inc_prev = YYSTATE; BEGIN(include); }
588250942Sghelmer<include><<EOF>>	{
589250942Sghelmer        ub_c_error("EOF inside include directive");
590250942Sghelmer        BEGIN(inc_prev);
591250942Sghelmer}
592250942Sghelmer<include>{SPACE}*	{ LEXOUT(("ISP ")); /* ignore */ }
593250942Sghelmer<include>{NEWLINE}	{ LEXOUT(("NL\n")); cfg_parser->line++;}
594250942Sghelmer<include>\"		{ LEXOUT(("IQS ")); BEGIN(include_quoted); }
595250942Sghelmer<include>{UNQUOTEDLETTER}*	{
596250942Sghelmer	LEXOUT(("Iunquotedstr(%s) ", ub_c_text));
597250942Sghelmer	config_start_include_glob(ub_c_text, 0);
598250942Sghelmer	BEGIN(inc_prev);
599250942Sghelmer}
600250942Sghelmer<include_quoted><<EOF>>	{
601250942Sghelmer        ub_c_error("EOF inside quoted string");
602250942Sghelmer        BEGIN(inc_prev);
603250942Sghelmer}
604250942Sghelmer<include_quoted>{DQANY}*	{ LEXOUT(("ISTR(%s) ", ub_c_text)); yymore(); }
605250942Sghelmer<include_quoted>{NEWLINE}	{ ub_c_error("newline before \" in include name");
606250942Sghelmer				  cfg_parser->line++; BEGIN(inc_prev); }
607250942Sghelmer<include_quoted>\"	{
608250942Sghelmer	LEXOUT(("IQE "));
609250942Sghelmer	ub_c_text[ub_c_leng - 1] = '\0';
610250942Sghelmer	config_start_include_glob(ub_c_text,0);
611250942Sghelmer	BEGIN(inc_prev);
612250942Sghelmer}
613250942Sghelmer<INITIAL,val><<EOF>>	{
614250942Sghelmer	LEXOUT(("LEXEOF "));
615250942Sghelmer	yy_set_bol(1); /* Set beginning of line, so "^" rules match.  */
616250942Sghelmer	if (!config_include_stack) {
617250942Sghelmer		yyterminate();
618250942Sghelmer	} else {
619202198Sed		fclose(yyin);
620202198Sed		int prev_toplevel = inc_toplevel;
621202198Sed		fclose(ub_c_in);
622202198Sed		config_end_include();
623202198Sed		if(prev_toplevel) return (VAR_FORCE_TOPLEVEL);
624202198Sed	}
625202198Sed}
626202198Sed
627202198Sed	/* include-toplevel: directive */
628202198Sed<INITIAL,val>include-toplevel{COLON} {
629202198Sed	LEXOUT(("v(%s) ", ub_c_text)); inc_prev = YYSTATE; BEGIN(include_toplevel);
630202198Sed}
631202198Sed<include_toplevel><<EOF>> {
632202198Sed	ub_c_error("EOF inside include_toplevel directive");
633202198Sed	BEGIN(inc_prev);
634202198Sed}
635202718Sed<include_toplevel>{SPACE}* { LEXOUT(("ITSP ")); /* ignore */ }
636202718Sed<include_toplevel>{NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++; }
637202718Sed<include_toplevel>\" { LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); }
638202198Sed<include_toplevel>{UNQUOTEDLETTER}* {
639202198Sed	LEXOUT(("ITunquotedstr(%s) ", ub_c_text));
640202198Sed	config_start_include_glob(ub_c_text, 1);
641202198Sed	BEGIN(inc_prev);
642202198Sed	return (VAR_FORCE_TOPLEVEL);
643202198Sed}
644202198Sed<include_toplevel_quoted><<EOF>> {
645202198Sed	ub_c_error("EOF inside quoted string");
646202198Sed	BEGIN(inc_prev);
647202198Sed}
648202198Sed<include_toplevel_quoted>{DQANY}* { LEXOUT(("ITSTR(%s) ", ub_c_text)); yymore(); }
649202198Sed<include_toplevel_quoted>{NEWLINE} {
650202198Sed	ub_c_error("newline before \" in include name");
651202198Sed	cfg_parser->line++; BEGIN(inc_prev);
652202198Sed}
653202198Sed<include_toplevel_quoted>\" {
654202198Sed	LEXOUT(("ITQE "));
655202559Sed	ub_c_text[yyleng - 1] = '\0';
656202559Sed	config_start_include_glob(ub_c_text, 1);
657202198Sed	BEGIN(inc_prev);
658226841Sed	return (VAR_FORCE_TOPLEVEL);
659226841Sed}
660226841Sed
661226841Sed<val>{UNQUOTEDLETTER}*	{ LEXOUT(("unquotedstr(%s) ", ub_c_text));
662226841Sed			if(--num_args == 0) { BEGIN(INITIAL); }
663226841Sed			ub_c_lval.str = strdup(ub_c_text); return STRING_ARG; }
664226841Sed
665226841Sed{UNQUOTEDLETTER_NOCOLON}*	{
666226841Sed	ub_c_error_msg("unknown keyword '%s'", ub_c_text);
667226841Sed	}
668226841Sed
669202198Sed<*>.	{
670202198Sed	ub_c_error_msg("stray '%s'", ub_c_text);
671202198Sed	}
672202559Sed
673202198Sed%%
674202198Sed