1238106Sdes/*
2238106Sdes * configparser.y -- yacc grammar for unbound configuration files
3238106Sdes *
4238106Sdes * Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
5238106Sdes *
6238106Sdes * Copyright (c) 2007, NLnet Labs. All rights reserved.
7238106Sdes *
8238106Sdes * This software is open source.
9238106Sdes *
10238106Sdes * Redistribution and use in source and binary forms, with or without
11238106Sdes * modification, are permitted provided that the following conditions
12238106Sdes * are met:
13238106Sdes *
14238106Sdes * Redistributions of source code must retain the above copyright notice,
15238106Sdes * this list of conditions and the following disclaimer.
16238106Sdes *
17238106Sdes * Redistributions in binary form must reproduce the above copyright notice,
18238106Sdes * this list of conditions and the following disclaimer in the documentation
19238106Sdes * and/or other materials provided with the distribution.
20238106Sdes *
21238106Sdes * Neither the name of the NLNET LABS nor the names of its contributors may
22238106Sdes * be used to endorse or promote products derived from this software without
23238106Sdes * specific prior written permission.
24238106Sdes *
25238106Sdes * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26269257Sdes * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27269257Sdes * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28269257Sdes * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29269257Sdes * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30269257Sdes * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
31269257Sdes * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32269257Sdes * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33269257Sdes * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34269257Sdes * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35269257Sdes * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36238106Sdes */
37238106Sdes
38238106Sdes%{
39238106Sdes#include "config.h"
40238106Sdes
41238106Sdes#include <stdarg.h>
42238106Sdes#include <stdio.h>
43238106Sdes#include <string.h>
44238106Sdes#include <stdlib.h>
45238106Sdes#include <assert.h>
46238106Sdes
47285206Sdes#include "util/configyyrename.h"
48238106Sdes#include "util/config_file.h"
49238106Sdes#include "util/net_help.h"
50238106Sdes
51238106Sdesint ub_c_lex(void);
52238106Sdesvoid ub_c_error(const char *message);
53238106Sdes
54238106Sdes/* these need to be global, otherwise they cannot be used inside yacc */
55238106Sdesextern struct config_parser_state* cfg_parser;
56238106Sdes
57238106Sdes#if 0
58238106Sdes#define OUTYY(s)  printf s /* used ONLY when debugging */
59238106Sdes#else
60238106Sdes#define OUTYY(s)
61238106Sdes#endif
62238106Sdes
63238106Sdes%}
64238106Sdes%union {
65238106Sdes	char*	str;
66238106Sdes};
67238106Sdes
68238106Sdes%token SPACE LETTER NEWLINE COMMENT COLON ANY ZONESTR
69238106Sdes%token <str> STRING_ARG
70238106Sdes%token VAR_SERVER VAR_VERBOSITY VAR_NUM_THREADS VAR_PORT
71238106Sdes%token VAR_OUTGOING_RANGE VAR_INTERFACE
72238106Sdes%token VAR_DO_IP4 VAR_DO_IP6 VAR_DO_UDP VAR_DO_TCP
73238106Sdes%token VAR_CHROOT VAR_USERNAME VAR_DIRECTORY VAR_LOGFILE VAR_PIDFILE
74238106Sdes%token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS VAR_NUM_QUERIES_PER_THREAD
75238106Sdes%token VAR_RRSET_CACHE_SIZE VAR_RRSET_CACHE_SLABS VAR_OUTGOING_NUM_TCP
76238106Sdes%token VAR_INFRA_HOST_TTL VAR_INFRA_LAME_TTL VAR_INFRA_CACHE_SLABS
77238106Sdes%token VAR_INFRA_CACHE_NUMHOSTS VAR_INFRA_CACHE_LAME_SIZE VAR_NAME
78238106Sdes%token VAR_STUB_ZONE VAR_STUB_HOST VAR_STUB_ADDR VAR_TARGET_FETCH_POLICY
79238106Sdes%token VAR_HARDEN_SHORT_BUFSIZE VAR_HARDEN_LARGE_QUERIES
80238106Sdes%token VAR_FORWARD_ZONE VAR_FORWARD_HOST VAR_FORWARD_ADDR
81238106Sdes%token VAR_DO_NOT_QUERY_ADDRESS VAR_HIDE_IDENTITY VAR_HIDE_VERSION
82238106Sdes%token VAR_IDENTITY VAR_VERSION VAR_HARDEN_GLUE VAR_MODULE_CONF
83238106Sdes%token VAR_TRUST_ANCHOR_FILE VAR_TRUST_ANCHOR VAR_VAL_OVERRIDE_DATE
84238106Sdes%token VAR_BOGUS_TTL VAR_VAL_CLEAN_ADDITIONAL VAR_VAL_PERMISSIVE_MODE
85238106Sdes%token VAR_INCOMING_NUM_TCP VAR_MSG_BUFFER_SIZE VAR_KEY_CACHE_SIZE
86238106Sdes%token VAR_KEY_CACHE_SLABS VAR_TRUSTED_KEYS_FILE
87238106Sdes%token VAR_VAL_NSEC3_KEYSIZE_ITERATIONS VAR_USE_SYSLOG
88238106Sdes%token VAR_OUTGOING_INTERFACE VAR_ROOT_HINTS VAR_DO_NOT_QUERY_LOCALHOST
89238106Sdes%token VAR_CACHE_MAX_TTL VAR_HARDEN_DNSSEC_STRIPPED VAR_ACCESS_CONTROL
90238106Sdes%token VAR_LOCAL_ZONE VAR_LOCAL_DATA VAR_INTERFACE_AUTOMATIC
91238106Sdes%token VAR_STATISTICS_INTERVAL VAR_DO_DAEMONIZE VAR_USE_CAPS_FOR_ID
92238106Sdes%token VAR_STATISTICS_CUMULATIVE VAR_OUTGOING_PORT_PERMIT
93238106Sdes%token VAR_OUTGOING_PORT_AVOID VAR_DLV_ANCHOR_FILE VAR_DLV_ANCHOR
94238106Sdes%token VAR_NEG_CACHE_SIZE VAR_HARDEN_REFERRAL_PATH VAR_PRIVATE_ADDRESS
95238106Sdes%token VAR_PRIVATE_DOMAIN VAR_REMOTE_CONTROL VAR_CONTROL_ENABLE
96238106Sdes%token VAR_CONTROL_INTERFACE VAR_CONTROL_PORT VAR_SERVER_KEY_FILE
97238106Sdes%token VAR_SERVER_CERT_FILE VAR_CONTROL_KEY_FILE VAR_CONTROL_CERT_FILE
98285206Sdes%token VAR_CONTROL_USE_CERT
99238106Sdes%token VAR_EXTENDED_STATISTICS VAR_LOCAL_DATA_PTR VAR_JOSTLE_TIMEOUT
100238106Sdes%token VAR_STUB_PRIME VAR_UNWANTED_REPLY_THRESHOLD VAR_LOG_TIME_ASCII
101238106Sdes%token VAR_DOMAIN_INSECURE VAR_PYTHON VAR_PYTHON_SCRIPT VAR_VAL_SIG_SKEW_MIN
102238106Sdes%token VAR_VAL_SIG_SKEW_MAX VAR_CACHE_MIN_TTL VAR_VAL_LOG_LEVEL
103238106Sdes%token VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING VAR_ADD_HOLDDOWN
104238106Sdes%token VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE VAR_PREFETCH
105269257Sdes%token VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT VAR_HARDEN_BELOW_NXDOMAIN
106238106Sdes%token VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES VAR_TCP_UPSTREAM VAR_SSL_UPSTREAM
107238106Sdes%token VAR_SSL_SERVICE_KEY VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST
108238106Sdes%token VAR_STUB_FIRST VAR_MINIMAL_RESPONSES VAR_RRSET_ROUNDROBIN
109295691Sdes%token VAR_MAX_UDP_SIZE VAR_DELAY_CLOSE
110295691Sdes%token VAR_UNBLOCK_LAN_ZONES VAR_INSECURE_LAN_ZONES
111285206Sdes%token VAR_INFRA_CACHE_MIN_RTT
112285206Sdes%token VAR_DNS64_PREFIX VAR_DNS64_SYNTHALL
113285206Sdes%token VAR_DNSTAP VAR_DNSTAP_ENABLE VAR_DNSTAP_SOCKET_PATH
114285206Sdes%token VAR_DNSTAP_SEND_IDENTITY VAR_DNSTAP_SEND_VERSION
115285206Sdes%token VAR_DNSTAP_IDENTITY VAR_DNSTAP_VERSION
116285206Sdes%token VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES
117285206Sdes%token VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES
118285206Sdes%token VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES
119285206Sdes%token VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES
120285206Sdes%token VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES
121285206Sdes%token VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES
122291767Sdes%token VAR_HARDEN_ALGO_DOWNGRADE VAR_IP_TRANSPARENT
123291767Sdes%token VAR_RATELIMIT VAR_RATELIMIT_SLABS VAR_RATELIMIT_SIZE
124291767Sdes%token VAR_RATELIMIT_FOR_DOMAIN VAR_RATELIMIT_BELOW_DOMAIN VAR_RATELIMIT_FACTOR
125291767Sdes%token VAR_CAPS_WHITELIST VAR_CACHE_MAX_NEGATIVE_TTL VAR_PERMIT_SMALL_HOLDDOWN
126294190Sdes%token VAR_QNAME_MINIMISATION
127238106Sdes
128238106Sdes%%
129238106Sdestoplevelvars: /* empty */ | toplevelvars toplevelvar ;
130238106Sdestoplevelvar: serverstart contents_server | stubstart contents_stub |
131238106Sdes	forwardstart contents_forward | pythonstart contents_py |
132285206Sdes	rcstart contents_rc | dtstart contents_dt
133238106Sdes	;
134238106Sdes
135238106Sdes/* server: declaration */
136238106Sdesserverstart: VAR_SERVER
137238106Sdes	{
138238106Sdes		OUTYY(("\nP(server:)\n"));
139238106Sdes	}
140238106Sdes	;
141238106Sdescontents_server: contents_server content_server
142238106Sdes	| ;
143238106Sdescontent_server: server_num_threads | server_verbosity | server_port |
144238106Sdes	server_outgoing_range | server_do_ip4 |
145238106Sdes	server_do_ip6 | server_do_udp | server_do_tcp |
146238106Sdes	server_interface | server_chroot | server_username |
147238106Sdes	server_directory | server_logfile | server_pidfile |
148238106Sdes	server_msg_cache_size | server_msg_cache_slabs |
149238106Sdes	server_num_queries_per_thread | server_rrset_cache_size |
150238106Sdes	server_rrset_cache_slabs | server_outgoing_num_tcp |
151238106Sdes	server_infra_host_ttl | server_infra_lame_ttl |
152238106Sdes	server_infra_cache_slabs | server_infra_cache_numhosts |
153238106Sdes	server_infra_cache_lame_size | server_target_fetch_policy |
154238106Sdes	server_harden_short_bufsize | server_harden_large_queries |
155238106Sdes	server_do_not_query_address | server_hide_identity |
156238106Sdes	server_hide_version | server_identity | server_version |
157238106Sdes	server_harden_glue | server_module_conf | server_trust_anchor_file |
158238106Sdes	server_trust_anchor | server_val_override_date | server_bogus_ttl |
159238106Sdes	server_val_clean_additional | server_val_permissive_mode |
160238106Sdes	server_incoming_num_tcp | server_msg_buffer_size |
161238106Sdes	server_key_cache_size | server_key_cache_slabs |
162238106Sdes	server_trusted_keys_file | server_val_nsec3_keysize_iterations |
163238106Sdes	server_use_syslog | server_outgoing_interface | server_root_hints |
164238106Sdes	server_do_not_query_localhost | server_cache_max_ttl |
165238106Sdes	server_harden_dnssec_stripped | server_access_control |
166238106Sdes	server_local_zone | server_local_data | server_interface_automatic |
167238106Sdes	server_statistics_interval | server_do_daemonize |
168238106Sdes	server_use_caps_for_id | server_statistics_cumulative |
169238106Sdes	server_outgoing_port_permit | server_outgoing_port_avoid |
170238106Sdes	server_dlv_anchor_file | server_dlv_anchor | server_neg_cache_size |
171238106Sdes	server_harden_referral_path | server_private_address |
172238106Sdes	server_private_domain | server_extended_statistics |
173238106Sdes	server_local_data_ptr | server_jostle_timeout |
174238106Sdes	server_unwanted_reply_threshold | server_log_time_ascii |
175238106Sdes	server_domain_insecure | server_val_sig_skew_min |
176238106Sdes	server_val_sig_skew_max | server_cache_min_ttl | server_val_log_level |
177238106Sdes	server_auto_trust_anchor_file | server_add_holddown |
178238106Sdes	server_del_holddown | server_keep_missing | server_so_rcvbuf |
179238106Sdes	server_edns_buffer_size | server_prefetch | server_prefetch_key |
180238106Sdes	server_so_sndbuf | server_harden_below_nxdomain | server_ignore_cd_flag |
181238106Sdes	server_log_queries | server_tcp_upstream | server_ssl_upstream |
182238106Sdes	server_ssl_service_key | server_ssl_service_pem | server_ssl_port |
183269257Sdes	server_minimal_responses | server_rrset_roundrobin | server_max_udp_size |
184295691Sdes	server_so_reuseport | server_delay_close |
185295691Sdes	server_unblock_lan_zones | server_insecure_lan_zones |
186285206Sdes	server_dns64_prefix | server_dns64_synthall |
187291767Sdes	server_infra_cache_min_rtt | server_harden_algo_downgrade |
188291767Sdes	server_ip_transparent | server_ratelimit | server_ratelimit_slabs |
189291767Sdes	server_ratelimit_size | server_ratelimit_for_domain |
190291767Sdes	server_ratelimit_below_domain | server_ratelimit_factor |
191291767Sdes	server_caps_whitelist | server_cache_max_negative_ttl |
192294190Sdes	server_permit_small_holddown | server_qname_minimisation
193238106Sdes	;
194238106Sdesstubstart: VAR_STUB_ZONE
195238106Sdes	{
196238106Sdes		struct config_stub* s;
197238106Sdes		OUTYY(("\nP(stub_zone:)\n"));
198238106Sdes		s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
199238106Sdes		if(s) {
200238106Sdes			s->next = cfg_parser->cfg->stubs;
201238106Sdes			cfg_parser->cfg->stubs = s;
202238106Sdes		} else
203238106Sdes			yyerror("out of memory");
204238106Sdes	}
205238106Sdes	;
206238106Sdescontents_stub: contents_stub content_stub
207238106Sdes	| ;
208238106Sdescontent_stub: stub_name | stub_host | stub_addr | stub_prime | stub_first
209238106Sdes	;
210238106Sdesforwardstart: VAR_FORWARD_ZONE
211238106Sdes	{
212238106Sdes		struct config_stub* s;
213238106Sdes		OUTYY(("\nP(forward_zone:)\n"));
214238106Sdes		s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
215238106Sdes		if(s) {
216238106Sdes			s->next = cfg_parser->cfg->forwards;
217238106Sdes			cfg_parser->cfg->forwards = s;
218238106Sdes		} else
219238106Sdes			yyerror("out of memory");
220238106Sdes	}
221238106Sdes	;
222238106Sdescontents_forward: contents_forward content_forward
223238106Sdes	| ;
224238106Sdescontent_forward: forward_name | forward_host | forward_addr | forward_first
225238106Sdes	;
226238106Sdesserver_num_threads: VAR_NUM_THREADS STRING_ARG
227238106Sdes	{
228238106Sdes		OUTYY(("P(server_num_threads:%s)\n", $2));
229238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
230238106Sdes			yyerror("number expected");
231238106Sdes		else cfg_parser->cfg->num_threads = atoi($2);
232238106Sdes		free($2);
233238106Sdes	}
234238106Sdes	;
235238106Sdesserver_verbosity: VAR_VERBOSITY STRING_ARG
236238106Sdes	{
237238106Sdes		OUTYY(("P(server_verbosity:%s)\n", $2));
238238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
239238106Sdes			yyerror("number expected");
240238106Sdes		else cfg_parser->cfg->verbosity = atoi($2);
241238106Sdes		free($2);
242238106Sdes	}
243238106Sdes	;
244238106Sdesserver_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG
245238106Sdes	{
246238106Sdes		OUTYY(("P(server_statistics_interval:%s)\n", $2));
247238106Sdes		if(strcmp($2, "") == 0 || strcmp($2, "0") == 0)
248238106Sdes			cfg_parser->cfg->stat_interval = 0;
249238106Sdes		else if(atoi($2) == 0)
250238106Sdes			yyerror("number expected");
251238106Sdes		else cfg_parser->cfg->stat_interval = atoi($2);
252238106Sdes		free($2);
253238106Sdes	}
254238106Sdes	;
255238106Sdesserver_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG
256238106Sdes	{
257238106Sdes		OUTYY(("P(server_statistics_cumulative:%s)\n", $2));
258238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
259238106Sdes			yyerror("expected yes or no.");
260238106Sdes		else cfg_parser->cfg->stat_cumulative = (strcmp($2, "yes")==0);
261238106Sdes		free($2);
262238106Sdes	}
263238106Sdes	;
264238106Sdesserver_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG
265238106Sdes	{
266238106Sdes		OUTYY(("P(server_extended_statistics:%s)\n", $2));
267238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
268238106Sdes			yyerror("expected yes or no.");
269238106Sdes		else cfg_parser->cfg->stat_extended = (strcmp($2, "yes")==0);
270238106Sdes		free($2);
271238106Sdes	}
272238106Sdes	;
273238106Sdesserver_port: VAR_PORT STRING_ARG
274238106Sdes	{
275238106Sdes		OUTYY(("P(server_port:%s)\n", $2));
276238106Sdes		if(atoi($2) == 0)
277238106Sdes			yyerror("port number expected");
278238106Sdes		else cfg_parser->cfg->port = atoi($2);
279238106Sdes		free($2);
280238106Sdes	}
281238106Sdes	;
282238106Sdesserver_interface: VAR_INTERFACE STRING_ARG
283238106Sdes	{
284238106Sdes		OUTYY(("P(server_interface:%s)\n", $2));
285238106Sdes		if(cfg_parser->cfg->num_ifs == 0)
286238106Sdes			cfg_parser->cfg->ifs = calloc(1, sizeof(char*));
287238106Sdes		else 	cfg_parser->cfg->ifs = realloc(cfg_parser->cfg->ifs,
288238106Sdes				(cfg_parser->cfg->num_ifs+1)*sizeof(char*));
289238106Sdes		if(!cfg_parser->cfg->ifs)
290238106Sdes			yyerror("out of memory");
291238106Sdes		else
292238106Sdes			cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = $2;
293238106Sdes	}
294238106Sdes	;
295238106Sdesserver_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG
296238106Sdes	{
297238106Sdes		OUTYY(("P(server_outgoing_interface:%s)\n", $2));
298238106Sdes		if(cfg_parser->cfg->num_out_ifs == 0)
299238106Sdes			cfg_parser->cfg->out_ifs = calloc(1, sizeof(char*));
300238106Sdes		else 	cfg_parser->cfg->out_ifs = realloc(
301238106Sdes			cfg_parser->cfg->out_ifs,
302238106Sdes			(cfg_parser->cfg->num_out_ifs+1)*sizeof(char*));
303238106Sdes		if(!cfg_parser->cfg->out_ifs)
304238106Sdes			yyerror("out of memory");
305238106Sdes		else
306238106Sdes			cfg_parser->cfg->out_ifs[
307238106Sdes				cfg_parser->cfg->num_out_ifs++] = $2;
308238106Sdes	}
309238106Sdes	;
310238106Sdesserver_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG
311238106Sdes	{
312238106Sdes		OUTYY(("P(server_outgoing_range:%s)\n", $2));
313238106Sdes		if(atoi($2) == 0)
314238106Sdes			yyerror("number expected");
315238106Sdes		else cfg_parser->cfg->outgoing_num_ports = atoi($2);
316238106Sdes		free($2);
317238106Sdes	}
318238106Sdes	;
319238106Sdesserver_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG
320238106Sdes	{
321238106Sdes		OUTYY(("P(server_outgoing_port_permit:%s)\n", $2));
322238106Sdes		if(!cfg_mark_ports($2, 1,
323238106Sdes			cfg_parser->cfg->outgoing_avail_ports, 65536))
324238106Sdes			yyerror("port number or range (\"low-high\") expected");
325238106Sdes		free($2);
326238106Sdes	}
327238106Sdes	;
328238106Sdesserver_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG
329238106Sdes	{
330238106Sdes		OUTYY(("P(server_outgoing_port_avoid:%s)\n", $2));
331238106Sdes		if(!cfg_mark_ports($2, 0,
332238106Sdes			cfg_parser->cfg->outgoing_avail_ports, 65536))
333238106Sdes			yyerror("port number or range (\"low-high\") expected");
334238106Sdes		free($2);
335238106Sdes	}
336238106Sdes	;
337238106Sdesserver_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG
338238106Sdes	{
339238106Sdes		OUTYY(("P(server_outgoing_num_tcp:%s)\n", $2));
340238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
341238106Sdes			yyerror("number expected");
342238106Sdes		else cfg_parser->cfg->outgoing_num_tcp = atoi($2);
343238106Sdes		free($2);
344238106Sdes	}
345238106Sdes	;
346238106Sdesserver_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG
347238106Sdes	{
348238106Sdes		OUTYY(("P(server_incoming_num_tcp:%s)\n", $2));
349238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
350238106Sdes			yyerror("number expected");
351238106Sdes		else cfg_parser->cfg->incoming_num_tcp = atoi($2);
352238106Sdes		free($2);
353238106Sdes	}
354238106Sdes	;
355238106Sdesserver_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG
356238106Sdes	{
357238106Sdes		OUTYY(("P(server_interface_automatic:%s)\n", $2));
358238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
359238106Sdes			yyerror("expected yes or no.");
360238106Sdes		else cfg_parser->cfg->if_automatic = (strcmp($2, "yes")==0);
361238106Sdes		free($2);
362238106Sdes	}
363238106Sdes	;
364238106Sdesserver_do_ip4: VAR_DO_IP4 STRING_ARG
365238106Sdes	{
366238106Sdes		OUTYY(("P(server_do_ip4:%s)\n", $2));
367238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
368238106Sdes			yyerror("expected yes or no.");
369238106Sdes		else cfg_parser->cfg->do_ip4 = (strcmp($2, "yes")==0);
370238106Sdes		free($2);
371238106Sdes	}
372238106Sdes	;
373238106Sdesserver_do_ip6: VAR_DO_IP6 STRING_ARG
374238106Sdes	{
375238106Sdes		OUTYY(("P(server_do_ip6:%s)\n", $2));
376238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
377238106Sdes			yyerror("expected yes or no.");
378238106Sdes		else cfg_parser->cfg->do_ip6 = (strcmp($2, "yes")==0);
379238106Sdes		free($2);
380238106Sdes	}
381238106Sdes	;
382238106Sdesserver_do_udp: VAR_DO_UDP STRING_ARG
383238106Sdes	{
384238106Sdes		OUTYY(("P(server_do_udp:%s)\n", $2));
385238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
386238106Sdes			yyerror("expected yes or no.");
387238106Sdes		else cfg_parser->cfg->do_udp = (strcmp($2, "yes")==0);
388238106Sdes		free($2);
389238106Sdes	}
390238106Sdes	;
391238106Sdesserver_do_tcp: VAR_DO_TCP STRING_ARG
392238106Sdes	{
393238106Sdes		OUTYY(("P(server_do_tcp:%s)\n", $2));
394238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
395238106Sdes			yyerror("expected yes or no.");
396238106Sdes		else cfg_parser->cfg->do_tcp = (strcmp($2, "yes")==0);
397238106Sdes		free($2);
398238106Sdes	}
399238106Sdes	;
400238106Sdesserver_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG
401238106Sdes	{
402238106Sdes		OUTYY(("P(server_tcp_upstream:%s)\n", $2));
403238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
404238106Sdes			yyerror("expected yes or no.");
405238106Sdes		else cfg_parser->cfg->tcp_upstream = (strcmp($2, "yes")==0);
406238106Sdes		free($2);
407238106Sdes	}
408238106Sdes	;
409238106Sdesserver_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG
410238106Sdes	{
411238106Sdes		OUTYY(("P(server_ssl_upstream:%s)\n", $2));
412238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
413238106Sdes			yyerror("expected yes or no.");
414238106Sdes		else cfg_parser->cfg->ssl_upstream = (strcmp($2, "yes")==0);
415238106Sdes		free($2);
416238106Sdes	}
417238106Sdes	;
418238106Sdesserver_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG
419238106Sdes	{
420238106Sdes		OUTYY(("P(server_ssl_service_key:%s)\n", $2));
421238106Sdes		free(cfg_parser->cfg->ssl_service_key);
422238106Sdes		cfg_parser->cfg->ssl_service_key = $2;
423238106Sdes	}
424238106Sdes	;
425238106Sdesserver_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG
426238106Sdes	{
427238106Sdes		OUTYY(("P(server_ssl_service_pem:%s)\n", $2));
428238106Sdes		free(cfg_parser->cfg->ssl_service_pem);
429238106Sdes		cfg_parser->cfg->ssl_service_pem = $2;
430238106Sdes	}
431238106Sdes	;
432238106Sdesserver_ssl_port: VAR_SSL_PORT STRING_ARG
433238106Sdes	{
434238106Sdes		OUTYY(("P(server_ssl_port:%s)\n", $2));
435238106Sdes		if(atoi($2) == 0)
436238106Sdes			yyerror("port number expected");
437238106Sdes		else cfg_parser->cfg->ssl_port = atoi($2);
438238106Sdes		free($2);
439238106Sdes	}
440238106Sdes	;
441238106Sdesserver_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG
442238106Sdes	{
443238106Sdes		OUTYY(("P(server_do_daemonize:%s)\n", $2));
444238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
445238106Sdes			yyerror("expected yes or no.");
446238106Sdes		else cfg_parser->cfg->do_daemonize = (strcmp($2, "yes")==0);
447238106Sdes		free($2);
448238106Sdes	}
449238106Sdes	;
450238106Sdesserver_use_syslog: VAR_USE_SYSLOG STRING_ARG
451238106Sdes	{
452238106Sdes		OUTYY(("P(server_use_syslog:%s)\n", $2));
453238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
454238106Sdes			yyerror("expected yes or no.");
455238106Sdes		else cfg_parser->cfg->use_syslog = (strcmp($2, "yes")==0);
456238106Sdes#if !defined(HAVE_SYSLOG_H) && !defined(UB_ON_WINDOWS)
457238106Sdes		if(strcmp($2, "yes") == 0)
458238106Sdes			yyerror("no syslog services are available. "
459238106Sdes				"(reconfigure and compile to add)");
460238106Sdes#endif
461238106Sdes		free($2);
462238106Sdes	}
463238106Sdes	;
464238106Sdesserver_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG
465238106Sdes	{
466238106Sdes		OUTYY(("P(server_log_time_ascii:%s)\n", $2));
467238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
468238106Sdes			yyerror("expected yes or no.");
469238106Sdes		else cfg_parser->cfg->log_time_ascii = (strcmp($2, "yes")==0);
470238106Sdes		free($2);
471238106Sdes	}
472238106Sdes	;
473238106Sdesserver_log_queries: VAR_LOG_QUERIES STRING_ARG
474238106Sdes	{
475238106Sdes		OUTYY(("P(server_log_queries:%s)\n", $2));
476238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
477238106Sdes			yyerror("expected yes or no.");
478238106Sdes		else cfg_parser->cfg->log_queries = (strcmp($2, "yes")==0);
479238106Sdes		free($2);
480238106Sdes	}
481238106Sdes	;
482238106Sdesserver_chroot: VAR_CHROOT STRING_ARG
483238106Sdes	{
484238106Sdes		OUTYY(("P(server_chroot:%s)\n", $2));
485238106Sdes		free(cfg_parser->cfg->chrootdir);
486238106Sdes		cfg_parser->cfg->chrootdir = $2;
487238106Sdes	}
488238106Sdes	;
489238106Sdesserver_username: VAR_USERNAME STRING_ARG
490238106Sdes	{
491238106Sdes		OUTYY(("P(server_username:%s)\n", $2));
492238106Sdes		free(cfg_parser->cfg->username);
493238106Sdes		cfg_parser->cfg->username = $2;
494238106Sdes	}
495238106Sdes	;
496238106Sdesserver_directory: VAR_DIRECTORY STRING_ARG
497238106Sdes	{
498238106Sdes		OUTYY(("P(server_directory:%s)\n", $2));
499238106Sdes		free(cfg_parser->cfg->directory);
500238106Sdes		cfg_parser->cfg->directory = $2;
501238106Sdes	}
502238106Sdes	;
503238106Sdesserver_logfile: VAR_LOGFILE STRING_ARG
504238106Sdes	{
505238106Sdes		OUTYY(("P(server_logfile:%s)\n", $2));
506238106Sdes		free(cfg_parser->cfg->logfile);
507238106Sdes		cfg_parser->cfg->logfile = $2;
508238106Sdes		cfg_parser->cfg->use_syslog = 0;
509238106Sdes	}
510238106Sdes	;
511238106Sdesserver_pidfile: VAR_PIDFILE STRING_ARG
512238106Sdes	{
513238106Sdes		OUTYY(("P(server_pidfile:%s)\n", $2));
514238106Sdes		free(cfg_parser->cfg->pidfile);
515238106Sdes		cfg_parser->cfg->pidfile = $2;
516238106Sdes	}
517238106Sdes	;
518238106Sdesserver_root_hints: VAR_ROOT_HINTS STRING_ARG
519238106Sdes	{
520238106Sdes		OUTYY(("P(server_root_hints:%s)\n", $2));
521238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, $2))
522238106Sdes			yyerror("out of memory");
523238106Sdes	}
524238106Sdes	;
525238106Sdesserver_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG
526238106Sdes	{
527238106Sdes		OUTYY(("P(server_dlv_anchor_file:%s)\n", $2));
528238106Sdes		free(cfg_parser->cfg->dlv_anchor_file);
529238106Sdes		cfg_parser->cfg->dlv_anchor_file = $2;
530238106Sdes	}
531238106Sdes	;
532238106Sdesserver_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG
533238106Sdes	{
534238106Sdes		OUTYY(("P(server_dlv_anchor:%s)\n", $2));
535238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->dlv_anchor_list, $2))
536238106Sdes			yyerror("out of memory");
537238106Sdes	}
538238106Sdes	;
539238106Sdesserver_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG
540238106Sdes	{
541238106Sdes		OUTYY(("P(server_auto_trust_anchor_file:%s)\n", $2));
542238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->
543238106Sdes			auto_trust_anchor_file_list, $2))
544238106Sdes			yyerror("out of memory");
545238106Sdes	}
546238106Sdes	;
547238106Sdesserver_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG
548238106Sdes	{
549238106Sdes		OUTYY(("P(server_trust_anchor_file:%s)\n", $2));
550238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->
551238106Sdes			trust_anchor_file_list, $2))
552238106Sdes			yyerror("out of memory");
553238106Sdes	}
554238106Sdes	;
555238106Sdesserver_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG
556238106Sdes	{
557238106Sdes		OUTYY(("P(server_trusted_keys_file:%s)\n", $2));
558238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->
559238106Sdes			trusted_keys_file_list, $2))
560238106Sdes			yyerror("out of memory");
561238106Sdes	}
562238106Sdes	;
563238106Sdesserver_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG
564238106Sdes	{
565238106Sdes		OUTYY(("P(server_trust_anchor:%s)\n", $2));
566238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, $2))
567238106Sdes			yyerror("out of memory");
568238106Sdes	}
569238106Sdes	;
570238106Sdesserver_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG
571238106Sdes	{
572238106Sdes		OUTYY(("P(server_domain_insecure:%s)\n", $2));
573238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, $2))
574238106Sdes			yyerror("out of memory");
575238106Sdes	}
576238106Sdes	;
577238106Sdesserver_hide_identity: VAR_HIDE_IDENTITY STRING_ARG
578238106Sdes	{
579238106Sdes		OUTYY(("P(server_hide_identity:%s)\n", $2));
580238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
581238106Sdes			yyerror("expected yes or no.");
582238106Sdes		else cfg_parser->cfg->hide_identity = (strcmp($2, "yes")==0);
583238106Sdes		free($2);
584238106Sdes	}
585238106Sdes	;
586238106Sdesserver_hide_version: VAR_HIDE_VERSION STRING_ARG
587238106Sdes	{
588238106Sdes		OUTYY(("P(server_hide_version:%s)\n", $2));
589238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
590238106Sdes			yyerror("expected yes or no.");
591238106Sdes		else cfg_parser->cfg->hide_version = (strcmp($2, "yes")==0);
592238106Sdes		free($2);
593238106Sdes	}
594238106Sdes	;
595238106Sdesserver_identity: VAR_IDENTITY STRING_ARG
596238106Sdes	{
597238106Sdes		OUTYY(("P(server_identity:%s)\n", $2));
598238106Sdes		free(cfg_parser->cfg->identity);
599238106Sdes		cfg_parser->cfg->identity = $2;
600238106Sdes	}
601238106Sdes	;
602238106Sdesserver_version: VAR_VERSION STRING_ARG
603238106Sdes	{
604238106Sdes		OUTYY(("P(server_version:%s)\n", $2));
605238106Sdes		free(cfg_parser->cfg->version);
606238106Sdes		cfg_parser->cfg->version = $2;
607238106Sdes	}
608238106Sdes	;
609238106Sdesserver_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG
610238106Sdes	{
611238106Sdes		OUTYY(("P(server_so_rcvbuf:%s)\n", $2));
612238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_rcvbuf))
613238106Sdes			yyerror("buffer size expected");
614238106Sdes		free($2);
615238106Sdes	}
616238106Sdes	;
617238106Sdesserver_so_sndbuf: VAR_SO_SNDBUF STRING_ARG
618238106Sdes	{
619238106Sdes		OUTYY(("P(server_so_sndbuf:%s)\n", $2));
620238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_sndbuf))
621238106Sdes			yyerror("buffer size expected");
622238106Sdes		free($2);
623238106Sdes	}
624238106Sdes	;
625269257Sdesserver_so_reuseport: VAR_SO_REUSEPORT STRING_ARG
626269257Sdes    {
627269257Sdes        OUTYY(("P(server_so_reuseport:%s)\n", $2));
628269257Sdes        if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
629269257Sdes            yyerror("expected yes or no.");
630269257Sdes        else cfg_parser->cfg->so_reuseport =
631269257Sdes            (strcmp($2, "yes")==0);
632269257Sdes        free($2);
633269257Sdes    }
634269257Sdes    ;
635291767Sdesserver_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG
636291767Sdes    {
637291767Sdes        OUTYY(("P(server_ip_transparent:%s)\n", $2));
638291767Sdes        if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
639291767Sdes            yyerror("expected yes or no.");
640291767Sdes        else cfg_parser->cfg->ip_transparent =
641291767Sdes            (strcmp($2, "yes")==0);
642291767Sdes        free($2);
643291767Sdes    }
644291767Sdes    ;
645238106Sdesserver_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG
646238106Sdes	{
647238106Sdes		OUTYY(("P(server_edns_buffer_size:%s)\n", $2));
648238106Sdes		if(atoi($2) == 0)
649238106Sdes			yyerror("number expected");
650238106Sdes		else if (atoi($2) < 12)
651238106Sdes			yyerror("edns buffer size too small");
652238106Sdes		else if (atoi($2) > 65535)
653238106Sdes			cfg_parser->cfg->edns_buffer_size = 65535;
654238106Sdes		else cfg_parser->cfg->edns_buffer_size = atoi($2);
655238106Sdes		free($2);
656238106Sdes	}
657238106Sdes	;
658238106Sdesserver_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG
659238106Sdes	{
660238106Sdes		OUTYY(("P(server_msg_buffer_size:%s)\n", $2));
661238106Sdes		if(atoi($2) == 0)
662238106Sdes			yyerror("number expected");
663238106Sdes		else if (atoi($2) < 4096)
664238106Sdes			yyerror("message buffer size too small (use 4096)");
665238106Sdes		else cfg_parser->cfg->msg_buffer_size = atoi($2);
666238106Sdes		free($2);
667238106Sdes	}
668238106Sdes	;
669238106Sdesserver_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG
670238106Sdes	{
671238106Sdes		OUTYY(("P(server_msg_cache_size:%s)\n", $2));
672238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->msg_cache_size))
673238106Sdes			yyerror("memory size expected");
674238106Sdes		free($2);
675238106Sdes	}
676238106Sdes	;
677238106Sdesserver_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG
678238106Sdes	{
679238106Sdes		OUTYY(("P(server_msg_cache_slabs:%s)\n", $2));
680238106Sdes		if(atoi($2) == 0)
681238106Sdes			yyerror("number expected");
682238106Sdes		else {
683238106Sdes			cfg_parser->cfg->msg_cache_slabs = atoi($2);
684238106Sdes			if(!is_pow2(cfg_parser->cfg->msg_cache_slabs))
685238106Sdes				yyerror("must be a power of 2");
686238106Sdes		}
687238106Sdes		free($2);
688238106Sdes	}
689238106Sdes	;
690238106Sdesserver_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG
691238106Sdes	{
692238106Sdes		OUTYY(("P(server_num_queries_per_thread:%s)\n", $2));
693238106Sdes		if(atoi($2) == 0)
694238106Sdes			yyerror("number expected");
695238106Sdes		else cfg_parser->cfg->num_queries_per_thread = atoi($2);
696238106Sdes		free($2);
697238106Sdes	}
698238106Sdes	;
699238106Sdesserver_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG
700238106Sdes	{
701238106Sdes		OUTYY(("P(server_jostle_timeout:%s)\n", $2));
702238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
703238106Sdes			yyerror("number expected");
704238106Sdes		else cfg_parser->cfg->jostle_time = atoi($2);
705238106Sdes		free($2);
706238106Sdes	}
707238106Sdes	;
708269257Sdesserver_delay_close: VAR_DELAY_CLOSE STRING_ARG
709269257Sdes	{
710269257Sdes		OUTYY(("P(server_delay_close:%s)\n", $2));
711269257Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
712269257Sdes			yyerror("number expected");
713269257Sdes		else cfg_parser->cfg->delay_close = atoi($2);
714269257Sdes		free($2);
715269257Sdes	}
716269257Sdes	;
717269257Sdesserver_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG
718269257Sdes	{
719269257Sdes		OUTYY(("P(server_unblock_lan_zones:%s)\n", $2));
720269257Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
721269257Sdes			yyerror("expected yes or no.");
722269257Sdes		else cfg_parser->cfg->unblock_lan_zones =
723269257Sdes			(strcmp($2, "yes")==0);
724269257Sdes		free($2);
725269257Sdes	}
726269257Sdes	;
727295691Sdesserver_insecure_lan_zones: VAR_INSECURE_LAN_ZONES STRING_ARG
728295691Sdes	{
729295691Sdes		OUTYY(("P(server_insecure_lan_zones:%s)\n", $2));
730295691Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
731295691Sdes			yyerror("expected yes or no.");
732295691Sdes		else cfg_parser->cfg->insecure_lan_zones =
733295691Sdes			(strcmp($2, "yes")==0);
734295691Sdes		free($2);
735295691Sdes	}
736295691Sdes	;
737238106Sdesserver_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG
738238106Sdes	{
739238106Sdes		OUTYY(("P(server_rrset_cache_size:%s)\n", $2));
740238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->rrset_cache_size))
741238106Sdes			yyerror("memory size expected");
742238106Sdes		free($2);
743238106Sdes	}
744238106Sdes	;
745238106Sdesserver_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG
746238106Sdes	{
747238106Sdes		OUTYY(("P(server_rrset_cache_slabs:%s)\n", $2));
748238106Sdes		if(atoi($2) == 0)
749238106Sdes			yyerror("number expected");
750238106Sdes		else {
751238106Sdes			cfg_parser->cfg->rrset_cache_slabs = atoi($2);
752238106Sdes			if(!is_pow2(cfg_parser->cfg->rrset_cache_slabs))
753238106Sdes				yyerror("must be a power of 2");
754238106Sdes		}
755238106Sdes		free($2);
756238106Sdes	}
757238106Sdes	;
758238106Sdesserver_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG
759238106Sdes	{
760238106Sdes		OUTYY(("P(server_infra_host_ttl:%s)\n", $2));
761238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
762238106Sdes			yyerror("number expected");
763238106Sdes		else cfg_parser->cfg->host_ttl = atoi($2);
764238106Sdes		free($2);
765238106Sdes	}
766238106Sdes	;
767238106Sdesserver_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG
768238106Sdes	{
769238106Sdes		OUTYY(("P(server_infra_lame_ttl:%s)\n", $2));
770238106Sdes		verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option "
771238106Sdes			"removed, use infra-host-ttl)", $2);
772238106Sdes		free($2);
773238106Sdes	}
774238106Sdes	;
775238106Sdesserver_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG
776238106Sdes	{
777238106Sdes		OUTYY(("P(server_infra_cache_numhosts:%s)\n", $2));
778238106Sdes		if(atoi($2) == 0)
779238106Sdes			yyerror("number expected");
780238106Sdes		else cfg_parser->cfg->infra_cache_numhosts = atoi($2);
781238106Sdes		free($2);
782238106Sdes	}
783238106Sdes	;
784238106Sdesserver_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG
785238106Sdes	{
786238106Sdes		OUTYY(("P(server_infra_cache_lame_size:%s)\n", $2));
787238106Sdes		verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s "
788238106Sdes			"(option removed, use infra-cache-numhosts)", $2);
789238106Sdes		free($2);
790238106Sdes	}
791238106Sdes	;
792238106Sdesserver_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG
793238106Sdes	{
794238106Sdes		OUTYY(("P(server_infra_cache_slabs:%s)\n", $2));
795238106Sdes		if(atoi($2) == 0)
796238106Sdes			yyerror("number expected");
797238106Sdes		else {
798238106Sdes			cfg_parser->cfg->infra_cache_slabs = atoi($2);
799238106Sdes			if(!is_pow2(cfg_parser->cfg->infra_cache_slabs))
800238106Sdes				yyerror("must be a power of 2");
801238106Sdes		}
802238106Sdes		free($2);
803238106Sdes	}
804238106Sdes	;
805285206Sdesserver_infra_cache_min_rtt: VAR_INFRA_CACHE_MIN_RTT STRING_ARG
806285206Sdes	{
807285206Sdes		OUTYY(("P(server_infra_cache_min_rtt:%s)\n", $2));
808285206Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
809285206Sdes			yyerror("number expected");
810285206Sdes		else cfg_parser->cfg->infra_cache_min_rtt = atoi($2);
811285206Sdes		free($2);
812285206Sdes	}
813285206Sdes	;
814238106Sdesserver_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG
815238106Sdes	{
816238106Sdes		OUTYY(("P(server_target_fetch_policy:%s)\n", $2));
817238106Sdes		free(cfg_parser->cfg->target_fetch_policy);
818238106Sdes		cfg_parser->cfg->target_fetch_policy = $2;
819238106Sdes	}
820238106Sdes	;
821238106Sdesserver_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG
822238106Sdes	{
823238106Sdes		OUTYY(("P(server_harden_short_bufsize:%s)\n", $2));
824238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
825238106Sdes			yyerror("expected yes or no.");
826238106Sdes		else cfg_parser->cfg->harden_short_bufsize =
827238106Sdes			(strcmp($2, "yes")==0);
828238106Sdes		free($2);
829238106Sdes	}
830238106Sdes	;
831238106Sdesserver_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG
832238106Sdes	{
833238106Sdes		OUTYY(("P(server_harden_large_queries:%s)\n", $2));
834238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
835238106Sdes			yyerror("expected yes or no.");
836238106Sdes		else cfg_parser->cfg->harden_large_queries =
837238106Sdes			(strcmp($2, "yes")==0);
838238106Sdes		free($2);
839238106Sdes	}
840238106Sdes	;
841238106Sdesserver_harden_glue: VAR_HARDEN_GLUE STRING_ARG
842238106Sdes	{
843238106Sdes		OUTYY(("P(server_harden_glue:%s)\n", $2));
844238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
845238106Sdes			yyerror("expected yes or no.");
846238106Sdes		else cfg_parser->cfg->harden_glue =
847238106Sdes			(strcmp($2, "yes")==0);
848238106Sdes		free($2);
849238106Sdes	}
850238106Sdes	;
851238106Sdesserver_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG
852238106Sdes	{
853238106Sdes		OUTYY(("P(server_harden_dnssec_stripped:%s)\n", $2));
854238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
855238106Sdes			yyerror("expected yes or no.");
856238106Sdes		else cfg_parser->cfg->harden_dnssec_stripped =
857238106Sdes			(strcmp($2, "yes")==0);
858238106Sdes		free($2);
859238106Sdes	}
860238106Sdes	;
861238106Sdesserver_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG
862238106Sdes	{
863238106Sdes		OUTYY(("P(server_harden_below_nxdomain:%s)\n", $2));
864238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
865238106Sdes			yyerror("expected yes or no.");
866238106Sdes		else cfg_parser->cfg->harden_below_nxdomain =
867238106Sdes			(strcmp($2, "yes")==0);
868238106Sdes		free($2);
869238106Sdes	}
870238106Sdes	;
871238106Sdesserver_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG
872238106Sdes	{
873238106Sdes		OUTYY(("P(server_harden_referral_path:%s)\n", $2));
874238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
875238106Sdes			yyerror("expected yes or no.");
876238106Sdes		else cfg_parser->cfg->harden_referral_path =
877238106Sdes			(strcmp($2, "yes")==0);
878238106Sdes		free($2);
879238106Sdes	}
880238106Sdes	;
881291767Sdesserver_harden_algo_downgrade: VAR_HARDEN_ALGO_DOWNGRADE STRING_ARG
882291767Sdes	{
883291767Sdes		OUTYY(("P(server_harden_algo_downgrade:%s)\n", $2));
884291767Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
885291767Sdes			yyerror("expected yes or no.");
886291767Sdes		else cfg_parser->cfg->harden_algo_downgrade =
887291767Sdes			(strcmp($2, "yes")==0);
888291767Sdes		free($2);
889291767Sdes	}
890291767Sdes	;
891238106Sdesserver_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG
892238106Sdes	{
893238106Sdes		OUTYY(("P(server_use_caps_for_id:%s)\n", $2));
894238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
895238106Sdes			yyerror("expected yes or no.");
896238106Sdes		else cfg_parser->cfg->use_caps_bits_for_id =
897238106Sdes			(strcmp($2, "yes")==0);
898238106Sdes		free($2);
899238106Sdes	}
900238106Sdes	;
901291767Sdesserver_caps_whitelist: VAR_CAPS_WHITELIST STRING_ARG
902291767Sdes	{
903291767Sdes		OUTYY(("P(server_caps_whitelist:%s)\n", $2));
904291767Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, $2))
905291767Sdes			yyerror("out of memory");
906291767Sdes	}
907291767Sdes	;
908238106Sdesserver_private_address: VAR_PRIVATE_ADDRESS STRING_ARG
909238106Sdes	{
910238106Sdes		OUTYY(("P(server_private_address:%s)\n", $2));
911238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, $2))
912238106Sdes			yyerror("out of memory");
913238106Sdes	}
914238106Sdes	;
915238106Sdesserver_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG
916238106Sdes	{
917238106Sdes		OUTYY(("P(server_private_domain:%s)\n", $2));
918238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, $2))
919238106Sdes			yyerror("out of memory");
920238106Sdes	}
921238106Sdes	;
922238106Sdesserver_prefetch: VAR_PREFETCH STRING_ARG
923238106Sdes	{
924238106Sdes		OUTYY(("P(server_prefetch:%s)\n", $2));
925238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
926238106Sdes			yyerror("expected yes or no.");
927238106Sdes		else cfg_parser->cfg->prefetch = (strcmp($2, "yes")==0);
928238106Sdes		free($2);
929238106Sdes	}
930238106Sdes	;
931238106Sdesserver_prefetch_key: VAR_PREFETCH_KEY STRING_ARG
932238106Sdes	{
933238106Sdes		OUTYY(("P(server_prefetch_key:%s)\n", $2));
934238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
935238106Sdes			yyerror("expected yes or no.");
936238106Sdes		else cfg_parser->cfg->prefetch_key = (strcmp($2, "yes")==0);
937238106Sdes		free($2);
938238106Sdes	}
939238106Sdes	;
940238106Sdesserver_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG
941238106Sdes	{
942238106Sdes		OUTYY(("P(server_unwanted_reply_threshold:%s)\n", $2));
943238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
944238106Sdes			yyerror("number expected");
945238106Sdes		else cfg_parser->cfg->unwanted_threshold = atoi($2);
946238106Sdes		free($2);
947238106Sdes	}
948238106Sdes	;
949238106Sdesserver_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG
950238106Sdes	{
951238106Sdes		OUTYY(("P(server_do_not_query_address:%s)\n", $2));
952238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, $2))
953238106Sdes			yyerror("out of memory");
954238106Sdes	}
955238106Sdes	;
956238106Sdesserver_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG
957238106Sdes	{
958238106Sdes		OUTYY(("P(server_do_not_query_localhost:%s)\n", $2));
959238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
960238106Sdes			yyerror("expected yes or no.");
961238106Sdes		else cfg_parser->cfg->donotquery_localhost =
962238106Sdes			(strcmp($2, "yes")==0);
963238106Sdes		free($2);
964238106Sdes	}
965238106Sdes	;
966238106Sdesserver_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG
967238106Sdes	{
968238106Sdes		OUTYY(("P(server_access_control:%s %s)\n", $2, $3));
969238106Sdes		if(strcmp($3, "deny")!=0 && strcmp($3, "refuse")!=0 &&
970269257Sdes			strcmp($3, "deny_non_local")!=0 &&
971269257Sdes			strcmp($3, "refuse_non_local")!=0 &&
972238106Sdes			strcmp($3, "allow")!=0 &&
973238106Sdes			strcmp($3, "allow_snoop")!=0) {
974269257Sdes			yyerror("expected deny, refuse, deny_non_local, "
975269257Sdes				"refuse_non_local, allow or allow_snoop "
976238106Sdes				"in access control action");
977238106Sdes		} else {
978238106Sdes			if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3))
979238106Sdes				fatal_exit("out of memory adding acl");
980238106Sdes		}
981238106Sdes	}
982238106Sdes	;
983238106Sdesserver_module_conf: VAR_MODULE_CONF STRING_ARG
984238106Sdes	{
985238106Sdes		OUTYY(("P(server_module_conf:%s)\n", $2));
986238106Sdes		free(cfg_parser->cfg->module_conf);
987238106Sdes		cfg_parser->cfg->module_conf = $2;
988238106Sdes	}
989238106Sdes	;
990238106Sdesserver_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG
991238106Sdes	{
992238106Sdes		OUTYY(("P(server_val_override_date:%s)\n", $2));
993238106Sdes		if(strlen($2) == 0 || strcmp($2, "0") == 0) {
994238106Sdes			cfg_parser->cfg->val_date_override = 0;
995238106Sdes		} else if(strlen($2) == 14) {
996238106Sdes			cfg_parser->cfg->val_date_override =
997238106Sdes				cfg_convert_timeval($2);
998238106Sdes			if(!cfg_parser->cfg->val_date_override)
999238106Sdes				yyerror("bad date/time specification");
1000238106Sdes		} else {
1001238106Sdes			if(atoi($2) == 0)
1002238106Sdes				yyerror("number expected");
1003238106Sdes			cfg_parser->cfg->val_date_override = atoi($2);
1004238106Sdes		}
1005238106Sdes		free($2);
1006238106Sdes	}
1007238106Sdes	;
1008238106Sdesserver_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG
1009238106Sdes	{
1010238106Sdes		OUTYY(("P(server_val_sig_skew_min:%s)\n", $2));
1011238106Sdes		if(strlen($2) == 0 || strcmp($2, "0") == 0) {
1012238106Sdes			cfg_parser->cfg->val_sig_skew_min = 0;
1013238106Sdes		} else {
1014238106Sdes			cfg_parser->cfg->val_sig_skew_min = atoi($2);
1015238106Sdes			if(!cfg_parser->cfg->val_sig_skew_min)
1016238106Sdes				yyerror("number expected");
1017238106Sdes		}
1018238106Sdes		free($2);
1019238106Sdes	}
1020238106Sdes	;
1021238106Sdesserver_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG
1022238106Sdes	{
1023238106Sdes		OUTYY(("P(server_val_sig_skew_max:%s)\n", $2));
1024238106Sdes		if(strlen($2) == 0 || strcmp($2, "0") == 0) {
1025238106Sdes			cfg_parser->cfg->val_sig_skew_max = 0;
1026238106Sdes		} else {
1027238106Sdes			cfg_parser->cfg->val_sig_skew_max = atoi($2);
1028238106Sdes			if(!cfg_parser->cfg->val_sig_skew_max)
1029238106Sdes				yyerror("number expected");
1030238106Sdes		}
1031238106Sdes		free($2);
1032238106Sdes	}
1033238106Sdes	;
1034238106Sdesserver_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG
1035238106Sdes	{
1036238106Sdes		OUTYY(("P(server_cache_max_ttl:%s)\n", $2));
1037238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1038238106Sdes			yyerror("number expected");
1039238106Sdes		else cfg_parser->cfg->max_ttl = atoi($2);
1040238106Sdes		free($2);
1041238106Sdes	}
1042238106Sdes	;
1043291767Sdesserver_cache_max_negative_ttl: VAR_CACHE_MAX_NEGATIVE_TTL STRING_ARG
1044291767Sdes	{
1045291767Sdes		OUTYY(("P(server_cache_max_negative_ttl:%s)\n", $2));
1046291767Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1047291767Sdes			yyerror("number expected");
1048291767Sdes		else cfg_parser->cfg->max_negative_ttl = atoi($2);
1049291767Sdes		free($2);
1050291767Sdes	}
1051291767Sdes	;
1052238106Sdesserver_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG
1053238106Sdes	{
1054238106Sdes		OUTYY(("P(server_cache_min_ttl:%s)\n", $2));
1055238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1056238106Sdes			yyerror("number expected");
1057238106Sdes		else cfg_parser->cfg->min_ttl = atoi($2);
1058238106Sdes		free($2);
1059238106Sdes	}
1060238106Sdes	;
1061238106Sdesserver_bogus_ttl: VAR_BOGUS_TTL STRING_ARG
1062238106Sdes	{
1063238106Sdes		OUTYY(("P(server_bogus_ttl:%s)\n", $2));
1064238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1065238106Sdes			yyerror("number expected");
1066238106Sdes		else cfg_parser->cfg->bogus_ttl = atoi($2);
1067238106Sdes		free($2);
1068238106Sdes	}
1069238106Sdes	;
1070238106Sdesserver_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG
1071238106Sdes	{
1072238106Sdes		OUTYY(("P(server_val_clean_additional:%s)\n", $2));
1073238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1074238106Sdes			yyerror("expected yes or no.");
1075238106Sdes		else cfg_parser->cfg->val_clean_additional =
1076238106Sdes			(strcmp($2, "yes")==0);
1077238106Sdes		free($2);
1078238106Sdes	}
1079238106Sdes	;
1080238106Sdesserver_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG
1081238106Sdes	{
1082238106Sdes		OUTYY(("P(server_val_permissive_mode:%s)\n", $2));
1083238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1084238106Sdes			yyerror("expected yes or no.");
1085238106Sdes		else cfg_parser->cfg->val_permissive_mode =
1086238106Sdes			(strcmp($2, "yes")==0);
1087238106Sdes		free($2);
1088238106Sdes	}
1089238106Sdes	;
1090238106Sdesserver_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG
1091238106Sdes	{
1092238106Sdes		OUTYY(("P(server_ignore_cd_flag:%s)\n", $2));
1093238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1094238106Sdes			yyerror("expected yes or no.");
1095238106Sdes		else cfg_parser->cfg->ignore_cd = (strcmp($2, "yes")==0);
1096238106Sdes		free($2);
1097238106Sdes	}
1098238106Sdes	;
1099238106Sdesserver_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG
1100238106Sdes	{
1101238106Sdes		OUTYY(("P(server_val_log_level:%s)\n", $2));
1102238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1103238106Sdes			yyerror("number expected");
1104238106Sdes		else cfg_parser->cfg->val_log_level = atoi($2);
1105238106Sdes		free($2);
1106238106Sdes	}
1107238106Sdes	;
1108238106Sdesserver_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG
1109238106Sdes	{
1110238106Sdes		OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", $2));
1111238106Sdes		free(cfg_parser->cfg->val_nsec3_key_iterations);
1112238106Sdes		cfg_parser->cfg->val_nsec3_key_iterations = $2;
1113238106Sdes	}
1114238106Sdes	;
1115238106Sdesserver_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG
1116238106Sdes	{
1117238106Sdes		OUTYY(("P(server_add_holddown:%s)\n", $2));
1118238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1119238106Sdes			yyerror("number expected");
1120238106Sdes		else cfg_parser->cfg->add_holddown = atoi($2);
1121238106Sdes		free($2);
1122238106Sdes	}
1123238106Sdes	;
1124238106Sdesserver_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG
1125238106Sdes	{
1126238106Sdes		OUTYY(("P(server_del_holddown:%s)\n", $2));
1127238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1128238106Sdes			yyerror("number expected");
1129238106Sdes		else cfg_parser->cfg->del_holddown = atoi($2);
1130238106Sdes		free($2);
1131238106Sdes	}
1132238106Sdes	;
1133238106Sdesserver_keep_missing: VAR_KEEP_MISSING STRING_ARG
1134238106Sdes	{
1135238106Sdes		OUTYY(("P(server_keep_missing:%s)\n", $2));
1136238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1137238106Sdes			yyerror("number expected");
1138238106Sdes		else cfg_parser->cfg->keep_missing = atoi($2);
1139238106Sdes		free($2);
1140238106Sdes	}
1141238106Sdes	;
1142291767Sdesserver_permit_small_holddown: VAR_PERMIT_SMALL_HOLDDOWN STRING_ARG
1143291767Sdes	{
1144291767Sdes		OUTYY(("P(server_permit_small_holddown:%s)\n", $2));
1145291767Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1146291767Sdes			yyerror("expected yes or no.");
1147291767Sdes		else cfg_parser->cfg->permit_small_holddown =
1148291767Sdes			(strcmp($2, "yes")==0);
1149291767Sdes		free($2);
1150291767Sdes	}
1151238106Sdesserver_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG
1152238106Sdes	{
1153238106Sdes		OUTYY(("P(server_key_cache_size:%s)\n", $2));
1154238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->key_cache_size))
1155238106Sdes			yyerror("memory size expected");
1156238106Sdes		free($2);
1157238106Sdes	}
1158238106Sdes	;
1159238106Sdesserver_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG
1160238106Sdes	{
1161238106Sdes		OUTYY(("P(server_key_cache_slabs:%s)\n", $2));
1162238106Sdes		if(atoi($2) == 0)
1163238106Sdes			yyerror("number expected");
1164238106Sdes		else {
1165238106Sdes			cfg_parser->cfg->key_cache_slabs = atoi($2);
1166238106Sdes			if(!is_pow2(cfg_parser->cfg->key_cache_slabs))
1167238106Sdes				yyerror("must be a power of 2");
1168238106Sdes		}
1169238106Sdes		free($2);
1170238106Sdes	}
1171238106Sdes	;
1172238106Sdesserver_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG
1173238106Sdes	{
1174238106Sdes		OUTYY(("P(server_neg_cache_size:%s)\n", $2));
1175238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->neg_cache_size))
1176238106Sdes			yyerror("memory size expected");
1177238106Sdes		free($2);
1178238106Sdes	}
1179238106Sdes	;
1180238106Sdesserver_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
1181238106Sdes	{
1182238106Sdes		OUTYY(("P(server_local_zone:%s %s)\n", $2, $3));
1183238106Sdes		if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 &&
1184238106Sdes		   strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 &&
1185238106Sdes		   strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0
1186285206Sdes		   && strcmp($3, "typetransparent")!=0 &&
1187291767Sdes		   strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0)
1188238106Sdes			yyerror("local-zone type: expected static, deny, "
1189238106Sdes				"refuse, redirect, transparent, "
1190291767Sdes				"typetransparent, inform, inform_deny "
1191291767Sdes				"or nodefault");
1192238106Sdes		else if(strcmp($3, "nodefault")==0) {
1193238106Sdes			if(!cfg_strlist_insert(&cfg_parser->cfg->
1194238106Sdes				local_zones_nodefault, $2))
1195238106Sdes				fatal_exit("out of memory adding local-zone");
1196238106Sdes			free($3);
1197238106Sdes		} else {
1198238106Sdes			if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones,
1199238106Sdes				$2, $3))
1200238106Sdes				fatal_exit("out of memory adding local-zone");
1201238106Sdes		}
1202238106Sdes	}
1203238106Sdes	;
1204238106Sdesserver_local_data: VAR_LOCAL_DATA STRING_ARG
1205238106Sdes	{
1206238106Sdes		OUTYY(("P(server_local_data:%s)\n", $2));
1207238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, $2))
1208238106Sdes			fatal_exit("out of memory adding local-data");
1209238106Sdes	}
1210238106Sdes	;
1211238106Sdesserver_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG
1212238106Sdes	{
1213238106Sdes		char* ptr;
1214238106Sdes		OUTYY(("P(server_local_data_ptr:%s)\n", $2));
1215238106Sdes		ptr = cfg_ptr_reverse($2);
1216238106Sdes		free($2);
1217238106Sdes		if(ptr) {
1218238106Sdes			if(!cfg_strlist_insert(&cfg_parser->cfg->
1219238106Sdes				local_data, ptr))
1220238106Sdes				fatal_exit("out of memory adding local-data");
1221238106Sdes		} else {
1222238106Sdes			yyerror("local-data-ptr could not be reversed");
1223238106Sdes		}
1224238106Sdes	}
1225238106Sdes	;
1226238106Sdesserver_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG
1227238106Sdes	{
1228238106Sdes		OUTYY(("P(server_minimal_responses:%s)\n", $2));
1229238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1230238106Sdes			yyerror("expected yes or no.");
1231238106Sdes		else cfg_parser->cfg->minimal_responses =
1232238106Sdes			(strcmp($2, "yes")==0);
1233238106Sdes		free($2);
1234238106Sdes	}
1235238106Sdes	;
1236238106Sdesserver_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG
1237238106Sdes	{
1238238106Sdes		OUTYY(("P(server_rrset_roundrobin:%s)\n", $2));
1239238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1240238106Sdes			yyerror("expected yes or no.");
1241238106Sdes		else cfg_parser->cfg->rrset_roundrobin =
1242238106Sdes			(strcmp($2, "yes")==0);
1243238106Sdes		free($2);
1244238106Sdes	}
1245238106Sdes	;
1246269257Sdesserver_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG
1247269257Sdes	{
1248269257Sdes		OUTYY(("P(server_max_udp_size:%s)\n", $2));
1249269257Sdes		cfg_parser->cfg->max_udp_size = atoi($2);
1250269257Sdes		free($2);
1251269257Sdes	}
1252269257Sdes	;
1253285206Sdesserver_dns64_prefix: VAR_DNS64_PREFIX STRING_ARG
1254285206Sdes	{
1255285206Sdes		OUTYY(("P(dns64_prefix:%s)\n", $2));
1256285206Sdes		free(cfg_parser->cfg->dns64_prefix);
1257285206Sdes		cfg_parser->cfg->dns64_prefix = $2;
1258285206Sdes	}
1259285206Sdes	;
1260285206Sdesserver_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG
1261285206Sdes	{
1262285206Sdes		OUTYY(("P(server_dns64_synthall:%s)\n", $2));
1263285206Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1264285206Sdes			yyerror("expected yes or no.");
1265285206Sdes		else cfg_parser->cfg->dns64_synthall = (strcmp($2, "yes")==0);
1266285206Sdes		free($2);
1267285206Sdes	}
1268285206Sdes	;
1269291767Sdesserver_ratelimit: VAR_RATELIMIT STRING_ARG
1270291767Sdes	{
1271291767Sdes		OUTYY(("P(server_ratelimit:%s)\n", $2));
1272291767Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1273291767Sdes			yyerror("number expected");
1274291767Sdes		else cfg_parser->cfg->ratelimit = atoi($2);
1275291767Sdes		free($2);
1276291767Sdes	}
1277291767Sdes	;
1278291767Sdesserver_ratelimit_size: VAR_RATELIMIT_SIZE STRING_ARG
1279291767Sdes	{
1280291767Sdes		OUTYY(("P(server_ratelimit_size:%s)\n", $2));
1281291767Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->ratelimit_size))
1282291767Sdes			yyerror("memory size expected");
1283291767Sdes		free($2);
1284291767Sdes	}
1285291767Sdes	;
1286291767Sdesserver_ratelimit_slabs: VAR_RATELIMIT_SLABS STRING_ARG
1287291767Sdes	{
1288291767Sdes		OUTYY(("P(server_ratelimit_slabs:%s)\n", $2));
1289291767Sdes		if(atoi($2) == 0)
1290291767Sdes			yyerror("number expected");
1291291767Sdes		else {
1292291767Sdes			cfg_parser->cfg->ratelimit_slabs = atoi($2);
1293291767Sdes			if(!is_pow2(cfg_parser->cfg->ratelimit_slabs))
1294291767Sdes				yyerror("must be a power of 2");
1295291767Sdes		}
1296291767Sdes		free($2);
1297291767Sdes	}
1298291767Sdes	;
1299291767Sdesserver_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG
1300291767Sdes	{
1301291767Sdes		OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", $2, $3));
1302291767Sdes		if(atoi($3) == 0 && strcmp($3, "0") != 0) {
1303291767Sdes			yyerror("number expected");
1304291767Sdes		} else {
1305291767Sdes			if(!cfg_str2list_insert(&cfg_parser->cfg->
1306291767Sdes				ratelimit_for_domain, $2, $3))
1307291767Sdes				fatal_exit("out of memory adding "
1308291767Sdes					"ratelimit-for-domain");
1309291767Sdes		}
1310291767Sdes	}
1311291767Sdes	;
1312291767Sdesserver_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG
1313291767Sdes	{
1314291767Sdes		OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", $2, $3));
1315291767Sdes		if(atoi($3) == 0 && strcmp($3, "0") != 0) {
1316291767Sdes			yyerror("number expected");
1317291767Sdes		} else {
1318291767Sdes			if(!cfg_str2list_insert(&cfg_parser->cfg->
1319291767Sdes				ratelimit_below_domain, $2, $3))
1320291767Sdes				fatal_exit("out of memory adding "
1321291767Sdes					"ratelimit-below-domain");
1322291767Sdes		}
1323291767Sdes	}
1324291767Sdes	;
1325291767Sdesserver_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG
1326291767Sdes	{
1327291767Sdes		OUTYY(("P(server_ratelimit_factor:%s)\n", $2));
1328291767Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1329291767Sdes			yyerror("number expected");
1330291767Sdes		else cfg_parser->cfg->ratelimit_factor = atoi($2);
1331291767Sdes		free($2);
1332291767Sdes	}
1333291767Sdes	;
1334294190Sdesserver_qname_minimisation: VAR_QNAME_MINIMISATION STRING_ARG
1335294190Sdes	{
1336294190Sdes		OUTYY(("P(server_qname_minimisation:%s)\n", $2));
1337294190Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1338294190Sdes			yyerror("expected yes or no.");
1339294190Sdes		else cfg_parser->cfg->qname_minimisation =
1340294190Sdes			(strcmp($2, "yes")==0);
1341294190Sdes		free($2);
1342294190Sdes	}
1343294190Sdes	;
1344238106Sdesstub_name: VAR_NAME STRING_ARG
1345238106Sdes	{
1346238106Sdes		OUTYY(("P(name:%s)\n", $2));
1347238106Sdes		if(cfg_parser->cfg->stubs->name)
1348238106Sdes			yyerror("stub name override, there must be one name "
1349238106Sdes				"for one stub-zone");
1350238106Sdes		free(cfg_parser->cfg->stubs->name);
1351238106Sdes		cfg_parser->cfg->stubs->name = $2;
1352238106Sdes	}
1353238106Sdes	;
1354238106Sdesstub_host: VAR_STUB_HOST STRING_ARG
1355238106Sdes	{
1356238106Sdes		OUTYY(("P(stub-host:%s)\n", $2));
1357238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, $2))
1358238106Sdes			yyerror("out of memory");
1359238106Sdes	}
1360238106Sdes	;
1361238106Sdesstub_addr: VAR_STUB_ADDR STRING_ARG
1362238106Sdes	{
1363238106Sdes		OUTYY(("P(stub-addr:%s)\n", $2));
1364238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, $2))
1365238106Sdes			yyerror("out of memory");
1366238106Sdes	}
1367238106Sdes	;
1368238106Sdesstub_first: VAR_STUB_FIRST STRING_ARG
1369238106Sdes	{
1370238106Sdes		OUTYY(("P(stub-first:%s)\n", $2));
1371238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1372238106Sdes			yyerror("expected yes or no.");
1373238106Sdes		else cfg_parser->cfg->stubs->isfirst=(strcmp($2, "yes")==0);
1374238106Sdes		free($2);
1375238106Sdes	}
1376238106Sdes	;
1377238106Sdesstub_prime: VAR_STUB_PRIME STRING_ARG
1378238106Sdes	{
1379238106Sdes		OUTYY(("P(stub-prime:%s)\n", $2));
1380238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1381238106Sdes			yyerror("expected yes or no.");
1382238106Sdes		else cfg_parser->cfg->stubs->isprime =
1383238106Sdes			(strcmp($2, "yes")==0);
1384238106Sdes		free($2);
1385238106Sdes	}
1386238106Sdes	;
1387238106Sdesforward_name: VAR_NAME STRING_ARG
1388238106Sdes	{
1389238106Sdes		OUTYY(("P(name:%s)\n", $2));
1390238106Sdes		if(cfg_parser->cfg->forwards->name)
1391238106Sdes			yyerror("forward name override, there must be one "
1392238106Sdes				"name for one forward-zone");
1393238106Sdes		free(cfg_parser->cfg->forwards->name);
1394238106Sdes		cfg_parser->cfg->forwards->name = $2;
1395238106Sdes	}
1396238106Sdes	;
1397238106Sdesforward_host: VAR_FORWARD_HOST STRING_ARG
1398238106Sdes	{
1399238106Sdes		OUTYY(("P(forward-host:%s)\n", $2));
1400238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, $2))
1401238106Sdes			yyerror("out of memory");
1402238106Sdes	}
1403238106Sdes	;
1404238106Sdesforward_addr: VAR_FORWARD_ADDR STRING_ARG
1405238106Sdes	{
1406238106Sdes		OUTYY(("P(forward-addr:%s)\n", $2));
1407238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, $2))
1408238106Sdes			yyerror("out of memory");
1409238106Sdes	}
1410238106Sdes	;
1411238106Sdesforward_first: VAR_FORWARD_FIRST STRING_ARG
1412238106Sdes	{
1413238106Sdes		OUTYY(("P(forward-first:%s)\n", $2));
1414238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1415238106Sdes			yyerror("expected yes or no.");
1416238106Sdes		else cfg_parser->cfg->forwards->isfirst=(strcmp($2, "yes")==0);
1417238106Sdes		free($2);
1418238106Sdes	}
1419238106Sdes	;
1420238106Sdesrcstart: VAR_REMOTE_CONTROL
1421238106Sdes	{
1422238106Sdes		OUTYY(("\nP(remote-control:)\n"));
1423238106Sdes	}
1424238106Sdes	;
1425238106Sdescontents_rc: contents_rc content_rc
1426238106Sdes	| ;
1427238106Sdescontent_rc: rc_control_enable | rc_control_interface | rc_control_port |
1428238106Sdes	rc_server_key_file | rc_server_cert_file | rc_control_key_file |
1429285206Sdes	rc_control_cert_file | rc_control_use_cert
1430238106Sdes	;
1431238106Sdesrc_control_enable: VAR_CONTROL_ENABLE STRING_ARG
1432238106Sdes	{
1433238106Sdes		OUTYY(("P(control_enable:%s)\n", $2));
1434238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1435238106Sdes			yyerror("expected yes or no.");
1436238106Sdes		else cfg_parser->cfg->remote_control_enable =
1437238106Sdes			(strcmp($2, "yes")==0);
1438238106Sdes		free($2);
1439238106Sdes	}
1440238106Sdes	;
1441238106Sdesrc_control_port: VAR_CONTROL_PORT STRING_ARG
1442238106Sdes	{
1443238106Sdes		OUTYY(("P(control_port:%s)\n", $2));
1444238106Sdes		if(atoi($2) == 0)
1445238106Sdes			yyerror("control port number expected");
1446238106Sdes		else cfg_parser->cfg->control_port = atoi($2);
1447238106Sdes		free($2);
1448238106Sdes	}
1449238106Sdes	;
1450238106Sdesrc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG
1451238106Sdes	{
1452238106Sdes		OUTYY(("P(control_interface:%s)\n", $2));
1453238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->control_ifs, $2))
1454238106Sdes			yyerror("out of memory");
1455238106Sdes	}
1456238106Sdes	;
1457285206Sdesrc_control_use_cert: VAR_CONTROL_USE_CERT STRING_ARG
1458285206Sdes	{
1459285206Sdes		OUTYY(("P(control_use_cert:%s)\n", $2));
1460285206Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1461285206Sdes			yyerror("expected yes or no.");
1462285206Sdes		else cfg_parser->cfg->remote_control_use_cert =
1463285206Sdes			(strcmp($2, "yes")==0);
1464285206Sdes		free($2);
1465285206Sdes	}
1466285206Sdes	;
1467238106Sdesrc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG
1468238106Sdes	{
1469238106Sdes		OUTYY(("P(rc_server_key_file:%s)\n", $2));
1470238106Sdes		free(cfg_parser->cfg->server_key_file);
1471238106Sdes		cfg_parser->cfg->server_key_file = $2;
1472238106Sdes	}
1473238106Sdes	;
1474238106Sdesrc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG
1475238106Sdes	{
1476238106Sdes		OUTYY(("P(rc_server_cert_file:%s)\n", $2));
1477238106Sdes		free(cfg_parser->cfg->server_cert_file);
1478238106Sdes		cfg_parser->cfg->server_cert_file = $2;
1479238106Sdes	}
1480238106Sdes	;
1481238106Sdesrc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG
1482238106Sdes	{
1483238106Sdes		OUTYY(("P(rc_control_key_file:%s)\n", $2));
1484238106Sdes		free(cfg_parser->cfg->control_key_file);
1485238106Sdes		cfg_parser->cfg->control_key_file = $2;
1486238106Sdes	}
1487238106Sdes	;
1488238106Sdesrc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG
1489238106Sdes	{
1490238106Sdes		OUTYY(("P(rc_control_cert_file:%s)\n", $2));
1491238106Sdes		free(cfg_parser->cfg->control_cert_file);
1492238106Sdes		cfg_parser->cfg->control_cert_file = $2;
1493238106Sdes	}
1494238106Sdes	;
1495285206Sdesdtstart: VAR_DNSTAP
1496285206Sdes	{
1497285206Sdes		OUTYY(("\nP(dnstap:)\n"));
1498285206Sdes	}
1499285206Sdes	;
1500285206Sdescontents_dt: contents_dt content_dt
1501285206Sdes	| ;
1502285206Sdescontent_dt: dt_dnstap_enable | dt_dnstap_socket_path |
1503285206Sdes	dt_dnstap_send_identity | dt_dnstap_send_version |
1504285206Sdes	dt_dnstap_identity | dt_dnstap_version |
1505285206Sdes	dt_dnstap_log_resolver_query_messages |
1506285206Sdes	dt_dnstap_log_resolver_response_messages |
1507285206Sdes	dt_dnstap_log_client_query_messages |
1508285206Sdes	dt_dnstap_log_client_response_messages |
1509285206Sdes	dt_dnstap_log_forwarder_query_messages |
1510285206Sdes	dt_dnstap_log_forwarder_response_messages
1511285206Sdes	;
1512285206Sdesdt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG
1513285206Sdes	{
1514285206Sdes		OUTYY(("P(dt_dnstap_enable:%s)\n", $2));
1515285206Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1516285206Sdes			yyerror("expected yes or no.");
1517285206Sdes		else cfg_parser->cfg->dnstap = (strcmp($2, "yes")==0);
1518285206Sdes	}
1519285206Sdes	;
1520285206Sdesdt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG
1521285206Sdes	{
1522285206Sdes		OUTYY(("P(dt_dnstap_socket_path:%s)\n", $2));
1523285206Sdes		free(cfg_parser->cfg->dnstap_socket_path);
1524285206Sdes		cfg_parser->cfg->dnstap_socket_path = $2;
1525285206Sdes	}
1526285206Sdes	;
1527285206Sdesdt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG
1528285206Sdes	{
1529285206Sdes		OUTYY(("P(dt_dnstap_send_identity:%s)\n", $2));
1530285206Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1531285206Sdes			yyerror("expected yes or no.");
1532285206Sdes		else cfg_parser->cfg->dnstap_send_identity = (strcmp($2, "yes")==0);
1533285206Sdes	}
1534285206Sdes	;
1535285206Sdesdt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG
1536285206Sdes	{
1537285206Sdes		OUTYY(("P(dt_dnstap_send_version:%s)\n", $2));
1538285206Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1539285206Sdes			yyerror("expected yes or no.");
1540285206Sdes		else cfg_parser->cfg->dnstap_send_version = (strcmp($2, "yes")==0);
1541285206Sdes	}
1542285206Sdes	;
1543285206Sdesdt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG
1544285206Sdes	{
1545285206Sdes		OUTYY(("P(dt_dnstap_identity:%s)\n", $2));
1546285206Sdes		free(cfg_parser->cfg->dnstap_identity);
1547285206Sdes		cfg_parser->cfg->dnstap_identity = $2;
1548285206Sdes	}
1549285206Sdes	;
1550285206Sdesdt_dnstap_version: VAR_DNSTAP_VERSION STRING_ARG
1551285206Sdes	{
1552285206Sdes		OUTYY(("P(dt_dnstap_version:%s)\n", $2));
1553285206Sdes		free(cfg_parser->cfg->dnstap_version);
1554285206Sdes		cfg_parser->cfg->dnstap_version = $2;
1555285206Sdes	}
1556285206Sdes	;
1557285206Sdesdt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES STRING_ARG
1558285206Sdes	{
1559285206Sdes		OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", $2));
1560285206Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1561285206Sdes			yyerror("expected yes or no.");
1562285206Sdes		else cfg_parser->cfg->dnstap_log_resolver_query_messages =
1563285206Sdes			(strcmp($2, "yes")==0);
1564285206Sdes	}
1565285206Sdes	;
1566285206Sdesdt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG
1567285206Sdes	{
1568285206Sdes		OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", $2));
1569285206Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1570285206Sdes			yyerror("expected yes or no.");
1571285206Sdes		else cfg_parser->cfg->dnstap_log_resolver_response_messages =
1572285206Sdes			(strcmp($2, "yes")==0);
1573285206Sdes	}
1574285206Sdes	;
1575285206Sdesdt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG
1576285206Sdes	{
1577285206Sdes		OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", $2));
1578285206Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1579285206Sdes			yyerror("expected yes or no.");
1580285206Sdes		else cfg_parser->cfg->dnstap_log_client_query_messages =
1581285206Sdes			(strcmp($2, "yes")==0);
1582285206Sdes	}
1583285206Sdes	;
1584285206Sdesdt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG
1585285206Sdes	{
1586285206Sdes		OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", $2));
1587285206Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1588285206Sdes			yyerror("expected yes or no.");
1589285206Sdes		else cfg_parser->cfg->dnstap_log_client_response_messages =
1590285206Sdes			(strcmp($2, "yes")==0);
1591285206Sdes	}
1592285206Sdes	;
1593285206Sdesdt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG
1594285206Sdes	{
1595285206Sdes		OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", $2));
1596285206Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1597285206Sdes			yyerror("expected yes or no.");
1598285206Sdes		else cfg_parser->cfg->dnstap_log_forwarder_query_messages =
1599285206Sdes			(strcmp($2, "yes")==0);
1600285206Sdes	}
1601285206Sdes	;
1602285206Sdesdt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG
1603285206Sdes	{
1604285206Sdes		OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", $2));
1605285206Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1606285206Sdes			yyerror("expected yes or no.");
1607285206Sdes		else cfg_parser->cfg->dnstap_log_forwarder_response_messages =
1608285206Sdes			(strcmp($2, "yes")==0);
1609285206Sdes	}
1610285206Sdes	;
1611238106Sdespythonstart: VAR_PYTHON
1612238106Sdes	{
1613238106Sdes		OUTYY(("\nP(python:)\n"));
1614238106Sdes	}
1615238106Sdes	;
1616238106Sdescontents_py: contents_py content_py
1617238106Sdes	| ;
1618238106Sdescontent_py: py_script
1619238106Sdes	;
1620238106Sdespy_script: VAR_PYTHON_SCRIPT STRING_ARG
1621238106Sdes	{
1622238106Sdes		OUTYY(("P(python-script:%s)\n", $2));
1623238106Sdes		free(cfg_parser->cfg->python_script);
1624238106Sdes		cfg_parser->cfg->python_script = $2;
1625238106Sdes	}
1626238106Sdes%%
1627238106Sdes
1628238106Sdes/* parse helper routines could be here */
1629