xref: /freebsd/contrib/unbound/util/configparser.y (revision a2aef24aa3c8458e4036735dd6928b4ef77294e5)
1 /*
2  * configparser.y -- yacc grammar for unbound configuration files
3  *
4  * Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
5  *
6  * Copyright (c) 2007, NLnet Labs. All rights reserved.
7  *
8  * This software is open source.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  *
14  * Redistributions of source code must retain the above copyright notice,
15  * this list of conditions and the following disclaimer.
16  *
17  * Redistributions in binary form must reproduce the above copyright notice,
18  * this list of conditions and the following disclaimer in the documentation
19  * and/or other materials provided with the distribution.
20  *
21  * Neither the name of the NLNET LABS nor the names of its contributors may
22  * be used to endorse or promote products derived from this software without
23  * specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
31  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  */
37 
38 %{
39 #include "config.h"
40 
41 #include <stdarg.h>
42 #include <stdio.h>
43 #include <string.h>
44 #include <stdlib.h>
45 #include <assert.h>
46 
47 #include "util/configyyrename.h"
48 #include "util/config_file.h"
49 #include "util/net_help.h"
50 
51 int ub_c_lex(void);
52 void ub_c_error(const char *message);
53 
54 /* these need to be global, otherwise they cannot be used inside yacc */
55 extern struct config_parser_state* cfg_parser;
56 
57 #if 0
58 #define OUTYY(s)  printf s /* used ONLY when debugging */
59 #else
60 #define OUTYY(s)
61 #endif
62 
63 %}
64 %union {
65 	char*	str;
66 };
67 
68 %token SPACE LETTER NEWLINE COMMENT COLON ANY ZONESTR
69 %token <str> STRING_ARG
70 %token VAR_SERVER VAR_VERBOSITY VAR_NUM_THREADS VAR_PORT
71 %token VAR_OUTGOING_RANGE VAR_INTERFACE
72 %token VAR_DO_IP4 VAR_DO_IP6 VAR_PREFER_IP6 VAR_DO_UDP VAR_DO_TCP
73 %token VAR_TCP_MSS VAR_OUTGOING_TCP_MSS
74 %token VAR_CHROOT VAR_USERNAME VAR_DIRECTORY VAR_LOGFILE VAR_PIDFILE
75 %token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS VAR_NUM_QUERIES_PER_THREAD
76 %token VAR_RRSET_CACHE_SIZE VAR_RRSET_CACHE_SLABS VAR_OUTGOING_NUM_TCP
77 %token VAR_INFRA_HOST_TTL VAR_INFRA_LAME_TTL VAR_INFRA_CACHE_SLABS
78 %token VAR_INFRA_CACHE_NUMHOSTS VAR_INFRA_CACHE_LAME_SIZE VAR_NAME
79 %token VAR_STUB_ZONE VAR_STUB_HOST VAR_STUB_ADDR VAR_TARGET_FETCH_POLICY
80 %token VAR_HARDEN_SHORT_BUFSIZE VAR_HARDEN_LARGE_QUERIES
81 %token VAR_FORWARD_ZONE VAR_FORWARD_HOST VAR_FORWARD_ADDR
82 %token VAR_DO_NOT_QUERY_ADDRESS VAR_HIDE_IDENTITY VAR_HIDE_VERSION
83 %token VAR_IDENTITY VAR_VERSION VAR_HARDEN_GLUE VAR_MODULE_CONF
84 %token VAR_TRUST_ANCHOR_FILE VAR_TRUST_ANCHOR VAR_VAL_OVERRIDE_DATE
85 %token VAR_BOGUS_TTL VAR_VAL_CLEAN_ADDITIONAL VAR_VAL_PERMISSIVE_MODE
86 %token VAR_INCOMING_NUM_TCP VAR_MSG_BUFFER_SIZE VAR_KEY_CACHE_SIZE
87 %token VAR_KEY_CACHE_SLABS VAR_TRUSTED_KEYS_FILE
88 %token VAR_VAL_NSEC3_KEYSIZE_ITERATIONS VAR_USE_SYSLOG
89 %token VAR_OUTGOING_INTERFACE VAR_ROOT_HINTS VAR_DO_NOT_QUERY_LOCALHOST
90 %token VAR_CACHE_MAX_TTL VAR_HARDEN_DNSSEC_STRIPPED VAR_ACCESS_CONTROL
91 %token VAR_LOCAL_ZONE VAR_LOCAL_DATA VAR_INTERFACE_AUTOMATIC
92 %token VAR_STATISTICS_INTERVAL VAR_DO_DAEMONIZE VAR_USE_CAPS_FOR_ID
93 %token VAR_STATISTICS_CUMULATIVE VAR_OUTGOING_PORT_PERMIT
94 %token VAR_OUTGOING_PORT_AVOID VAR_DLV_ANCHOR_FILE VAR_DLV_ANCHOR
95 %token VAR_NEG_CACHE_SIZE VAR_HARDEN_REFERRAL_PATH VAR_PRIVATE_ADDRESS
96 %token VAR_PRIVATE_DOMAIN VAR_REMOTE_CONTROL VAR_CONTROL_ENABLE
97 %token VAR_CONTROL_INTERFACE VAR_CONTROL_PORT VAR_SERVER_KEY_FILE
98 %token VAR_SERVER_CERT_FILE VAR_CONTROL_KEY_FILE VAR_CONTROL_CERT_FILE
99 %token VAR_CONTROL_USE_CERT
100 %token VAR_EXTENDED_STATISTICS VAR_LOCAL_DATA_PTR VAR_JOSTLE_TIMEOUT
101 %token VAR_STUB_PRIME VAR_UNWANTED_REPLY_THRESHOLD VAR_LOG_TIME_ASCII
102 %token VAR_DOMAIN_INSECURE VAR_PYTHON VAR_PYTHON_SCRIPT VAR_VAL_SIG_SKEW_MIN
103 %token VAR_VAL_SIG_SKEW_MAX VAR_CACHE_MIN_TTL VAR_VAL_LOG_LEVEL
104 %token VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING VAR_ADD_HOLDDOWN
105 %token VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE VAR_PREFETCH
106 %token VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT VAR_HARDEN_BELOW_NXDOMAIN
107 %token VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES VAR_TCP_UPSTREAM VAR_SSL_UPSTREAM
108 %token VAR_SSL_SERVICE_KEY VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST
109 %token VAR_STUB_FIRST VAR_MINIMAL_RESPONSES VAR_RRSET_ROUNDROBIN
110 %token VAR_MAX_UDP_SIZE VAR_DELAY_CLOSE
111 %token VAR_UNBLOCK_LAN_ZONES VAR_INSECURE_LAN_ZONES
112 %token VAR_INFRA_CACHE_MIN_RTT
113 %token VAR_DNS64_PREFIX VAR_DNS64_SYNTHALL
114 %token VAR_DNSTAP VAR_DNSTAP_ENABLE VAR_DNSTAP_SOCKET_PATH
115 %token VAR_DNSTAP_SEND_IDENTITY VAR_DNSTAP_SEND_VERSION
116 %token VAR_DNSTAP_IDENTITY VAR_DNSTAP_VERSION
117 %token VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES
118 %token VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES
119 %token VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES
120 %token VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES
121 %token VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES
122 %token VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES
123 %token VAR_HARDEN_ALGO_DOWNGRADE VAR_IP_TRANSPARENT
124 %token VAR_DISABLE_DNSSEC_LAME_CHECK
125 %token VAR_RATELIMIT VAR_RATELIMIT_SLABS VAR_RATELIMIT_SIZE
126 %token VAR_RATELIMIT_FOR_DOMAIN VAR_RATELIMIT_BELOW_DOMAIN VAR_RATELIMIT_FACTOR
127 %token VAR_CAPS_WHITELIST VAR_CACHE_MAX_NEGATIVE_TTL VAR_PERMIT_SMALL_HOLDDOWN
128 %token VAR_QNAME_MINIMISATION VAR_IP_FREEBIND VAR_DEFINE_TAG VAR_LOCAL_ZONE_TAG
129 %token VAR_ACCESS_CONTROL_TAG VAR_LOCAL_ZONE_OVERRIDE
130 %token VAR_ACCESS_CONTROL_TAG_ACTION VAR_ACCESS_CONTROL_TAG_DATA
131 
132 %%
133 toplevelvars: /* empty */ | toplevelvars toplevelvar ;
134 toplevelvar: serverstart contents_server | stubstart contents_stub |
135 	forwardstart contents_forward | pythonstart contents_py |
136 	rcstart contents_rc | dtstart contents_dt
137 	;
138 
139 /* server: declaration */
140 serverstart: VAR_SERVER
141 	{
142 		OUTYY(("\nP(server:)\n"));
143 	}
144 	;
145 contents_server: contents_server content_server
146 	| ;
147 content_server: server_num_threads | server_verbosity | server_port |
148 	server_outgoing_range | server_do_ip4 |
149 	server_do_ip6 | server_prefer_ip6 |
150 	server_do_udp | server_do_tcp |
151 	server_tcp_mss | server_outgoing_tcp_mss |
152 	server_interface | server_chroot | server_username |
153 	server_directory | server_logfile | server_pidfile |
154 	server_msg_cache_size | server_msg_cache_slabs |
155 	server_num_queries_per_thread | server_rrset_cache_size |
156 	server_rrset_cache_slabs | server_outgoing_num_tcp |
157 	server_infra_host_ttl | server_infra_lame_ttl |
158 	server_infra_cache_slabs | server_infra_cache_numhosts |
159 	server_infra_cache_lame_size | server_target_fetch_policy |
160 	server_harden_short_bufsize | server_harden_large_queries |
161 	server_do_not_query_address | server_hide_identity |
162 	server_hide_version | server_identity | server_version |
163 	server_harden_glue | server_module_conf | server_trust_anchor_file |
164 	server_trust_anchor | server_val_override_date | server_bogus_ttl |
165 	server_val_clean_additional | server_val_permissive_mode |
166 	server_incoming_num_tcp | server_msg_buffer_size |
167 	server_key_cache_size | server_key_cache_slabs |
168 	server_trusted_keys_file | server_val_nsec3_keysize_iterations |
169 	server_use_syslog | server_outgoing_interface | server_root_hints |
170 	server_do_not_query_localhost | server_cache_max_ttl |
171 	server_harden_dnssec_stripped | server_access_control |
172 	server_local_zone | server_local_data | server_interface_automatic |
173 	server_statistics_interval | server_do_daemonize |
174 	server_use_caps_for_id | server_statistics_cumulative |
175 	server_outgoing_port_permit | server_outgoing_port_avoid |
176 	server_dlv_anchor_file | server_dlv_anchor | server_neg_cache_size |
177 	server_harden_referral_path | server_private_address |
178 	server_private_domain | server_extended_statistics |
179 	server_local_data_ptr | server_jostle_timeout |
180 	server_unwanted_reply_threshold | server_log_time_ascii |
181 	server_domain_insecure | server_val_sig_skew_min |
182 	server_val_sig_skew_max | server_cache_min_ttl | server_val_log_level |
183 	server_auto_trust_anchor_file | server_add_holddown |
184 	server_del_holddown | server_keep_missing | server_so_rcvbuf |
185 	server_edns_buffer_size | server_prefetch | server_prefetch_key |
186 	server_so_sndbuf | server_harden_below_nxdomain | server_ignore_cd_flag |
187 	server_log_queries | server_tcp_upstream | server_ssl_upstream |
188 	server_ssl_service_key | server_ssl_service_pem | server_ssl_port |
189 	server_minimal_responses | server_rrset_roundrobin | server_max_udp_size |
190 	server_so_reuseport | server_delay_close |
191 	server_unblock_lan_zones | server_insecure_lan_zones |
192 	server_dns64_prefix | server_dns64_synthall |
193 	server_infra_cache_min_rtt | server_harden_algo_downgrade |
194 	server_ip_transparent | server_ratelimit | server_ratelimit_slabs |
195 	server_ratelimit_size | server_ratelimit_for_domain |
196 	server_ratelimit_below_domain | server_ratelimit_factor |
197 	server_caps_whitelist | server_cache_max_negative_ttl |
198 	server_permit_small_holddown | server_qname_minimisation |
199 	server_ip_freebind | server_define_tag | server_local_zone_tag |
200 	server_disable_dnssec_lame_check | server_access_control_tag |
201 	server_local_zone_override | server_access_control_tag_action |
202 	server_access_control_tag_data
203 	;
204 stubstart: VAR_STUB_ZONE
205 	{
206 		struct config_stub* s;
207 		OUTYY(("\nP(stub_zone:)\n"));
208 		s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
209 		if(s) {
210 			s->next = cfg_parser->cfg->stubs;
211 			cfg_parser->cfg->stubs = s;
212 		} else
213 			yyerror("out of memory");
214 	}
215 	;
216 contents_stub: contents_stub content_stub
217 	| ;
218 content_stub: stub_name | stub_host | stub_addr | stub_prime | stub_first
219 	;
220 forwardstart: VAR_FORWARD_ZONE
221 	{
222 		struct config_stub* s;
223 		OUTYY(("\nP(forward_zone:)\n"));
224 		s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
225 		if(s) {
226 			s->next = cfg_parser->cfg->forwards;
227 			cfg_parser->cfg->forwards = s;
228 		} else
229 			yyerror("out of memory");
230 	}
231 	;
232 contents_forward: contents_forward content_forward
233 	| ;
234 content_forward: forward_name | forward_host | forward_addr | forward_first
235 	;
236 server_num_threads: VAR_NUM_THREADS STRING_ARG
237 	{
238 		OUTYY(("P(server_num_threads:%s)\n", $2));
239 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
240 			yyerror("number expected");
241 		else cfg_parser->cfg->num_threads = atoi($2);
242 		free($2);
243 	}
244 	;
245 server_verbosity: VAR_VERBOSITY STRING_ARG
246 	{
247 		OUTYY(("P(server_verbosity:%s)\n", $2));
248 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
249 			yyerror("number expected");
250 		else cfg_parser->cfg->verbosity = atoi($2);
251 		free($2);
252 	}
253 	;
254 server_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG
255 	{
256 		OUTYY(("P(server_statistics_interval:%s)\n", $2));
257 		if(strcmp($2, "") == 0 || strcmp($2, "0") == 0)
258 			cfg_parser->cfg->stat_interval = 0;
259 		else if(atoi($2) == 0)
260 			yyerror("number expected");
261 		else cfg_parser->cfg->stat_interval = atoi($2);
262 		free($2);
263 	}
264 	;
265 server_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG
266 	{
267 		OUTYY(("P(server_statistics_cumulative:%s)\n", $2));
268 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
269 			yyerror("expected yes or no.");
270 		else cfg_parser->cfg->stat_cumulative = (strcmp($2, "yes")==0);
271 		free($2);
272 	}
273 	;
274 server_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG
275 	{
276 		OUTYY(("P(server_extended_statistics:%s)\n", $2));
277 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
278 			yyerror("expected yes or no.");
279 		else cfg_parser->cfg->stat_extended = (strcmp($2, "yes")==0);
280 		free($2);
281 	}
282 	;
283 server_port: VAR_PORT STRING_ARG
284 	{
285 		OUTYY(("P(server_port:%s)\n", $2));
286 		if(atoi($2) == 0)
287 			yyerror("port number expected");
288 		else cfg_parser->cfg->port = atoi($2);
289 		free($2);
290 	}
291 	;
292 server_interface: VAR_INTERFACE STRING_ARG
293 	{
294 		OUTYY(("P(server_interface:%s)\n", $2));
295 		if(cfg_parser->cfg->num_ifs == 0)
296 			cfg_parser->cfg->ifs = calloc(1, sizeof(char*));
297 		else 	cfg_parser->cfg->ifs = realloc(cfg_parser->cfg->ifs,
298 				(cfg_parser->cfg->num_ifs+1)*sizeof(char*));
299 		if(!cfg_parser->cfg->ifs)
300 			yyerror("out of memory");
301 		else
302 			cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = $2;
303 	}
304 	;
305 server_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG
306 	{
307 		OUTYY(("P(server_outgoing_interface:%s)\n", $2));
308 		if(cfg_parser->cfg->num_out_ifs == 0)
309 			cfg_parser->cfg->out_ifs = calloc(1, sizeof(char*));
310 		else 	cfg_parser->cfg->out_ifs = realloc(
311 			cfg_parser->cfg->out_ifs,
312 			(cfg_parser->cfg->num_out_ifs+1)*sizeof(char*));
313 		if(!cfg_parser->cfg->out_ifs)
314 			yyerror("out of memory");
315 		else
316 			cfg_parser->cfg->out_ifs[
317 				cfg_parser->cfg->num_out_ifs++] = $2;
318 	}
319 	;
320 server_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG
321 	{
322 		OUTYY(("P(server_outgoing_range:%s)\n", $2));
323 		if(atoi($2) == 0)
324 			yyerror("number expected");
325 		else cfg_parser->cfg->outgoing_num_ports = atoi($2);
326 		free($2);
327 	}
328 	;
329 server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG
330 	{
331 		OUTYY(("P(server_outgoing_port_permit:%s)\n", $2));
332 		if(!cfg_mark_ports($2, 1,
333 			cfg_parser->cfg->outgoing_avail_ports, 65536))
334 			yyerror("port number or range (\"low-high\") expected");
335 		free($2);
336 	}
337 	;
338 server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG
339 	{
340 		OUTYY(("P(server_outgoing_port_avoid:%s)\n", $2));
341 		if(!cfg_mark_ports($2, 0,
342 			cfg_parser->cfg->outgoing_avail_ports, 65536))
343 			yyerror("port number or range (\"low-high\") expected");
344 		free($2);
345 	}
346 	;
347 server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG
348 	{
349 		OUTYY(("P(server_outgoing_num_tcp:%s)\n", $2));
350 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
351 			yyerror("number expected");
352 		else cfg_parser->cfg->outgoing_num_tcp = atoi($2);
353 		free($2);
354 	}
355 	;
356 server_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG
357 	{
358 		OUTYY(("P(server_incoming_num_tcp:%s)\n", $2));
359 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
360 			yyerror("number expected");
361 		else cfg_parser->cfg->incoming_num_tcp = atoi($2);
362 		free($2);
363 	}
364 	;
365 server_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG
366 	{
367 		OUTYY(("P(server_interface_automatic:%s)\n", $2));
368 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
369 			yyerror("expected yes or no.");
370 		else cfg_parser->cfg->if_automatic = (strcmp($2, "yes")==0);
371 		free($2);
372 	}
373 	;
374 server_do_ip4: VAR_DO_IP4 STRING_ARG
375 	{
376 		OUTYY(("P(server_do_ip4:%s)\n", $2));
377 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
378 			yyerror("expected yes or no.");
379 		else cfg_parser->cfg->do_ip4 = (strcmp($2, "yes")==0);
380 		free($2);
381 	}
382 	;
383 server_do_ip6: VAR_DO_IP6 STRING_ARG
384 	{
385 		OUTYY(("P(server_do_ip6:%s)\n", $2));
386 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
387 			yyerror("expected yes or no.");
388 		else cfg_parser->cfg->do_ip6 = (strcmp($2, "yes")==0);
389 		free($2);
390 	}
391 	;
392 server_do_udp: VAR_DO_UDP STRING_ARG
393 	{
394 		OUTYY(("P(server_do_udp:%s)\n", $2));
395 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
396 			yyerror("expected yes or no.");
397 		else cfg_parser->cfg->do_udp = (strcmp($2, "yes")==0);
398 		free($2);
399 	}
400 	;
401 server_do_tcp: VAR_DO_TCP STRING_ARG
402 	{
403 		OUTYY(("P(server_do_tcp:%s)\n", $2));
404 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
405 			yyerror("expected yes or no.");
406 		else cfg_parser->cfg->do_tcp = (strcmp($2, "yes")==0);
407 		free($2);
408 	}
409 	;
410 server_prefer_ip6: VAR_PREFER_IP6 STRING_ARG
411 	{
412 		OUTYY(("P(server_prefer_ip6:%s)\n", $2));
413 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
414 			yyerror("expected yes or no.");
415 		else cfg_parser->cfg->prefer_ip6 = (strcmp($2, "yes")==0);
416 		free($2);
417 	}
418 	;
419 server_tcp_mss: VAR_TCP_MSS STRING_ARG
420 	{
421 		OUTYY(("P(server_tcp_mss:%s)\n", $2));
422                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
423                         yyerror("number expected");
424                 else cfg_parser->cfg->tcp_mss = atoi($2);
425                 free($2);
426 	}
427 	;
428 server_outgoing_tcp_mss: VAR_OUTGOING_TCP_MSS STRING_ARG
429 	{
430 		OUTYY(("P(server_outgoing_tcp_mss:%s)\n", $2));
431 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
432 			yyerror("number expected");
433 		else cfg_parser->cfg->outgoing_tcp_mss = atoi($2);
434 		free($2);
435 	}
436 	;
437 server_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG
438 	{
439 		OUTYY(("P(server_tcp_upstream:%s)\n", $2));
440 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
441 			yyerror("expected yes or no.");
442 		else cfg_parser->cfg->tcp_upstream = (strcmp($2, "yes")==0);
443 		free($2);
444 	}
445 	;
446 server_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG
447 	{
448 		OUTYY(("P(server_ssl_upstream:%s)\n", $2));
449 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
450 			yyerror("expected yes or no.");
451 		else cfg_parser->cfg->ssl_upstream = (strcmp($2, "yes")==0);
452 		free($2);
453 	}
454 	;
455 server_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG
456 	{
457 		OUTYY(("P(server_ssl_service_key:%s)\n", $2));
458 		free(cfg_parser->cfg->ssl_service_key);
459 		cfg_parser->cfg->ssl_service_key = $2;
460 	}
461 	;
462 server_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG
463 	{
464 		OUTYY(("P(server_ssl_service_pem:%s)\n", $2));
465 		free(cfg_parser->cfg->ssl_service_pem);
466 		cfg_parser->cfg->ssl_service_pem = $2;
467 	}
468 	;
469 server_ssl_port: VAR_SSL_PORT STRING_ARG
470 	{
471 		OUTYY(("P(server_ssl_port:%s)\n", $2));
472 		if(atoi($2) == 0)
473 			yyerror("port number expected");
474 		else cfg_parser->cfg->ssl_port = atoi($2);
475 		free($2);
476 	}
477 	;
478 server_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG
479 	{
480 		OUTYY(("P(server_do_daemonize:%s)\n", $2));
481 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
482 			yyerror("expected yes or no.");
483 		else cfg_parser->cfg->do_daemonize = (strcmp($2, "yes")==0);
484 		free($2);
485 	}
486 	;
487 server_use_syslog: VAR_USE_SYSLOG STRING_ARG
488 	{
489 		OUTYY(("P(server_use_syslog:%s)\n", $2));
490 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
491 			yyerror("expected yes or no.");
492 		else cfg_parser->cfg->use_syslog = (strcmp($2, "yes")==0);
493 #if !defined(HAVE_SYSLOG_H) && !defined(UB_ON_WINDOWS)
494 		if(strcmp($2, "yes") == 0)
495 			yyerror("no syslog services are available. "
496 				"(reconfigure and compile to add)");
497 #endif
498 		free($2);
499 	}
500 	;
501 server_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG
502 	{
503 		OUTYY(("P(server_log_time_ascii:%s)\n", $2));
504 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
505 			yyerror("expected yes or no.");
506 		else cfg_parser->cfg->log_time_ascii = (strcmp($2, "yes")==0);
507 		free($2);
508 	}
509 	;
510 server_log_queries: VAR_LOG_QUERIES STRING_ARG
511 	{
512 		OUTYY(("P(server_log_queries:%s)\n", $2));
513 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
514 			yyerror("expected yes or no.");
515 		else cfg_parser->cfg->log_queries = (strcmp($2, "yes")==0);
516 		free($2);
517 	}
518 	;
519 server_chroot: VAR_CHROOT STRING_ARG
520 	{
521 		OUTYY(("P(server_chroot:%s)\n", $2));
522 		free(cfg_parser->cfg->chrootdir);
523 		cfg_parser->cfg->chrootdir = $2;
524 	}
525 	;
526 server_username: VAR_USERNAME STRING_ARG
527 	{
528 		OUTYY(("P(server_username:%s)\n", $2));
529 		free(cfg_parser->cfg->username);
530 		cfg_parser->cfg->username = $2;
531 	}
532 	;
533 server_directory: VAR_DIRECTORY STRING_ARG
534 	{
535 		OUTYY(("P(server_directory:%s)\n", $2));
536 		free(cfg_parser->cfg->directory);
537 		cfg_parser->cfg->directory = $2;
538 		/* change there right away for includes relative to this */
539 		if($2[0]) {
540 			char* d;
541 #ifdef UB_ON_WINDOWS
542 			w_config_adjust_directory(cfg_parser->cfg);
543 #endif
544 			d = cfg_parser->cfg->directory;
545 			/* adjust directory if we have already chroot,
546 			 * like, we reread after sighup */
547 			if(cfg_parser->chroot && cfg_parser->chroot[0] &&
548 				strncmp(d, cfg_parser->chroot, strlen(
549 				cfg_parser->chroot)) == 0)
550 				d += strlen(cfg_parser->chroot);
551 			if(chdir(d))
552 				log_err("cannot chdir to directory: %s (%s)",
553 					d, strerror(errno));
554 		}
555 	}
556 	;
557 server_logfile: VAR_LOGFILE STRING_ARG
558 	{
559 		OUTYY(("P(server_logfile:%s)\n", $2));
560 		free(cfg_parser->cfg->logfile);
561 		cfg_parser->cfg->logfile = $2;
562 		cfg_parser->cfg->use_syslog = 0;
563 	}
564 	;
565 server_pidfile: VAR_PIDFILE STRING_ARG
566 	{
567 		OUTYY(("P(server_pidfile:%s)\n", $2));
568 		free(cfg_parser->cfg->pidfile);
569 		cfg_parser->cfg->pidfile = $2;
570 	}
571 	;
572 server_root_hints: VAR_ROOT_HINTS STRING_ARG
573 	{
574 		OUTYY(("P(server_root_hints:%s)\n", $2));
575 		if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, $2))
576 			yyerror("out of memory");
577 	}
578 	;
579 server_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG
580 	{
581 		OUTYY(("P(server_dlv_anchor_file:%s)\n", $2));
582 		free(cfg_parser->cfg->dlv_anchor_file);
583 		cfg_parser->cfg->dlv_anchor_file = $2;
584 	}
585 	;
586 server_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG
587 	{
588 		OUTYY(("P(server_dlv_anchor:%s)\n", $2));
589 		if(!cfg_strlist_insert(&cfg_parser->cfg->dlv_anchor_list, $2))
590 			yyerror("out of memory");
591 	}
592 	;
593 server_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG
594 	{
595 		OUTYY(("P(server_auto_trust_anchor_file:%s)\n", $2));
596 		if(!cfg_strlist_insert(&cfg_parser->cfg->
597 			auto_trust_anchor_file_list, $2))
598 			yyerror("out of memory");
599 	}
600 	;
601 server_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG
602 	{
603 		OUTYY(("P(server_trust_anchor_file:%s)\n", $2));
604 		if(!cfg_strlist_insert(&cfg_parser->cfg->
605 			trust_anchor_file_list, $2))
606 			yyerror("out of memory");
607 	}
608 	;
609 server_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG
610 	{
611 		OUTYY(("P(server_trusted_keys_file:%s)\n", $2));
612 		if(!cfg_strlist_insert(&cfg_parser->cfg->
613 			trusted_keys_file_list, $2))
614 			yyerror("out of memory");
615 	}
616 	;
617 server_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG
618 	{
619 		OUTYY(("P(server_trust_anchor:%s)\n", $2));
620 		if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, $2))
621 			yyerror("out of memory");
622 	}
623 	;
624 server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG
625 	{
626 		OUTYY(("P(server_domain_insecure:%s)\n", $2));
627 		if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, $2))
628 			yyerror("out of memory");
629 	}
630 	;
631 server_hide_identity: VAR_HIDE_IDENTITY STRING_ARG
632 	{
633 		OUTYY(("P(server_hide_identity:%s)\n", $2));
634 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
635 			yyerror("expected yes or no.");
636 		else cfg_parser->cfg->hide_identity = (strcmp($2, "yes")==0);
637 		free($2);
638 	}
639 	;
640 server_hide_version: VAR_HIDE_VERSION STRING_ARG
641 	{
642 		OUTYY(("P(server_hide_version:%s)\n", $2));
643 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
644 			yyerror("expected yes or no.");
645 		else cfg_parser->cfg->hide_version = (strcmp($2, "yes")==0);
646 		free($2);
647 	}
648 	;
649 server_identity: VAR_IDENTITY STRING_ARG
650 	{
651 		OUTYY(("P(server_identity:%s)\n", $2));
652 		free(cfg_parser->cfg->identity);
653 		cfg_parser->cfg->identity = $2;
654 	}
655 	;
656 server_version: VAR_VERSION STRING_ARG
657 	{
658 		OUTYY(("P(server_version:%s)\n", $2));
659 		free(cfg_parser->cfg->version);
660 		cfg_parser->cfg->version = $2;
661 	}
662 	;
663 server_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG
664 	{
665 		OUTYY(("P(server_so_rcvbuf:%s)\n", $2));
666 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_rcvbuf))
667 			yyerror("buffer size expected");
668 		free($2);
669 	}
670 	;
671 server_so_sndbuf: VAR_SO_SNDBUF STRING_ARG
672 	{
673 		OUTYY(("P(server_so_sndbuf:%s)\n", $2));
674 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_sndbuf))
675 			yyerror("buffer size expected");
676 		free($2);
677 	}
678 	;
679 server_so_reuseport: VAR_SO_REUSEPORT STRING_ARG
680     {
681         OUTYY(("P(server_so_reuseport:%s)\n", $2));
682         if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
683             yyerror("expected yes or no.");
684         else cfg_parser->cfg->so_reuseport =
685             (strcmp($2, "yes")==0);
686         free($2);
687     }
688     ;
689 server_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG
690     {
691         OUTYY(("P(server_ip_transparent:%s)\n", $2));
692         if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
693             yyerror("expected yes or no.");
694         else cfg_parser->cfg->ip_transparent =
695             (strcmp($2, "yes")==0);
696         free($2);
697     }
698     ;
699 server_ip_freebind: VAR_IP_FREEBIND STRING_ARG
700     {
701         OUTYY(("P(server_ip_freebind:%s)\n", $2));
702         if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
703             yyerror("expected yes or no.");
704         else cfg_parser->cfg->ip_freebind =
705             (strcmp($2, "yes")==0);
706         free($2);
707     }
708     ;
709 server_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG
710 	{
711 		OUTYY(("P(server_edns_buffer_size:%s)\n", $2));
712 		if(atoi($2) == 0)
713 			yyerror("number expected");
714 		else if (atoi($2) < 12)
715 			yyerror("edns buffer size too small");
716 		else if (atoi($2) > 65535)
717 			cfg_parser->cfg->edns_buffer_size = 65535;
718 		else cfg_parser->cfg->edns_buffer_size = atoi($2);
719 		free($2);
720 	}
721 	;
722 server_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG
723 	{
724 		OUTYY(("P(server_msg_buffer_size:%s)\n", $2));
725 		if(atoi($2) == 0)
726 			yyerror("number expected");
727 		else if (atoi($2) < 4096)
728 			yyerror("message buffer size too small (use 4096)");
729 		else cfg_parser->cfg->msg_buffer_size = atoi($2);
730 		free($2);
731 	}
732 	;
733 server_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG
734 	{
735 		OUTYY(("P(server_msg_cache_size:%s)\n", $2));
736 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->msg_cache_size))
737 			yyerror("memory size expected");
738 		free($2);
739 	}
740 	;
741 server_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG
742 	{
743 		OUTYY(("P(server_msg_cache_slabs:%s)\n", $2));
744 		if(atoi($2) == 0)
745 			yyerror("number expected");
746 		else {
747 			cfg_parser->cfg->msg_cache_slabs = atoi($2);
748 			if(!is_pow2(cfg_parser->cfg->msg_cache_slabs))
749 				yyerror("must be a power of 2");
750 		}
751 		free($2);
752 	}
753 	;
754 server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG
755 	{
756 		OUTYY(("P(server_num_queries_per_thread:%s)\n", $2));
757 		if(atoi($2) == 0)
758 			yyerror("number expected");
759 		else cfg_parser->cfg->num_queries_per_thread = atoi($2);
760 		free($2);
761 	}
762 	;
763 server_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG
764 	{
765 		OUTYY(("P(server_jostle_timeout:%s)\n", $2));
766 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
767 			yyerror("number expected");
768 		else cfg_parser->cfg->jostle_time = atoi($2);
769 		free($2);
770 	}
771 	;
772 server_delay_close: VAR_DELAY_CLOSE STRING_ARG
773 	{
774 		OUTYY(("P(server_delay_close:%s)\n", $2));
775 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
776 			yyerror("number expected");
777 		else cfg_parser->cfg->delay_close = atoi($2);
778 		free($2);
779 	}
780 	;
781 server_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG
782 	{
783 		OUTYY(("P(server_unblock_lan_zones:%s)\n", $2));
784 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
785 			yyerror("expected yes or no.");
786 		else cfg_parser->cfg->unblock_lan_zones =
787 			(strcmp($2, "yes")==0);
788 		free($2);
789 	}
790 	;
791 server_insecure_lan_zones: VAR_INSECURE_LAN_ZONES STRING_ARG
792 	{
793 		OUTYY(("P(server_insecure_lan_zones:%s)\n", $2));
794 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
795 			yyerror("expected yes or no.");
796 		else cfg_parser->cfg->insecure_lan_zones =
797 			(strcmp($2, "yes")==0);
798 		free($2);
799 	}
800 	;
801 server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG
802 	{
803 		OUTYY(("P(server_rrset_cache_size:%s)\n", $2));
804 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->rrset_cache_size))
805 			yyerror("memory size expected");
806 		free($2);
807 	}
808 	;
809 server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG
810 	{
811 		OUTYY(("P(server_rrset_cache_slabs:%s)\n", $2));
812 		if(atoi($2) == 0)
813 			yyerror("number expected");
814 		else {
815 			cfg_parser->cfg->rrset_cache_slabs = atoi($2);
816 			if(!is_pow2(cfg_parser->cfg->rrset_cache_slabs))
817 				yyerror("must be a power of 2");
818 		}
819 		free($2);
820 	}
821 	;
822 server_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG
823 	{
824 		OUTYY(("P(server_infra_host_ttl:%s)\n", $2));
825 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
826 			yyerror("number expected");
827 		else cfg_parser->cfg->host_ttl = atoi($2);
828 		free($2);
829 	}
830 	;
831 server_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG
832 	{
833 		OUTYY(("P(server_infra_lame_ttl:%s)\n", $2));
834 		verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option "
835 			"removed, use infra-host-ttl)", $2);
836 		free($2);
837 	}
838 	;
839 server_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG
840 	{
841 		OUTYY(("P(server_infra_cache_numhosts:%s)\n", $2));
842 		if(atoi($2) == 0)
843 			yyerror("number expected");
844 		else cfg_parser->cfg->infra_cache_numhosts = atoi($2);
845 		free($2);
846 	}
847 	;
848 server_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG
849 	{
850 		OUTYY(("P(server_infra_cache_lame_size:%s)\n", $2));
851 		verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s "
852 			"(option removed, use infra-cache-numhosts)", $2);
853 		free($2);
854 	}
855 	;
856 server_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG
857 	{
858 		OUTYY(("P(server_infra_cache_slabs:%s)\n", $2));
859 		if(atoi($2) == 0)
860 			yyerror("number expected");
861 		else {
862 			cfg_parser->cfg->infra_cache_slabs = atoi($2);
863 			if(!is_pow2(cfg_parser->cfg->infra_cache_slabs))
864 				yyerror("must be a power of 2");
865 		}
866 		free($2);
867 	}
868 	;
869 server_infra_cache_min_rtt: VAR_INFRA_CACHE_MIN_RTT STRING_ARG
870 	{
871 		OUTYY(("P(server_infra_cache_min_rtt:%s)\n", $2));
872 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
873 			yyerror("number expected");
874 		else cfg_parser->cfg->infra_cache_min_rtt = atoi($2);
875 		free($2);
876 	}
877 	;
878 server_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG
879 	{
880 		OUTYY(("P(server_target_fetch_policy:%s)\n", $2));
881 		free(cfg_parser->cfg->target_fetch_policy);
882 		cfg_parser->cfg->target_fetch_policy = $2;
883 	}
884 	;
885 server_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG
886 	{
887 		OUTYY(("P(server_harden_short_bufsize:%s)\n", $2));
888 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
889 			yyerror("expected yes or no.");
890 		else cfg_parser->cfg->harden_short_bufsize =
891 			(strcmp($2, "yes")==0);
892 		free($2);
893 	}
894 	;
895 server_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG
896 	{
897 		OUTYY(("P(server_harden_large_queries:%s)\n", $2));
898 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
899 			yyerror("expected yes or no.");
900 		else cfg_parser->cfg->harden_large_queries =
901 			(strcmp($2, "yes")==0);
902 		free($2);
903 	}
904 	;
905 server_harden_glue: VAR_HARDEN_GLUE STRING_ARG
906 	{
907 		OUTYY(("P(server_harden_glue:%s)\n", $2));
908 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
909 			yyerror("expected yes or no.");
910 		else cfg_parser->cfg->harden_glue =
911 			(strcmp($2, "yes")==0);
912 		free($2);
913 	}
914 	;
915 server_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG
916 	{
917 		OUTYY(("P(server_harden_dnssec_stripped:%s)\n", $2));
918 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
919 			yyerror("expected yes or no.");
920 		else cfg_parser->cfg->harden_dnssec_stripped =
921 			(strcmp($2, "yes")==0);
922 		free($2);
923 	}
924 	;
925 server_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG
926 	{
927 		OUTYY(("P(server_harden_below_nxdomain:%s)\n", $2));
928 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
929 			yyerror("expected yes or no.");
930 		else cfg_parser->cfg->harden_below_nxdomain =
931 			(strcmp($2, "yes")==0);
932 		free($2);
933 	}
934 	;
935 server_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG
936 	{
937 		OUTYY(("P(server_harden_referral_path:%s)\n", $2));
938 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
939 			yyerror("expected yes or no.");
940 		else cfg_parser->cfg->harden_referral_path =
941 			(strcmp($2, "yes")==0);
942 		free($2);
943 	}
944 	;
945 server_harden_algo_downgrade: VAR_HARDEN_ALGO_DOWNGRADE STRING_ARG
946 	{
947 		OUTYY(("P(server_harden_algo_downgrade:%s)\n", $2));
948 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
949 			yyerror("expected yes or no.");
950 		else cfg_parser->cfg->harden_algo_downgrade =
951 			(strcmp($2, "yes")==0);
952 		free($2);
953 	}
954 	;
955 server_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG
956 	{
957 		OUTYY(("P(server_use_caps_for_id:%s)\n", $2));
958 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
959 			yyerror("expected yes or no.");
960 		else cfg_parser->cfg->use_caps_bits_for_id =
961 			(strcmp($2, "yes")==0);
962 		free($2);
963 	}
964 	;
965 server_caps_whitelist: VAR_CAPS_WHITELIST STRING_ARG
966 	{
967 		OUTYY(("P(server_caps_whitelist:%s)\n", $2));
968 		if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, $2))
969 			yyerror("out of memory");
970 	}
971 	;
972 server_private_address: VAR_PRIVATE_ADDRESS STRING_ARG
973 	{
974 		OUTYY(("P(server_private_address:%s)\n", $2));
975 		if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, $2))
976 			yyerror("out of memory");
977 	}
978 	;
979 server_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG
980 	{
981 		OUTYY(("P(server_private_domain:%s)\n", $2));
982 		if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, $2))
983 			yyerror("out of memory");
984 	}
985 	;
986 server_prefetch: VAR_PREFETCH STRING_ARG
987 	{
988 		OUTYY(("P(server_prefetch:%s)\n", $2));
989 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
990 			yyerror("expected yes or no.");
991 		else cfg_parser->cfg->prefetch = (strcmp($2, "yes")==0);
992 		free($2);
993 	}
994 	;
995 server_prefetch_key: VAR_PREFETCH_KEY STRING_ARG
996 	{
997 		OUTYY(("P(server_prefetch_key:%s)\n", $2));
998 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
999 			yyerror("expected yes or no.");
1000 		else cfg_parser->cfg->prefetch_key = (strcmp($2, "yes")==0);
1001 		free($2);
1002 	}
1003 	;
1004 server_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG
1005 	{
1006 		OUTYY(("P(server_unwanted_reply_threshold:%s)\n", $2));
1007 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1008 			yyerror("number expected");
1009 		else cfg_parser->cfg->unwanted_threshold = atoi($2);
1010 		free($2);
1011 	}
1012 	;
1013 server_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG
1014 	{
1015 		OUTYY(("P(server_do_not_query_address:%s)\n", $2));
1016 		if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, $2))
1017 			yyerror("out of memory");
1018 	}
1019 	;
1020 server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG
1021 	{
1022 		OUTYY(("P(server_do_not_query_localhost:%s)\n", $2));
1023 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1024 			yyerror("expected yes or no.");
1025 		else cfg_parser->cfg->donotquery_localhost =
1026 			(strcmp($2, "yes")==0);
1027 		free($2);
1028 	}
1029 	;
1030 server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG
1031 	{
1032 		OUTYY(("P(server_access_control:%s %s)\n", $2, $3));
1033 		if(strcmp($3, "deny")!=0 && strcmp($3, "refuse")!=0 &&
1034 			strcmp($3, "deny_non_local")!=0 &&
1035 			strcmp($3, "refuse_non_local")!=0 &&
1036 			strcmp($3, "allow")!=0 &&
1037 			strcmp($3, "allow_snoop")!=0) {
1038 			yyerror("expected deny, refuse, deny_non_local, "
1039 				"refuse_non_local, allow or allow_snoop "
1040 				"in access control action");
1041 		} else {
1042 			if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3))
1043 				fatal_exit("out of memory adding acl");
1044 		}
1045 	}
1046 	;
1047 server_module_conf: VAR_MODULE_CONF STRING_ARG
1048 	{
1049 		OUTYY(("P(server_module_conf:%s)\n", $2));
1050 		free(cfg_parser->cfg->module_conf);
1051 		cfg_parser->cfg->module_conf = $2;
1052 	}
1053 	;
1054 server_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG
1055 	{
1056 		OUTYY(("P(server_val_override_date:%s)\n", $2));
1057 		if(*$2 == '\0' || strcmp($2, "0") == 0) {
1058 			cfg_parser->cfg->val_date_override = 0;
1059 		} else if(strlen($2) == 14) {
1060 			cfg_parser->cfg->val_date_override =
1061 				cfg_convert_timeval($2);
1062 			if(!cfg_parser->cfg->val_date_override)
1063 				yyerror("bad date/time specification");
1064 		} else {
1065 			if(atoi($2) == 0)
1066 				yyerror("number expected");
1067 			cfg_parser->cfg->val_date_override = atoi($2);
1068 		}
1069 		free($2);
1070 	}
1071 	;
1072 server_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG
1073 	{
1074 		OUTYY(("P(server_val_sig_skew_min:%s)\n", $2));
1075 		if(*$2 == '\0' || strcmp($2, "0") == 0) {
1076 			cfg_parser->cfg->val_sig_skew_min = 0;
1077 		} else {
1078 			cfg_parser->cfg->val_sig_skew_min = atoi($2);
1079 			if(!cfg_parser->cfg->val_sig_skew_min)
1080 				yyerror("number expected");
1081 		}
1082 		free($2);
1083 	}
1084 	;
1085 server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG
1086 	{
1087 		OUTYY(("P(server_val_sig_skew_max:%s)\n", $2));
1088 		if(*$2 == '\0' || strcmp($2, "0") == 0) {
1089 			cfg_parser->cfg->val_sig_skew_max = 0;
1090 		} else {
1091 			cfg_parser->cfg->val_sig_skew_max = atoi($2);
1092 			if(!cfg_parser->cfg->val_sig_skew_max)
1093 				yyerror("number expected");
1094 		}
1095 		free($2);
1096 	}
1097 	;
1098 server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG
1099 	{
1100 		OUTYY(("P(server_cache_max_ttl:%s)\n", $2));
1101 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1102 			yyerror("number expected");
1103 		else cfg_parser->cfg->max_ttl = atoi($2);
1104 		free($2);
1105 	}
1106 	;
1107 server_cache_max_negative_ttl: VAR_CACHE_MAX_NEGATIVE_TTL STRING_ARG
1108 	{
1109 		OUTYY(("P(server_cache_max_negative_ttl:%s)\n", $2));
1110 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1111 			yyerror("number expected");
1112 		else cfg_parser->cfg->max_negative_ttl = atoi($2);
1113 		free($2);
1114 	}
1115 	;
1116 server_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG
1117 	{
1118 		OUTYY(("P(server_cache_min_ttl:%s)\n", $2));
1119 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1120 			yyerror("number expected");
1121 		else cfg_parser->cfg->min_ttl = atoi($2);
1122 		free($2);
1123 	}
1124 	;
1125 server_bogus_ttl: VAR_BOGUS_TTL STRING_ARG
1126 	{
1127 		OUTYY(("P(server_bogus_ttl:%s)\n", $2));
1128 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1129 			yyerror("number expected");
1130 		else cfg_parser->cfg->bogus_ttl = atoi($2);
1131 		free($2);
1132 	}
1133 	;
1134 server_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG
1135 	{
1136 		OUTYY(("P(server_val_clean_additional:%s)\n", $2));
1137 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1138 			yyerror("expected yes or no.");
1139 		else cfg_parser->cfg->val_clean_additional =
1140 			(strcmp($2, "yes")==0);
1141 		free($2);
1142 	}
1143 	;
1144 server_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG
1145 	{
1146 		OUTYY(("P(server_val_permissive_mode:%s)\n", $2));
1147 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1148 			yyerror("expected yes or no.");
1149 		else cfg_parser->cfg->val_permissive_mode =
1150 			(strcmp($2, "yes")==0);
1151 		free($2);
1152 	}
1153 	;
1154 server_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG
1155 	{
1156 		OUTYY(("P(server_ignore_cd_flag:%s)\n", $2));
1157 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1158 			yyerror("expected yes or no.");
1159 		else cfg_parser->cfg->ignore_cd = (strcmp($2, "yes")==0);
1160 		free($2);
1161 	}
1162 	;
1163 server_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG
1164 	{
1165 		OUTYY(("P(server_val_log_level:%s)\n", $2));
1166 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1167 			yyerror("number expected");
1168 		else cfg_parser->cfg->val_log_level = atoi($2);
1169 		free($2);
1170 	}
1171 	;
1172 server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG
1173 	{
1174 		OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", $2));
1175 		free(cfg_parser->cfg->val_nsec3_key_iterations);
1176 		cfg_parser->cfg->val_nsec3_key_iterations = $2;
1177 	}
1178 	;
1179 server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG
1180 	{
1181 		OUTYY(("P(server_add_holddown:%s)\n", $2));
1182 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1183 			yyerror("number expected");
1184 		else cfg_parser->cfg->add_holddown = atoi($2);
1185 		free($2);
1186 	}
1187 	;
1188 server_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG
1189 	{
1190 		OUTYY(("P(server_del_holddown:%s)\n", $2));
1191 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1192 			yyerror("number expected");
1193 		else cfg_parser->cfg->del_holddown = atoi($2);
1194 		free($2);
1195 	}
1196 	;
1197 server_keep_missing: VAR_KEEP_MISSING STRING_ARG
1198 	{
1199 		OUTYY(("P(server_keep_missing:%s)\n", $2));
1200 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1201 			yyerror("number expected");
1202 		else cfg_parser->cfg->keep_missing = atoi($2);
1203 		free($2);
1204 	}
1205 	;
1206 server_permit_small_holddown: VAR_PERMIT_SMALL_HOLDDOWN STRING_ARG
1207 	{
1208 		OUTYY(("P(server_permit_small_holddown:%s)\n", $2));
1209 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1210 			yyerror("expected yes or no.");
1211 		else cfg_parser->cfg->permit_small_holddown =
1212 			(strcmp($2, "yes")==0);
1213 		free($2);
1214 	}
1215 server_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG
1216 	{
1217 		OUTYY(("P(server_key_cache_size:%s)\n", $2));
1218 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->key_cache_size))
1219 			yyerror("memory size expected");
1220 		free($2);
1221 	}
1222 	;
1223 server_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG
1224 	{
1225 		OUTYY(("P(server_key_cache_slabs:%s)\n", $2));
1226 		if(atoi($2) == 0)
1227 			yyerror("number expected");
1228 		else {
1229 			cfg_parser->cfg->key_cache_slabs = atoi($2);
1230 			if(!is_pow2(cfg_parser->cfg->key_cache_slabs))
1231 				yyerror("must be a power of 2");
1232 		}
1233 		free($2);
1234 	}
1235 	;
1236 server_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG
1237 	{
1238 		OUTYY(("P(server_neg_cache_size:%s)\n", $2));
1239 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->neg_cache_size))
1240 			yyerror("memory size expected");
1241 		free($2);
1242 	}
1243 	;
1244 server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
1245 	{
1246 		OUTYY(("P(server_local_zone:%s %s)\n", $2, $3));
1247 		if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 &&
1248 		   strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 &&
1249 		   strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0
1250 		   && strcmp($3, "typetransparent")!=0
1251 		   && strcmp($3, "always_transparent")!=0
1252 		   && strcmp($3, "always_refuse")!=0
1253 		   && strcmp($3, "always_nxdomain")!=0
1254 		   && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0)
1255 			yyerror("local-zone type: expected static, deny, "
1256 				"refuse, redirect, transparent, "
1257 				"typetransparent, inform, inform_deny, "
1258 				"always_transparent, always_refuse, "
1259 				"always_nxdomain or nodefault");
1260 		else if(strcmp($3, "nodefault")==0) {
1261 			if(!cfg_strlist_insert(&cfg_parser->cfg->
1262 				local_zones_nodefault, $2))
1263 				fatal_exit("out of memory adding local-zone");
1264 			free($3);
1265 		} else {
1266 			if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones,
1267 				$2, $3))
1268 				fatal_exit("out of memory adding local-zone");
1269 		}
1270 	}
1271 	;
1272 server_local_data: VAR_LOCAL_DATA STRING_ARG
1273 	{
1274 		OUTYY(("P(server_local_data:%s)\n", $2));
1275 		if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, $2))
1276 			fatal_exit("out of memory adding local-data");
1277 	}
1278 	;
1279 server_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG
1280 	{
1281 		char* ptr;
1282 		OUTYY(("P(server_local_data_ptr:%s)\n", $2));
1283 		ptr = cfg_ptr_reverse($2);
1284 		free($2);
1285 		if(ptr) {
1286 			if(!cfg_strlist_insert(&cfg_parser->cfg->
1287 				local_data, ptr))
1288 				fatal_exit("out of memory adding local-data");
1289 		} else {
1290 			yyerror("local-data-ptr could not be reversed");
1291 		}
1292 	}
1293 	;
1294 server_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG
1295 	{
1296 		OUTYY(("P(server_minimal_responses:%s)\n", $2));
1297 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1298 			yyerror("expected yes or no.");
1299 		else cfg_parser->cfg->minimal_responses =
1300 			(strcmp($2, "yes")==0);
1301 		free($2);
1302 	}
1303 	;
1304 server_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG
1305 	{
1306 		OUTYY(("P(server_rrset_roundrobin:%s)\n", $2));
1307 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1308 			yyerror("expected yes or no.");
1309 		else cfg_parser->cfg->rrset_roundrobin =
1310 			(strcmp($2, "yes")==0);
1311 		free($2);
1312 	}
1313 	;
1314 server_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG
1315 	{
1316 		OUTYY(("P(server_max_udp_size:%s)\n", $2));
1317 		cfg_parser->cfg->max_udp_size = atoi($2);
1318 		free($2);
1319 	}
1320 	;
1321 server_dns64_prefix: VAR_DNS64_PREFIX STRING_ARG
1322 	{
1323 		OUTYY(("P(dns64_prefix:%s)\n", $2));
1324 		free(cfg_parser->cfg->dns64_prefix);
1325 		cfg_parser->cfg->dns64_prefix = $2;
1326 	}
1327 	;
1328 server_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG
1329 	{
1330 		OUTYY(("P(server_dns64_synthall:%s)\n", $2));
1331 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1332 			yyerror("expected yes or no.");
1333 		else cfg_parser->cfg->dns64_synthall = (strcmp($2, "yes")==0);
1334 		free($2);
1335 	}
1336 	;
1337 server_define_tag: VAR_DEFINE_TAG STRING_ARG
1338 	{
1339 		char* p, *s = $2;
1340 		OUTYY(("P(server_define_tag:%s)\n", $2));
1341 		while((p=strsep(&s, " \t\n")) != NULL) {
1342 			if(*p) {
1343 				if(!config_add_tag(cfg_parser->cfg, p))
1344 					yyerror("could not define-tag, "
1345 						"out of memory");
1346 			}
1347 		}
1348 		free($2);
1349 	}
1350 	;
1351 server_local_zone_tag: VAR_LOCAL_ZONE_TAG STRING_ARG STRING_ARG
1352 	{
1353 		size_t len = 0;
1354 		uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
1355 			&len);
1356 		free($3);
1357 		OUTYY(("P(server_local_zone_tag:%s)\n", $2));
1358 		if(!bitlist)
1359 			yyerror("could not parse tags, (define-tag them first)");
1360 		if(bitlist) {
1361 			if(!cfg_strbytelist_insert(
1362 				&cfg_parser->cfg->local_zone_tags,
1363 				$2, bitlist, len)) {
1364 				yyerror("out of memory");
1365 				free($2);
1366 			}
1367 		}
1368 	}
1369 	;
1370 server_access_control_tag: VAR_ACCESS_CONTROL_TAG STRING_ARG STRING_ARG
1371 	{
1372 		size_t len = 0;
1373 		uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
1374 			&len);
1375 		free($3);
1376 		OUTYY(("P(server_access_control_tag:%s)\n", $2));
1377 		if(!bitlist)
1378 			yyerror("could not parse tags, (define-tag them first)");
1379 		if(bitlist) {
1380 			if(!cfg_strbytelist_insert(
1381 				&cfg_parser->cfg->acl_tags,
1382 				$2, bitlist, len)) {
1383 				yyerror("out of memory");
1384 				free($2);
1385 			}
1386 		}
1387 	}
1388 	;
1389 server_access_control_tag_action: VAR_ACCESS_CONTROL_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG
1390 	{
1391 		OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", $2, $3, $4));
1392 		if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions,
1393 			$2, $3, $4)) {
1394 			yyerror("out of memory");
1395 			free($2);
1396 			free($3);
1397 			free($4);
1398 		}
1399 	}
1400 	;
1401 server_access_control_tag_data: VAR_ACCESS_CONTROL_TAG_DATA STRING_ARG STRING_ARG STRING_ARG
1402 	{
1403 		OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", $2, $3, $4));
1404 		if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas,
1405 			$2, $3, $4)) {
1406 			yyerror("out of memory");
1407 			free($2);
1408 			free($3);
1409 			free($4);
1410 		}
1411 	}
1412 	;
1413 server_local_zone_override: VAR_LOCAL_ZONE_OVERRIDE STRING_ARG STRING_ARG STRING_ARG
1414 	{
1415 		OUTYY(("P(server_local_zone_override:%s %s %s)\n", $2, $3, $4));
1416 		if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides,
1417 			$2, $3, $4)) {
1418 			yyerror("out of memory");
1419 			free($2);
1420 			free($3);
1421 			free($4);
1422 		}
1423 	}
1424 	;
1425 server_ratelimit: VAR_RATELIMIT STRING_ARG
1426 	{
1427 		OUTYY(("P(server_ratelimit:%s)\n", $2));
1428 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1429 			yyerror("number expected");
1430 		else cfg_parser->cfg->ratelimit = atoi($2);
1431 		free($2);
1432 	}
1433 	;
1434 server_ratelimit_size: VAR_RATELIMIT_SIZE STRING_ARG
1435 	{
1436 		OUTYY(("P(server_ratelimit_size:%s)\n", $2));
1437 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->ratelimit_size))
1438 			yyerror("memory size expected");
1439 		free($2);
1440 	}
1441 	;
1442 server_ratelimit_slabs: VAR_RATELIMIT_SLABS STRING_ARG
1443 	{
1444 		OUTYY(("P(server_ratelimit_slabs:%s)\n", $2));
1445 		if(atoi($2) == 0)
1446 			yyerror("number expected");
1447 		else {
1448 			cfg_parser->cfg->ratelimit_slabs = atoi($2);
1449 			if(!is_pow2(cfg_parser->cfg->ratelimit_slabs))
1450 				yyerror("must be a power of 2");
1451 		}
1452 		free($2);
1453 	}
1454 	;
1455 server_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG
1456 	{
1457 		OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", $2, $3));
1458 		if(atoi($3) == 0 && strcmp($3, "0") != 0) {
1459 			yyerror("number expected");
1460 		} else {
1461 			if(!cfg_str2list_insert(&cfg_parser->cfg->
1462 				ratelimit_for_domain, $2, $3))
1463 				fatal_exit("out of memory adding "
1464 					"ratelimit-for-domain");
1465 		}
1466 	}
1467 	;
1468 server_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG
1469 	{
1470 		OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", $2, $3));
1471 		if(atoi($3) == 0 && strcmp($3, "0") != 0) {
1472 			yyerror("number expected");
1473 		} else {
1474 			if(!cfg_str2list_insert(&cfg_parser->cfg->
1475 				ratelimit_below_domain, $2, $3))
1476 				fatal_exit("out of memory adding "
1477 					"ratelimit-below-domain");
1478 		}
1479 	}
1480 	;
1481 server_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG
1482 	{
1483 		OUTYY(("P(server_ratelimit_factor:%s)\n", $2));
1484 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1485 			yyerror("number expected");
1486 		else cfg_parser->cfg->ratelimit_factor = atoi($2);
1487 		free($2);
1488 	}
1489 	;
1490 server_qname_minimisation: VAR_QNAME_MINIMISATION STRING_ARG
1491 	{
1492 		OUTYY(("P(server_qname_minimisation:%s)\n", $2));
1493 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1494 			yyerror("expected yes or no.");
1495 		else cfg_parser->cfg->qname_minimisation =
1496 			(strcmp($2, "yes")==0);
1497 		free($2);
1498 	}
1499 	;
1500 stub_name: VAR_NAME STRING_ARG
1501 	{
1502 		OUTYY(("P(name:%s)\n", $2));
1503 		if(cfg_parser->cfg->stubs->name)
1504 			yyerror("stub name override, there must be one name "
1505 				"for one stub-zone");
1506 		free(cfg_parser->cfg->stubs->name);
1507 		cfg_parser->cfg->stubs->name = $2;
1508 	}
1509 	;
1510 stub_host: VAR_STUB_HOST STRING_ARG
1511 	{
1512 		OUTYY(("P(stub-host:%s)\n", $2));
1513 		if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, $2))
1514 			yyerror("out of memory");
1515 	}
1516 	;
1517 stub_addr: VAR_STUB_ADDR STRING_ARG
1518 	{
1519 		OUTYY(("P(stub-addr:%s)\n", $2));
1520 		if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, $2))
1521 			yyerror("out of memory");
1522 	}
1523 	;
1524 stub_first: VAR_STUB_FIRST STRING_ARG
1525 	{
1526 		OUTYY(("P(stub-first:%s)\n", $2));
1527 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1528 			yyerror("expected yes or no.");
1529 		else cfg_parser->cfg->stubs->isfirst=(strcmp($2, "yes")==0);
1530 		free($2);
1531 	}
1532 	;
1533 stub_prime: VAR_STUB_PRIME STRING_ARG
1534 	{
1535 		OUTYY(("P(stub-prime:%s)\n", $2));
1536 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1537 			yyerror("expected yes or no.");
1538 		else cfg_parser->cfg->stubs->isprime =
1539 			(strcmp($2, "yes")==0);
1540 		free($2);
1541 	}
1542 	;
1543 forward_name: VAR_NAME STRING_ARG
1544 	{
1545 		OUTYY(("P(name:%s)\n", $2));
1546 		if(cfg_parser->cfg->forwards->name)
1547 			yyerror("forward name override, there must be one "
1548 				"name for one forward-zone");
1549 		free(cfg_parser->cfg->forwards->name);
1550 		cfg_parser->cfg->forwards->name = $2;
1551 	}
1552 	;
1553 forward_host: VAR_FORWARD_HOST STRING_ARG
1554 	{
1555 		OUTYY(("P(forward-host:%s)\n", $2));
1556 		if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, $2))
1557 			yyerror("out of memory");
1558 	}
1559 	;
1560 forward_addr: VAR_FORWARD_ADDR STRING_ARG
1561 	{
1562 		OUTYY(("P(forward-addr:%s)\n", $2));
1563 		if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, $2))
1564 			yyerror("out of memory");
1565 	}
1566 	;
1567 forward_first: VAR_FORWARD_FIRST STRING_ARG
1568 	{
1569 		OUTYY(("P(forward-first:%s)\n", $2));
1570 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1571 			yyerror("expected yes or no.");
1572 		else cfg_parser->cfg->forwards->isfirst=(strcmp($2, "yes")==0);
1573 		free($2);
1574 	}
1575 	;
1576 rcstart: VAR_REMOTE_CONTROL
1577 	{
1578 		OUTYY(("\nP(remote-control:)\n"));
1579 	}
1580 	;
1581 contents_rc: contents_rc content_rc
1582 	| ;
1583 content_rc: rc_control_enable | rc_control_interface | rc_control_port |
1584 	rc_server_key_file | rc_server_cert_file | rc_control_key_file |
1585 	rc_control_cert_file | rc_control_use_cert
1586 	;
1587 rc_control_enable: VAR_CONTROL_ENABLE STRING_ARG
1588 	{
1589 		OUTYY(("P(control_enable:%s)\n", $2));
1590 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1591 			yyerror("expected yes or no.");
1592 		else cfg_parser->cfg->remote_control_enable =
1593 			(strcmp($2, "yes")==0);
1594 		free($2);
1595 	}
1596 	;
1597 rc_control_port: VAR_CONTROL_PORT STRING_ARG
1598 	{
1599 		OUTYY(("P(control_port:%s)\n", $2));
1600 		if(atoi($2) == 0)
1601 			yyerror("control port number expected");
1602 		else cfg_parser->cfg->control_port = atoi($2);
1603 		free($2);
1604 	}
1605 	;
1606 rc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG
1607 	{
1608 		OUTYY(("P(control_interface:%s)\n", $2));
1609 		if(!cfg_strlist_insert(&cfg_parser->cfg->control_ifs, $2))
1610 			yyerror("out of memory");
1611 	}
1612 	;
1613 rc_control_use_cert: VAR_CONTROL_USE_CERT STRING_ARG
1614 	{
1615 		OUTYY(("P(control_use_cert:%s)\n", $2));
1616 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1617 			yyerror("expected yes or no.");
1618 		else cfg_parser->cfg->remote_control_use_cert =
1619 			(strcmp($2, "yes")==0);
1620 		free($2);
1621 	}
1622 	;
1623 rc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG
1624 	{
1625 		OUTYY(("P(rc_server_key_file:%s)\n", $2));
1626 		free(cfg_parser->cfg->server_key_file);
1627 		cfg_parser->cfg->server_key_file = $2;
1628 	}
1629 	;
1630 rc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG
1631 	{
1632 		OUTYY(("P(rc_server_cert_file:%s)\n", $2));
1633 		free(cfg_parser->cfg->server_cert_file);
1634 		cfg_parser->cfg->server_cert_file = $2;
1635 	}
1636 	;
1637 rc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG
1638 	{
1639 		OUTYY(("P(rc_control_key_file:%s)\n", $2));
1640 		free(cfg_parser->cfg->control_key_file);
1641 		cfg_parser->cfg->control_key_file = $2;
1642 	}
1643 	;
1644 rc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG
1645 	{
1646 		OUTYY(("P(rc_control_cert_file:%s)\n", $2));
1647 		free(cfg_parser->cfg->control_cert_file);
1648 		cfg_parser->cfg->control_cert_file = $2;
1649 	}
1650 	;
1651 dtstart: VAR_DNSTAP
1652 	{
1653 		OUTYY(("\nP(dnstap:)\n"));
1654 	}
1655 	;
1656 contents_dt: contents_dt content_dt
1657 	| ;
1658 content_dt: dt_dnstap_enable | dt_dnstap_socket_path |
1659 	dt_dnstap_send_identity | dt_dnstap_send_version |
1660 	dt_dnstap_identity | dt_dnstap_version |
1661 	dt_dnstap_log_resolver_query_messages |
1662 	dt_dnstap_log_resolver_response_messages |
1663 	dt_dnstap_log_client_query_messages |
1664 	dt_dnstap_log_client_response_messages |
1665 	dt_dnstap_log_forwarder_query_messages |
1666 	dt_dnstap_log_forwarder_response_messages
1667 	;
1668 dt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG
1669 	{
1670 		OUTYY(("P(dt_dnstap_enable:%s)\n", $2));
1671 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1672 			yyerror("expected yes or no.");
1673 		else cfg_parser->cfg->dnstap = (strcmp($2, "yes")==0);
1674 	}
1675 	;
1676 dt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG
1677 	{
1678 		OUTYY(("P(dt_dnstap_socket_path:%s)\n", $2));
1679 		free(cfg_parser->cfg->dnstap_socket_path);
1680 		cfg_parser->cfg->dnstap_socket_path = $2;
1681 	}
1682 	;
1683 dt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG
1684 	{
1685 		OUTYY(("P(dt_dnstap_send_identity:%s)\n", $2));
1686 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1687 			yyerror("expected yes or no.");
1688 		else cfg_parser->cfg->dnstap_send_identity = (strcmp($2, "yes")==0);
1689 	}
1690 	;
1691 dt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG
1692 	{
1693 		OUTYY(("P(dt_dnstap_send_version:%s)\n", $2));
1694 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1695 			yyerror("expected yes or no.");
1696 		else cfg_parser->cfg->dnstap_send_version = (strcmp($2, "yes")==0);
1697 	}
1698 	;
1699 dt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG
1700 	{
1701 		OUTYY(("P(dt_dnstap_identity:%s)\n", $2));
1702 		free(cfg_parser->cfg->dnstap_identity);
1703 		cfg_parser->cfg->dnstap_identity = $2;
1704 	}
1705 	;
1706 dt_dnstap_version: VAR_DNSTAP_VERSION STRING_ARG
1707 	{
1708 		OUTYY(("P(dt_dnstap_version:%s)\n", $2));
1709 		free(cfg_parser->cfg->dnstap_version);
1710 		cfg_parser->cfg->dnstap_version = $2;
1711 	}
1712 	;
1713 dt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES STRING_ARG
1714 	{
1715 		OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", $2));
1716 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1717 			yyerror("expected yes or no.");
1718 		else cfg_parser->cfg->dnstap_log_resolver_query_messages =
1719 			(strcmp($2, "yes")==0);
1720 	}
1721 	;
1722 dt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG
1723 	{
1724 		OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", $2));
1725 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1726 			yyerror("expected yes or no.");
1727 		else cfg_parser->cfg->dnstap_log_resolver_response_messages =
1728 			(strcmp($2, "yes")==0);
1729 	}
1730 	;
1731 dt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG
1732 	{
1733 		OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", $2));
1734 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1735 			yyerror("expected yes or no.");
1736 		else cfg_parser->cfg->dnstap_log_client_query_messages =
1737 			(strcmp($2, "yes")==0);
1738 	}
1739 	;
1740 dt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG
1741 	{
1742 		OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", $2));
1743 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1744 			yyerror("expected yes or no.");
1745 		else cfg_parser->cfg->dnstap_log_client_response_messages =
1746 			(strcmp($2, "yes")==0);
1747 	}
1748 	;
1749 dt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG
1750 	{
1751 		OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", $2));
1752 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1753 			yyerror("expected yes or no.");
1754 		else cfg_parser->cfg->dnstap_log_forwarder_query_messages =
1755 			(strcmp($2, "yes")==0);
1756 	}
1757 	;
1758 dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG
1759 	{
1760 		OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", $2));
1761 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1762 			yyerror("expected yes or no.");
1763 		else cfg_parser->cfg->dnstap_log_forwarder_response_messages =
1764 			(strcmp($2, "yes")==0);
1765 	}
1766 	;
1767 pythonstart: VAR_PYTHON
1768 	{
1769 		OUTYY(("\nP(python:)\n"));
1770 	}
1771 	;
1772 contents_py: contents_py content_py
1773 	| ;
1774 content_py: py_script
1775 	;
1776 py_script: VAR_PYTHON_SCRIPT STRING_ARG
1777 	{
1778 		OUTYY(("P(python-script:%s)\n", $2));
1779 		free(cfg_parser->cfg->python_script);
1780 		cfg_parser->cfg->python_script = $2;
1781 	}
1782 server_disable_dnssec_lame_check: VAR_DISABLE_DNSSEC_LAME_CHECK STRING_ARG
1783 	{
1784 		OUTYY(("P(disable_dnssec_lame_check:%s)\n", $2));
1785 		if (strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1786 			yyerror("expected yes or no.");
1787 		else cfg_parser->cfg->disable_dnssec_lame_check =
1788 			(strcmp($2, "yes")==0);
1789 		free($2);
1790 	}
1791 %%
1792 
1793 /* parse helper routines could be here */
1794