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
26266114Sdes * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27266114Sdes * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28266114Sdes * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29266114Sdes * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30266114Sdes * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
31266114Sdes * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32266114Sdes * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33266114Sdes * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34266114Sdes * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35266114Sdes * 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
47276605Sdes#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
54356345Scystatic void validate_respip_action(const char* action);
55356345Scy
56238106Sdes/* these need to be global, otherwise they cannot be used inside yacc */
57238106Sdesextern struct config_parser_state* cfg_parser;
58238106Sdes
59238106Sdes#if 0
60238106Sdes#define OUTYY(s)  printf s /* used ONLY when debugging */
61238106Sdes#else
62238106Sdes#define OUTYY(s)
63238106Sdes#endif
64238106Sdes
65238106Sdes%}
66238106Sdes%union {
67238106Sdes	char*	str;
68238106Sdes};
69238106Sdes
70238106Sdes%token SPACE LETTER NEWLINE COMMENT COLON ANY ZONESTR
71238106Sdes%token <str> STRING_ARG
72366095Scy%token VAR_FORCE_TOPLEVEL
73238106Sdes%token VAR_SERVER VAR_VERBOSITY VAR_NUM_THREADS VAR_PORT
74366095Scy%token VAR_OUTGOING_RANGE VAR_INTERFACE VAR_PREFER_IP4
75307729Sdes%token VAR_DO_IP4 VAR_DO_IP6 VAR_PREFER_IP6 VAR_DO_UDP VAR_DO_TCP
76356345Scy%token VAR_TCP_MSS VAR_OUTGOING_TCP_MSS VAR_TCP_IDLE_TIMEOUT
77356345Scy%token VAR_EDNS_TCP_KEEPALIVE VAR_EDNS_TCP_KEEPALIVE_TIMEOUT
78238106Sdes%token VAR_CHROOT VAR_USERNAME VAR_DIRECTORY VAR_LOGFILE VAR_PIDFILE
79238106Sdes%token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS VAR_NUM_QUERIES_PER_THREAD
80238106Sdes%token VAR_RRSET_CACHE_SIZE VAR_RRSET_CACHE_SLABS VAR_OUTGOING_NUM_TCP
81238106Sdes%token VAR_INFRA_HOST_TTL VAR_INFRA_LAME_TTL VAR_INFRA_CACHE_SLABS
82238106Sdes%token VAR_INFRA_CACHE_NUMHOSTS VAR_INFRA_CACHE_LAME_SIZE VAR_NAME
83238106Sdes%token VAR_STUB_ZONE VAR_STUB_HOST VAR_STUB_ADDR VAR_TARGET_FETCH_POLICY
84238106Sdes%token VAR_HARDEN_SHORT_BUFSIZE VAR_HARDEN_LARGE_QUERIES
85238106Sdes%token VAR_FORWARD_ZONE VAR_FORWARD_HOST VAR_FORWARD_ADDR
86238106Sdes%token VAR_DO_NOT_QUERY_ADDRESS VAR_HIDE_IDENTITY VAR_HIDE_VERSION
87238106Sdes%token VAR_IDENTITY VAR_VERSION VAR_HARDEN_GLUE VAR_MODULE_CONF
88238106Sdes%token VAR_TRUST_ANCHOR_FILE VAR_TRUST_ANCHOR VAR_VAL_OVERRIDE_DATE
89238106Sdes%token VAR_BOGUS_TTL VAR_VAL_CLEAN_ADDITIONAL VAR_VAL_PERMISSIVE_MODE
90238106Sdes%token VAR_INCOMING_NUM_TCP VAR_MSG_BUFFER_SIZE VAR_KEY_CACHE_SIZE
91238106Sdes%token VAR_KEY_CACHE_SLABS VAR_TRUSTED_KEYS_FILE
92238106Sdes%token VAR_VAL_NSEC3_KEYSIZE_ITERATIONS VAR_USE_SYSLOG
93238106Sdes%token VAR_OUTGOING_INTERFACE VAR_ROOT_HINTS VAR_DO_NOT_QUERY_LOCALHOST
94238106Sdes%token VAR_CACHE_MAX_TTL VAR_HARDEN_DNSSEC_STRIPPED VAR_ACCESS_CONTROL
95238106Sdes%token VAR_LOCAL_ZONE VAR_LOCAL_DATA VAR_INTERFACE_AUTOMATIC
96238106Sdes%token VAR_STATISTICS_INTERVAL VAR_DO_DAEMONIZE VAR_USE_CAPS_FOR_ID
97238106Sdes%token VAR_STATISTICS_CUMULATIVE VAR_OUTGOING_PORT_PERMIT
98238106Sdes%token VAR_OUTGOING_PORT_AVOID VAR_DLV_ANCHOR_FILE VAR_DLV_ANCHOR
99238106Sdes%token VAR_NEG_CACHE_SIZE VAR_HARDEN_REFERRAL_PATH VAR_PRIVATE_ADDRESS
100238106Sdes%token VAR_PRIVATE_DOMAIN VAR_REMOTE_CONTROL VAR_CONTROL_ENABLE
101238106Sdes%token VAR_CONTROL_INTERFACE VAR_CONTROL_PORT VAR_SERVER_KEY_FILE
102238106Sdes%token VAR_SERVER_CERT_FILE VAR_CONTROL_KEY_FILE VAR_CONTROL_CERT_FILE
103276699Sdes%token VAR_CONTROL_USE_CERT
104238106Sdes%token VAR_EXTENDED_STATISTICS VAR_LOCAL_DATA_PTR VAR_JOSTLE_TIMEOUT
105238106Sdes%token VAR_STUB_PRIME VAR_UNWANTED_REPLY_THRESHOLD VAR_LOG_TIME_ASCII
106238106Sdes%token VAR_DOMAIN_INSECURE VAR_PYTHON VAR_PYTHON_SCRIPT VAR_VAL_SIG_SKEW_MIN
107238106Sdes%token VAR_VAL_SIG_SKEW_MAX VAR_CACHE_MIN_TTL VAR_VAL_LOG_LEVEL
108238106Sdes%token VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING VAR_ADD_HOLDDOWN
109238106Sdes%token VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE VAR_PREFETCH
110266114Sdes%token VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT VAR_HARDEN_BELOW_NXDOMAIN
111356345Scy%token VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES VAR_LOG_REPLIES VAR_LOG_LOCAL_ACTIONS
112356345Scy%token VAR_TCP_UPSTREAM VAR_SSL_UPSTREAM
113238106Sdes%token VAR_SSL_SERVICE_KEY VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST
114356345Scy%token VAR_STUB_SSL_UPSTREAM VAR_FORWARD_SSL_UPSTREAM VAR_TLS_CERT_BUNDLE
115368129Scy%token VAR_HTTPS_PORT VAR_HTTP_ENDPOINT VAR_HTTP_MAX_STREAMS
116368129Scy%token VAR_HTTP_QUERY_BUFFER_SIZE VAR_HTTP_RESPONSE_BUFFER_SIZE
117368693Scy%token VAR_HTTP_NODELAY VAR_HTTP_NOTLS_DOWNSTREAM
118238106Sdes%token VAR_STUB_FIRST VAR_MINIMAL_RESPONSES VAR_RRSET_ROUNDROBIN
119368693Scy%token VAR_MAX_UDP_SIZE VAR_DELAY_CLOSE VAR_UDP_CONNECT
120295535Sdes%token VAR_UNBLOCK_LAN_ZONES VAR_INSECURE_LAN_ZONES
121368693Scy%token VAR_INFRA_CACHE_MIN_RTT VAR_INFRA_KEEP_PROBING
122356345Scy%token VAR_DNS64_PREFIX VAR_DNS64_SYNTHALL VAR_DNS64_IGNORE_AAAA
123366095Scy%token VAR_DNSTAP VAR_DNSTAP_ENABLE VAR_DNSTAP_SOCKET_PATH VAR_DNSTAP_IP
124366095Scy%token VAR_DNSTAP_TLS VAR_DNSTAP_TLS_SERVER_NAME VAR_DNSTAP_TLS_CERT_BUNDLE
125366095Scy%token VAR_DNSTAP_TLS_CLIENT_KEY_FILE VAR_DNSTAP_TLS_CLIENT_CERT_FILE
126366095Scy%token VAR_DNSTAP_SEND_IDENTITY VAR_DNSTAP_SEND_VERSION VAR_DNSTAP_BIDIRECTIONAL
127276605Sdes%token VAR_DNSTAP_IDENTITY VAR_DNSTAP_VERSION
128276605Sdes%token VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES
129276605Sdes%token VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES
130276605Sdes%token VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES
131276605Sdes%token VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES
132276605Sdes%token VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES
133276605Sdes%token VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES
134356345Scy%token VAR_RESPONSE_IP_TAG VAR_RESPONSE_IP VAR_RESPONSE_IP_DATA
135287917Sdes%token VAR_HARDEN_ALGO_DOWNGRADE VAR_IP_TRANSPARENT
136366095Scy%token VAR_IP_DSCP
137307729Sdes%token VAR_DISABLE_DNSSEC_LAME_CHECK
138356345Scy%token VAR_IP_RATELIMIT VAR_IP_RATELIMIT_SLABS VAR_IP_RATELIMIT_SIZE
139287917Sdes%token VAR_RATELIMIT VAR_RATELIMIT_SLABS VAR_RATELIMIT_SIZE
140356345Scy%token VAR_RATELIMIT_FOR_DOMAIN VAR_RATELIMIT_BELOW_DOMAIN
141356345Scy%token VAR_IP_RATELIMIT_FACTOR VAR_RATELIMIT_FACTOR
142356345Scy%token VAR_SEND_CLIENT_SUBNET VAR_CLIENT_SUBNET_ZONE
143356345Scy%token VAR_CLIENT_SUBNET_ALWAYS_FORWARD VAR_CLIENT_SUBNET_OPCODE
144356345Scy%token VAR_MAX_CLIENT_SUBNET_IPV4 VAR_MAX_CLIENT_SUBNET_IPV6
145356345Scy%token VAR_MIN_CLIENT_SUBNET_IPV4 VAR_MIN_CLIENT_SUBNET_IPV6
146356345Scy%token VAR_MAX_ECS_TREE_SIZE_IPV4 VAR_MAX_ECS_TREE_SIZE_IPV6
147289063Sdes%token VAR_CAPS_WHITELIST VAR_CACHE_MAX_NEGATIVE_TTL VAR_PERMIT_SMALL_HOLDDOWN
148356345Scy%token VAR_QNAME_MINIMISATION VAR_QNAME_MINIMISATION_STRICT VAR_IP_FREEBIND
149356345Scy%token VAR_DEFINE_TAG VAR_LOCAL_ZONE_TAG VAR_ACCESS_CONTROL_TAG
150356345Scy%token VAR_LOCAL_ZONE_OVERRIDE VAR_ACCESS_CONTROL_TAG_ACTION
151356345Scy%token VAR_ACCESS_CONTROL_TAG_DATA VAR_VIEW VAR_ACCESS_CONTROL_VIEW
152356345Scy%token VAR_VIEW_FIRST VAR_SERVE_EXPIRED VAR_SERVE_EXPIRED_TTL
153361435Scy%token VAR_SERVE_EXPIRED_TTL_RESET VAR_SERVE_EXPIRED_REPLY_TTL
154369939Sgit2svn%token VAR_SERVE_EXPIRED_CLIENT_TIMEOUT VAR_SERVE_ORIGINAL_TTL VAR_FAKE_DSA
155361435Scy%token VAR_FAKE_SHA1 VAR_LOG_IDENTITY VAR_HIDE_TRUSTANCHOR
156361435Scy%token VAR_TRUST_ANCHOR_SIGNALING VAR_AGGRESSIVE_NSEC VAR_USE_SYSTEMD
157361435Scy%token VAR_SHM_ENABLE VAR_SHM_KEY VAR_ROOT_KEY_SENTINEL
158356345Scy%token VAR_DNSCRYPT VAR_DNSCRYPT_ENABLE VAR_DNSCRYPT_PORT VAR_DNSCRYPT_PROVIDER
159356345Scy%token VAR_DNSCRYPT_SECRET_KEY VAR_DNSCRYPT_PROVIDER_CERT
160356345Scy%token VAR_DNSCRYPT_PROVIDER_CERT_ROTATED
161356345Scy%token VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE
162356345Scy%token VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS
163356345Scy%token VAR_DNSCRYPT_NONCE_CACHE_SIZE
164356345Scy%token VAR_DNSCRYPT_NONCE_CACHE_SLABS
165369939Sgit2svn%token VAR_PAD_RESPONSES VAR_PAD_RESPONSES_BLOCK_SIZE
166369939Sgit2svn%token VAR_PAD_QUERIES VAR_PAD_QUERIES_BLOCK_SIZE
167356345Scy%token VAR_IPSECMOD_ENABLED VAR_IPSECMOD_HOOK VAR_IPSECMOD_IGNORE_BOGUS
168356345Scy%token VAR_IPSECMOD_MAX_TTL VAR_IPSECMOD_WHITELIST VAR_IPSECMOD_STRICT
169356345Scy%token VAR_CACHEDB VAR_CACHEDB_BACKEND VAR_CACHEDB_SECRETSEED
170356345Scy%token VAR_CACHEDB_REDISHOST VAR_CACHEDB_REDISPORT VAR_CACHEDB_REDISTIMEOUT
171366095Scy%token VAR_CACHEDB_REDISEXPIRERECORDS
172356345Scy%token VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM VAR_FOR_UPSTREAM
173356345Scy%token VAR_AUTH_ZONE VAR_ZONEFILE VAR_MASTER VAR_URL VAR_FOR_DOWNSTREAM
174356345Scy%token VAR_FALLBACK_ENABLED VAR_TLS_ADDITIONAL_PORT VAR_LOW_RTT VAR_LOW_RTT_PERMIL
175356345Scy%token VAR_FAST_SERVER_PERMIL VAR_FAST_SERVER_NUM
176356345Scy%token VAR_ALLOW_NOTIFY VAR_TLS_WIN_CERT VAR_TCP_CONNECTION_LIMIT
177356345Scy%token VAR_FORWARD_NO_CACHE VAR_STUB_NO_CACHE VAR_LOG_SERVFAIL VAR_DENY_ANY
178356345Scy%token VAR_UNKNOWN_SERVER_TIME_LIMIT VAR_LOG_TAG_QUERYREPLY
179366095Scy%token VAR_STREAM_WAIT_SIZE VAR_TLS_CIPHERS VAR_TLS_CIPHERSUITES VAR_TLS_USE_SNI
180356345Scy%token VAR_IPSET VAR_IPSET_NAME_V4 VAR_IPSET_NAME_V6
181361435Scy%token VAR_TLS_SESSION_TICKET_KEYS VAR_RPZ VAR_TAGS VAR_RPZ_ACTION_OVERRIDE
182361435Scy%token VAR_RPZ_CNAME_OVERRIDE VAR_RPZ_LOG VAR_RPZ_LOG_NAME
183368693Scy%token VAR_DYNLIB VAR_DYNLIB_FILE VAR_EDNS_CLIENT_STRING
184369939Sgit2svn%token VAR_EDNS_CLIENT_STRING_OPCODE VAR_NSID
185238106Sdes
186238106Sdes%%
187238106Sdestoplevelvars: /* empty */ | toplevelvars toplevelvar ;
188238106Sdestoplevelvar: serverstart contents_server | stubstart contents_stub |
189238106Sdes	forwardstart contents_forward | pythonstart contents_py |
190356345Scy	rcstart contents_rc | dtstart contents_dt | viewstart contents_view |
191356345Scy	dnscstart contents_dnsc | cachedbstart contents_cachedb |
192361435Scy	ipsetstart contents_ipset | authstart contents_auth |
193366095Scy	rpzstart contents_rpz | dynlibstart contents_dl |
194366095Scy	force_toplevel
195238106Sdes	;
196366095Scyforce_toplevel: VAR_FORCE_TOPLEVEL
197366095Scy	{
198366095Scy		OUTYY(("\nP(force-toplevel)\n"));
199366095Scy	}
200366095Scy	;
201238106Sdes/* server: declaration */
202238106Sdesserverstart: VAR_SERVER
203238106Sdes	{
204366095Scy		OUTYY(("\nP(server:)\n"));
205238106Sdes	}
206238106Sdes	;
207366095Scycontents_server: contents_server content_server
208238106Sdes	| ;
209238106Sdescontent_server: server_num_threads | server_verbosity | server_port |
210238106Sdes	server_outgoing_range | server_do_ip4 |
211366095Scy	server_do_ip6 | server_prefer_ip4 | server_prefer_ip6 |
212307729Sdes	server_do_udp | server_do_tcp |
213356345Scy	server_tcp_mss | server_outgoing_tcp_mss | server_tcp_idle_timeout |
214356345Scy	server_tcp_keepalive | server_tcp_keepalive_timeout |
215238106Sdes	server_interface | server_chroot | server_username |
216238106Sdes	server_directory | server_logfile | server_pidfile |
217238106Sdes	server_msg_cache_size | server_msg_cache_slabs |
218238106Sdes	server_num_queries_per_thread | server_rrset_cache_size |
219238106Sdes	server_rrset_cache_slabs | server_outgoing_num_tcp |
220238106Sdes	server_infra_host_ttl | server_infra_lame_ttl |
221238106Sdes	server_infra_cache_slabs | server_infra_cache_numhosts |
222238106Sdes	server_infra_cache_lame_size | server_target_fetch_policy |
223238106Sdes	server_harden_short_bufsize | server_harden_large_queries |
224238106Sdes	server_do_not_query_address | server_hide_identity |
225238106Sdes	server_hide_version | server_identity | server_version |
226238106Sdes	server_harden_glue | server_module_conf | server_trust_anchor_file |
227238106Sdes	server_trust_anchor | server_val_override_date | server_bogus_ttl |
228238106Sdes	server_val_clean_additional | server_val_permissive_mode |
229238106Sdes	server_incoming_num_tcp | server_msg_buffer_size |
230238106Sdes	server_key_cache_size | server_key_cache_slabs |
231238106Sdes	server_trusted_keys_file | server_val_nsec3_keysize_iterations |
232238106Sdes	server_use_syslog | server_outgoing_interface | server_root_hints |
233238106Sdes	server_do_not_query_localhost | server_cache_max_ttl |
234238106Sdes	server_harden_dnssec_stripped | server_access_control |
235238106Sdes	server_local_zone | server_local_data | server_interface_automatic |
236238106Sdes	server_statistics_interval | server_do_daemonize |
237238106Sdes	server_use_caps_for_id | server_statistics_cumulative |
238238106Sdes	server_outgoing_port_permit | server_outgoing_port_avoid |
239238106Sdes	server_dlv_anchor_file | server_dlv_anchor | server_neg_cache_size |
240238106Sdes	server_harden_referral_path | server_private_address |
241238106Sdes	server_private_domain | server_extended_statistics |
242238106Sdes	server_local_data_ptr | server_jostle_timeout |
243238106Sdes	server_unwanted_reply_threshold | server_log_time_ascii |
244238106Sdes	server_domain_insecure | server_val_sig_skew_min |
245238106Sdes	server_val_sig_skew_max | server_cache_min_ttl | server_val_log_level |
246238106Sdes	server_auto_trust_anchor_file | server_add_holddown |
247238106Sdes	server_del_holddown | server_keep_missing | server_so_rcvbuf |
248238106Sdes	server_edns_buffer_size | server_prefetch | server_prefetch_key |
249238106Sdes	server_so_sndbuf | server_harden_below_nxdomain | server_ignore_cd_flag |
250356345Scy	server_log_queries | server_log_replies | server_tcp_upstream | server_ssl_upstream |
251356345Scy	server_log_local_actions |
252238106Sdes	server_ssl_service_key | server_ssl_service_pem | server_ssl_port |
253368129Scy	server_https_port | server_http_endpoint | server_http_max_streams |
254368129Scy	server_http_query_buffer_size | server_http_response_buffer_size |
255368693Scy	server_http_nodelay | server_http_notls_downstream |
256266114Sdes	server_minimal_responses | server_rrset_roundrobin | server_max_udp_size |
257368693Scy	server_so_reuseport | server_delay_close | server_udp_connect |
258295535Sdes	server_unblock_lan_zones | server_insecure_lan_zones |
259356345Scy	server_dns64_prefix | server_dns64_synthall | server_dns64_ignore_aaaa |
260287917Sdes	server_infra_cache_min_rtt | server_harden_algo_downgrade |
261356345Scy	server_ip_transparent | server_ip_ratelimit | server_ratelimit |
262368693Scy	server_ip_dscp | server_infra_keep_probing |
263356345Scy	server_ip_ratelimit_slabs | server_ratelimit_slabs |
264356345Scy	server_ip_ratelimit_size | server_ratelimit_size |
265356345Scy	server_ratelimit_for_domain |
266287917Sdes	server_ratelimit_below_domain | server_ratelimit_factor |
267356345Scy	server_ip_ratelimit_factor | server_send_client_subnet |
268356345Scy	server_client_subnet_zone | server_client_subnet_always_forward |
269356345Scy	server_client_subnet_opcode |
270356345Scy	server_max_client_subnet_ipv4 | server_max_client_subnet_ipv6 |
271356345Scy	server_min_client_subnet_ipv4 | server_min_client_subnet_ipv6 |
272356345Scy	server_max_ecs_tree_size_ipv4 | server_max_ecs_tree_size_ipv6 |
273289063Sdes	server_caps_whitelist | server_cache_max_negative_ttl |
274307729Sdes	server_permit_small_holddown | server_qname_minimisation |
275307729Sdes	server_ip_freebind | server_define_tag | server_local_zone_tag |
276307729Sdes	server_disable_dnssec_lame_check | server_access_control_tag |
277307729Sdes	server_local_zone_override | server_access_control_tag_action |
278356345Scy	server_access_control_tag_data | server_access_control_view |
279369939Sgit2svn	server_qname_minimisation_strict |
280369939Sgit2svn	server_pad_responses | server_pad_responses_block_size |
281369939Sgit2svn	server_pad_queries | server_pad_queries_block_size |
282369939Sgit2svn	server_serve_expired |
283356345Scy	server_serve_expired_ttl | server_serve_expired_ttl_reset |
284361435Scy	server_serve_expired_reply_ttl | server_serve_expired_client_timeout |
285369939Sgit2svn	server_serve_original_ttl | server_fake_dsa |
286369939Sgit2svn	server_log_identity | server_use_systemd |
287356345Scy	server_response_ip_tag | server_response_ip | server_response_ip_data |
288356345Scy	server_shm_enable | server_shm_key | server_fake_sha1 |
289356345Scy	server_hide_trustanchor | server_trust_anchor_signaling |
290356345Scy	server_root_key_sentinel |
291356345Scy	server_ipsecmod_enabled | server_ipsecmod_hook |
292356345Scy	server_ipsecmod_ignore_bogus | server_ipsecmod_max_ttl |
293356345Scy	server_ipsecmod_whitelist | server_ipsecmod_strict |
294356345Scy	server_udp_upstream_without_downstream | server_aggressive_nsec |
295356345Scy	server_tls_cert_bundle | server_tls_additional_port | server_low_rtt |
296356345Scy	server_fast_server_permil | server_fast_server_num  | server_tls_win_cert |
297356345Scy	server_tcp_connection_limit | server_log_servfail | server_deny_any |
298356345Scy	server_unknown_server_time_limit | server_log_tag_queryreply |
299356345Scy	server_stream_wait_size | server_tls_ciphers |
300366095Scy	server_tls_ciphersuites | server_tls_session_ticket_keys |
301368693Scy	server_tls_use_sni | server_edns_client_string |
302369939Sgit2svn	server_edns_client_string_opcode | server_nsid
303238106Sdes	;
304238106Sdesstubstart: VAR_STUB_ZONE
305238106Sdes	{
306238106Sdes		struct config_stub* s;
307238106Sdes		OUTYY(("\nP(stub_zone:)\n"));
308238106Sdes		s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
309238106Sdes		if(s) {
310238106Sdes			s->next = cfg_parser->cfg->stubs;
311238106Sdes			cfg_parser->cfg->stubs = s;
312238106Sdes		} else
313238106Sdes			yyerror("out of memory");
314238106Sdes	}
315238106Sdes	;
316238106Sdescontents_stub: contents_stub content_stub
317238106Sdes	| ;
318356345Scycontent_stub: stub_name | stub_host | stub_addr | stub_prime | stub_first |
319356345Scy	stub_no_cache | stub_ssl_upstream
320238106Sdes	;
321238106Sdesforwardstart: VAR_FORWARD_ZONE
322238106Sdes	{
323238106Sdes		struct config_stub* s;
324238106Sdes		OUTYY(("\nP(forward_zone:)\n"));
325238106Sdes		s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
326238106Sdes		if(s) {
327238106Sdes			s->next = cfg_parser->cfg->forwards;
328238106Sdes			cfg_parser->cfg->forwards = s;
329238106Sdes		} else
330238106Sdes			yyerror("out of memory");
331238106Sdes	}
332238106Sdes	;
333238106Sdescontents_forward: contents_forward content_forward
334238106Sdes	| ;
335356345Scycontent_forward: forward_name | forward_host | forward_addr | forward_first |
336356345Scy	forward_no_cache | forward_ssl_upstream
337238106Sdes	;
338356345Scyviewstart: VAR_VIEW
339356345Scy	{
340356345Scy		struct config_view* s;
341356345Scy		OUTYY(("\nP(view:)\n"));
342356345Scy		s = (struct config_view*)calloc(1, sizeof(struct config_view));
343356345Scy		if(s) {
344356345Scy			s->next = cfg_parser->cfg->views;
345356345Scy			if(s->next && !s->next->name)
346356345Scy				yyerror("view without name");
347356345Scy			cfg_parser->cfg->views = s;
348356345Scy		} else
349356345Scy			yyerror("out of memory");
350356345Scy	}
351356345Scy	;
352356345Scycontents_view: contents_view content_view
353356345Scy	| ;
354356345Scycontent_view: view_name | view_local_zone | view_local_data | view_first |
355356345Scy		view_response_ip | view_response_ip_data | view_local_data_ptr
356356345Scy	;
357356345Scyauthstart: VAR_AUTH_ZONE
358356345Scy	{
359356345Scy		struct config_auth* s;
360356345Scy		OUTYY(("\nP(auth_zone:)\n"));
361356345Scy		s = (struct config_auth*)calloc(1, sizeof(struct config_auth));
362356345Scy		if(s) {
363356345Scy			s->next = cfg_parser->cfg->auths;
364356345Scy			cfg_parser->cfg->auths = s;
365356345Scy			/* defaults for auth zone */
366356345Scy			s->for_downstream = 1;
367356345Scy			s->for_upstream = 1;
368356345Scy			s->fallback_enabled = 0;
369361435Scy			s->isrpz = 0;
370356345Scy		} else
371356345Scy			yyerror("out of memory");
372356345Scy	}
373356345Scy	;
374356345Scycontents_auth: contents_auth content_auth
375356345Scy	| ;
376356345Scycontent_auth: auth_name | auth_zonefile | auth_master | auth_url |
377356345Scy	auth_for_downstream | auth_for_upstream | auth_fallback_enabled |
378356345Scy	auth_allow_notify
379356345Scy	;
380361435Scy
381361435Scyrpz_tag: VAR_TAGS STRING_ARG
382361435Scy	{
383361435Scy		uint8_t* bitlist;
384361435Scy		size_t len = 0;
385361435Scy		OUTYY(("P(server_local_zone_tag:%s)\n", $2));
386361435Scy		bitlist = config_parse_taglist(cfg_parser->cfg, $2,
387361435Scy			&len);
388361435Scy		free($2);
389361435Scy		if(!bitlist) {
390361435Scy			yyerror("could not parse tags, (define-tag them first)");
391361435Scy		}
392361435Scy		if(bitlist) {
393361435Scy			cfg_parser->cfg->auths->rpz_taglist = bitlist;
394361435Scy			cfg_parser->cfg->auths->rpz_taglistlen = len;
395361435Scy
396361435Scy		}
397361435Scy	}
398361435Scy	;
399361435Scy
400361435Scyrpz_action_override: VAR_RPZ_ACTION_OVERRIDE STRING_ARG
401361435Scy	{
402361435Scy		OUTYY(("P(rpz_action_override:%s)\n", $2));
403361435Scy		if(strcmp($2, "nxdomain")!=0 && strcmp($2, "nodata")!=0 &&
404361435Scy		   strcmp($2, "passthru")!=0 && strcmp($2, "drop")!=0 &&
405361435Scy		   strcmp($2, "cname")!=0 && strcmp($2, "disabled")!=0) {
406361435Scy			yyerror("rpz-action-override action: expected nxdomain, "
407361435Scy				"nodata, passthru, drop, cname or disabled");
408361435Scy			free($2);
409361435Scy			cfg_parser->cfg->auths->rpz_action_override = NULL;
410361435Scy		}
411361435Scy		else {
412361435Scy			cfg_parser->cfg->auths->rpz_action_override = $2;
413361435Scy		}
414361435Scy	}
415361435Scy	;
416361435Scy
417361435Scyrpz_cname_override: VAR_RPZ_CNAME_OVERRIDE STRING_ARG
418361435Scy	{
419361435Scy		OUTYY(("P(rpz_cname_override:%s)\n", $2));
420361435Scy		free(cfg_parser->cfg->auths->rpz_cname);
421361435Scy		cfg_parser->cfg->auths->rpz_cname = $2;
422361435Scy	}
423361435Scy	;
424361435Scy
425361435Scyrpz_log: VAR_RPZ_LOG STRING_ARG
426361435Scy	{
427361435Scy		OUTYY(("P(rpz_log:%s)\n", $2));
428361435Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
429361435Scy			yyerror("expected yes or no.");
430361435Scy		else cfg_parser->cfg->auths->rpz_log = (strcmp($2, "yes")==0);
431361435Scy		free($2);
432361435Scy	}
433361435Scy	;
434361435Scy
435361435Scyrpz_log_name: VAR_RPZ_LOG_NAME STRING_ARG
436361435Scy	{
437361435Scy		OUTYY(("P(rpz_log_name:%s)\n", $2));
438361435Scy		free(cfg_parser->cfg->auths->rpz_log_name);
439361435Scy		cfg_parser->cfg->auths->rpz_log_name = $2;
440361435Scy	}
441361435Scy	;
442361435Scy
443361435Scyrpzstart: VAR_RPZ
444361435Scy	{
445361435Scy		struct config_auth* s;
446361435Scy		OUTYY(("\nP(rpz:)\n"));
447361435Scy		s = (struct config_auth*)calloc(1, sizeof(struct config_auth));
448361435Scy		if(s) {
449361435Scy			s->next = cfg_parser->cfg->auths;
450361435Scy			cfg_parser->cfg->auths = s;
451361435Scy			/* defaults for RPZ auth zone */
452361435Scy			s->for_downstream = 0;
453361435Scy			s->for_upstream = 0;
454361435Scy			s->fallback_enabled = 0;
455361435Scy			s->isrpz = 1;
456361435Scy		} else
457361435Scy			yyerror("out of memory");
458361435Scy	}
459361435Scy	;
460361435Scycontents_rpz: contents_rpz content_rpz
461361435Scy	| ;
462361435Scycontent_rpz: auth_name | auth_zonefile | rpz_tag | auth_master | auth_url |
463361435Scy	   auth_allow_notify | rpz_action_override | rpz_cname_override |
464361435Scy	   rpz_log | rpz_log_name
465361435Scy	;
466238106Sdesserver_num_threads: VAR_NUM_THREADS STRING_ARG
467238106Sdes	{
468238106Sdes		OUTYY(("P(server_num_threads:%s)\n", $2));
469238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
470238106Sdes			yyerror("number expected");
471238106Sdes		else cfg_parser->cfg->num_threads = atoi($2);
472238106Sdes		free($2);
473238106Sdes	}
474238106Sdes	;
475238106Sdesserver_verbosity: VAR_VERBOSITY STRING_ARG
476238106Sdes	{
477238106Sdes		OUTYY(("P(server_verbosity:%s)\n", $2));
478238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
479238106Sdes			yyerror("number expected");
480238106Sdes		else cfg_parser->cfg->verbosity = atoi($2);
481238106Sdes		free($2);
482238106Sdes	}
483238106Sdes	;
484238106Sdesserver_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG
485238106Sdes	{
486238106Sdes		OUTYY(("P(server_statistics_interval:%s)\n", $2));
487238106Sdes		if(strcmp($2, "") == 0 || strcmp($2, "0") == 0)
488238106Sdes			cfg_parser->cfg->stat_interval = 0;
489238106Sdes		else if(atoi($2) == 0)
490238106Sdes			yyerror("number expected");
491238106Sdes		else cfg_parser->cfg->stat_interval = atoi($2);
492238106Sdes		free($2);
493238106Sdes	}
494238106Sdes	;
495238106Sdesserver_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG
496238106Sdes	{
497238106Sdes		OUTYY(("P(server_statistics_cumulative:%s)\n", $2));
498238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
499238106Sdes			yyerror("expected yes or no.");
500238106Sdes		else cfg_parser->cfg->stat_cumulative = (strcmp($2, "yes")==0);
501238106Sdes		free($2);
502238106Sdes	}
503238106Sdes	;
504238106Sdesserver_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG
505238106Sdes	{
506238106Sdes		OUTYY(("P(server_extended_statistics:%s)\n", $2));
507238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
508238106Sdes			yyerror("expected yes or no.");
509238106Sdes		else cfg_parser->cfg->stat_extended = (strcmp($2, "yes")==0);
510238106Sdes		free($2);
511238106Sdes	}
512238106Sdes	;
513356345Scyserver_shm_enable: VAR_SHM_ENABLE STRING_ARG
514356345Scy	{
515356345Scy		OUTYY(("P(server_shm_enable:%s)\n", $2));
516356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
517356345Scy			yyerror("expected yes or no.");
518356345Scy		else cfg_parser->cfg->shm_enable = (strcmp($2, "yes")==0);
519356345Scy		free($2);
520356345Scy	}
521356345Scy	;
522356345Scyserver_shm_key: VAR_SHM_KEY STRING_ARG
523356345Scy	{
524356345Scy		OUTYY(("P(server_shm_key:%s)\n", $2));
525356345Scy		if(strcmp($2, "") == 0 || strcmp($2, "0") == 0)
526356345Scy			cfg_parser->cfg->shm_key = 0;
527356345Scy		else if(atoi($2) == 0)
528356345Scy			yyerror("number expected");
529356345Scy		else cfg_parser->cfg->shm_key = atoi($2);
530356345Scy		free($2);
531356345Scy	}
532356345Scy	;
533238106Sdesserver_port: VAR_PORT STRING_ARG
534238106Sdes	{
535238106Sdes		OUTYY(("P(server_port:%s)\n", $2));
536238106Sdes		if(atoi($2) == 0)
537238106Sdes			yyerror("port number expected");
538238106Sdes		else cfg_parser->cfg->port = atoi($2);
539238106Sdes		free($2);
540238106Sdes	}
541238106Sdes	;
542356345Scyserver_send_client_subnet: VAR_SEND_CLIENT_SUBNET STRING_ARG
543356345Scy	{
544356345Scy	#ifdef CLIENT_SUBNET
545356345Scy		OUTYY(("P(server_send_client_subnet:%s)\n", $2));
546356345Scy		if(!cfg_strlist_insert(&cfg_parser->cfg->client_subnet, $2))
547356345Scy			fatal_exit("out of memory adding client-subnet");
548356345Scy	#else
549356345Scy		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
550361435Scy		free($2);
551356345Scy	#endif
552356345Scy	}
553356345Scy	;
554356345Scyserver_client_subnet_zone: VAR_CLIENT_SUBNET_ZONE STRING_ARG
555356345Scy	{
556356345Scy	#ifdef CLIENT_SUBNET
557356345Scy		OUTYY(("P(server_client_subnet_zone:%s)\n", $2));
558356345Scy		if(!cfg_strlist_insert(&cfg_parser->cfg->client_subnet_zone,
559356345Scy			$2))
560356345Scy			fatal_exit("out of memory adding client-subnet-zone");
561356345Scy	#else
562356345Scy		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
563361435Scy		free($2);
564356345Scy	#endif
565356345Scy	}
566356345Scy	;
567356345Scyserver_client_subnet_always_forward:
568356345Scy	VAR_CLIENT_SUBNET_ALWAYS_FORWARD STRING_ARG
569356345Scy	{
570356345Scy	#ifdef CLIENT_SUBNET
571356345Scy		OUTYY(("P(server_client_subnet_always_forward:%s)\n", $2));
572356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
573356345Scy			yyerror("expected yes or no.");
574356345Scy		else
575356345Scy			cfg_parser->cfg->client_subnet_always_forward =
576356345Scy				(strcmp($2, "yes")==0);
577356345Scy	#else
578356345Scy		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
579356345Scy	#endif
580356345Scy		free($2);
581356345Scy	}
582356345Scy	;
583356345Scyserver_client_subnet_opcode: VAR_CLIENT_SUBNET_OPCODE STRING_ARG
584356345Scy	{
585356345Scy	#ifdef CLIENT_SUBNET
586356345Scy		OUTYY(("P(client_subnet_opcode:%s)\n", $2));
587356345Scy		OUTYY(("P(Deprecated option, ignoring)\n"));
588356345Scy	#else
589356345Scy		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
590356345Scy	#endif
591356345Scy		free($2);
592356345Scy	}
593356345Scy	;
594356345Scyserver_max_client_subnet_ipv4: VAR_MAX_CLIENT_SUBNET_IPV4 STRING_ARG
595356345Scy	{
596356345Scy	#ifdef CLIENT_SUBNET
597356345Scy		OUTYY(("P(max_client_subnet_ipv4:%s)\n", $2));
598356345Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
599356345Scy			yyerror("IPv4 subnet length expected");
600356345Scy		else if (atoi($2) > 32)
601356345Scy			cfg_parser->cfg->max_client_subnet_ipv4 = 32;
602356345Scy		else if (atoi($2) < 0)
603356345Scy			cfg_parser->cfg->max_client_subnet_ipv4 = 0;
604356345Scy		else cfg_parser->cfg->max_client_subnet_ipv4 = (uint8_t)atoi($2);
605356345Scy	#else
606356345Scy		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
607356345Scy	#endif
608356345Scy		free($2);
609356345Scy	}
610356345Scy	;
611356345Scyserver_max_client_subnet_ipv6: VAR_MAX_CLIENT_SUBNET_IPV6 STRING_ARG
612356345Scy	{
613356345Scy	#ifdef CLIENT_SUBNET
614356345Scy		OUTYY(("P(max_client_subnet_ipv6:%s)\n", $2));
615356345Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
616356345Scy			yyerror("Ipv6 subnet length expected");
617356345Scy		else if (atoi($2) > 128)
618356345Scy			cfg_parser->cfg->max_client_subnet_ipv6 = 128;
619356345Scy		else if (atoi($2) < 0)
620356345Scy			cfg_parser->cfg->max_client_subnet_ipv6 = 0;
621356345Scy		else cfg_parser->cfg->max_client_subnet_ipv6 = (uint8_t)atoi($2);
622356345Scy	#else
623356345Scy		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
624356345Scy	#endif
625356345Scy		free($2);
626356345Scy	}
627356345Scy	;
628356345Scyserver_min_client_subnet_ipv4: VAR_MIN_CLIENT_SUBNET_IPV4 STRING_ARG
629356345Scy	{
630356345Scy	#ifdef CLIENT_SUBNET
631356345Scy		OUTYY(("P(min_client_subnet_ipv4:%s)\n", $2));
632356345Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
633356345Scy			yyerror("IPv4 subnet length expected");
634356345Scy		else if (atoi($2) > 32)
635356345Scy			cfg_parser->cfg->min_client_subnet_ipv4 = 32;
636356345Scy		else if (atoi($2) < 0)
637356345Scy			cfg_parser->cfg->min_client_subnet_ipv4 = 0;
638356345Scy		else cfg_parser->cfg->min_client_subnet_ipv4 = (uint8_t)atoi($2);
639356345Scy	#else
640356345Scy		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
641356345Scy	#endif
642356345Scy		free($2);
643356345Scy	}
644356345Scy	;
645356345Scyserver_min_client_subnet_ipv6: VAR_MIN_CLIENT_SUBNET_IPV6 STRING_ARG
646356345Scy	{
647356345Scy	#ifdef CLIENT_SUBNET
648356345Scy		OUTYY(("P(min_client_subnet_ipv6:%s)\n", $2));
649356345Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
650356345Scy			yyerror("Ipv6 subnet length expected");
651356345Scy		else if (atoi($2) > 128)
652356345Scy			cfg_parser->cfg->min_client_subnet_ipv6 = 128;
653356345Scy		else if (atoi($2) < 0)
654356345Scy			cfg_parser->cfg->min_client_subnet_ipv6 = 0;
655356345Scy		else cfg_parser->cfg->min_client_subnet_ipv6 = (uint8_t)atoi($2);
656356345Scy	#else
657356345Scy		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
658356345Scy	#endif
659356345Scy		free($2);
660356345Scy	}
661356345Scy	;
662356345Scyserver_max_ecs_tree_size_ipv4: VAR_MAX_ECS_TREE_SIZE_IPV4 STRING_ARG
663356345Scy	{
664356345Scy	#ifdef CLIENT_SUBNET
665356345Scy		OUTYY(("P(max_ecs_tree_size_ipv4:%s)\n", $2));
666356345Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
667356345Scy			yyerror("IPv4 ECS tree size expected");
668356345Scy		else if (atoi($2) < 0)
669356345Scy			cfg_parser->cfg->max_ecs_tree_size_ipv4 = 0;
670356345Scy		else cfg_parser->cfg->max_ecs_tree_size_ipv4 = (uint32_t)atoi($2);
671356345Scy	#else
672356345Scy		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
673356345Scy	#endif
674356345Scy		free($2);
675356345Scy	}
676356345Scy	;
677356345Scyserver_max_ecs_tree_size_ipv6: VAR_MAX_ECS_TREE_SIZE_IPV6 STRING_ARG
678356345Scy	{
679356345Scy	#ifdef CLIENT_SUBNET
680356345Scy		OUTYY(("P(max_ecs_tree_size_ipv6:%s)\n", $2));
681356345Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
682356345Scy			yyerror("IPv6 ECS tree size expected");
683356345Scy		else if (atoi($2) < 0)
684356345Scy			cfg_parser->cfg->max_ecs_tree_size_ipv6 = 0;
685356345Scy		else cfg_parser->cfg->max_ecs_tree_size_ipv6 = (uint32_t)atoi($2);
686356345Scy	#else
687356345Scy		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
688356345Scy	#endif
689356345Scy		free($2);
690356345Scy	}
691356345Scy	;
692238106Sdesserver_interface: VAR_INTERFACE STRING_ARG
693238106Sdes	{
694238106Sdes		OUTYY(("P(server_interface:%s)\n", $2));
695238106Sdes		if(cfg_parser->cfg->num_ifs == 0)
696238106Sdes			cfg_parser->cfg->ifs = calloc(1, sizeof(char*));
697238106Sdes		else 	cfg_parser->cfg->ifs = realloc(cfg_parser->cfg->ifs,
698238106Sdes				(cfg_parser->cfg->num_ifs+1)*sizeof(char*));
699238106Sdes		if(!cfg_parser->cfg->ifs)
700238106Sdes			yyerror("out of memory");
701238106Sdes		else
702238106Sdes			cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = $2;
703238106Sdes	}
704238106Sdes	;
705238106Sdesserver_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG
706238106Sdes	{
707238106Sdes		OUTYY(("P(server_outgoing_interface:%s)\n", $2));
708238106Sdes		if(cfg_parser->cfg->num_out_ifs == 0)
709238106Sdes			cfg_parser->cfg->out_ifs = calloc(1, sizeof(char*));
710238106Sdes		else 	cfg_parser->cfg->out_ifs = realloc(
711238106Sdes			cfg_parser->cfg->out_ifs,
712238106Sdes			(cfg_parser->cfg->num_out_ifs+1)*sizeof(char*));
713238106Sdes		if(!cfg_parser->cfg->out_ifs)
714238106Sdes			yyerror("out of memory");
715238106Sdes		else
716238106Sdes			cfg_parser->cfg->out_ifs[
717238106Sdes				cfg_parser->cfg->num_out_ifs++] = $2;
718238106Sdes	}
719238106Sdes	;
720238106Sdesserver_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG
721238106Sdes	{
722238106Sdes		OUTYY(("P(server_outgoing_range:%s)\n", $2));
723238106Sdes		if(atoi($2) == 0)
724238106Sdes			yyerror("number expected");
725238106Sdes		else cfg_parser->cfg->outgoing_num_ports = atoi($2);
726238106Sdes		free($2);
727238106Sdes	}
728238106Sdes	;
729238106Sdesserver_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG
730238106Sdes	{
731238106Sdes		OUTYY(("P(server_outgoing_port_permit:%s)\n", $2));
732238106Sdes		if(!cfg_mark_ports($2, 1,
733238106Sdes			cfg_parser->cfg->outgoing_avail_ports, 65536))
734238106Sdes			yyerror("port number or range (\"low-high\") expected");
735238106Sdes		free($2);
736238106Sdes	}
737238106Sdes	;
738238106Sdesserver_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG
739238106Sdes	{
740238106Sdes		OUTYY(("P(server_outgoing_port_avoid:%s)\n", $2));
741238106Sdes		if(!cfg_mark_ports($2, 0,
742238106Sdes			cfg_parser->cfg->outgoing_avail_ports, 65536))
743238106Sdes			yyerror("port number or range (\"low-high\") expected");
744238106Sdes		free($2);
745238106Sdes	}
746238106Sdes	;
747238106Sdesserver_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG
748238106Sdes	{
749238106Sdes		OUTYY(("P(server_outgoing_num_tcp:%s)\n", $2));
750238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
751238106Sdes			yyerror("number expected");
752238106Sdes		else cfg_parser->cfg->outgoing_num_tcp = atoi($2);
753238106Sdes		free($2);
754238106Sdes	}
755238106Sdes	;
756238106Sdesserver_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG
757238106Sdes	{
758238106Sdes		OUTYY(("P(server_incoming_num_tcp:%s)\n", $2));
759238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
760238106Sdes			yyerror("number expected");
761238106Sdes		else cfg_parser->cfg->incoming_num_tcp = atoi($2);
762238106Sdes		free($2);
763238106Sdes	}
764238106Sdes	;
765238106Sdesserver_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG
766238106Sdes	{
767238106Sdes		OUTYY(("P(server_interface_automatic:%s)\n", $2));
768238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
769238106Sdes			yyerror("expected yes or no.");
770238106Sdes		else cfg_parser->cfg->if_automatic = (strcmp($2, "yes")==0);
771238106Sdes		free($2);
772238106Sdes	}
773238106Sdes	;
774238106Sdesserver_do_ip4: VAR_DO_IP4 STRING_ARG
775238106Sdes	{
776238106Sdes		OUTYY(("P(server_do_ip4:%s)\n", $2));
777238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
778238106Sdes			yyerror("expected yes or no.");
779238106Sdes		else cfg_parser->cfg->do_ip4 = (strcmp($2, "yes")==0);
780238106Sdes		free($2);
781238106Sdes	}
782238106Sdes	;
783238106Sdesserver_do_ip6: VAR_DO_IP6 STRING_ARG
784238106Sdes	{
785238106Sdes		OUTYY(("P(server_do_ip6:%s)\n", $2));
786238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
787238106Sdes			yyerror("expected yes or no.");
788238106Sdes		else cfg_parser->cfg->do_ip6 = (strcmp($2, "yes")==0);
789238106Sdes		free($2);
790238106Sdes	}
791238106Sdes	;
792238106Sdesserver_do_udp: VAR_DO_UDP STRING_ARG
793238106Sdes	{
794238106Sdes		OUTYY(("P(server_do_udp:%s)\n", $2));
795238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
796238106Sdes			yyerror("expected yes or no.");
797238106Sdes		else cfg_parser->cfg->do_udp = (strcmp($2, "yes")==0);
798238106Sdes		free($2);
799238106Sdes	}
800238106Sdes	;
801238106Sdesserver_do_tcp: VAR_DO_TCP STRING_ARG
802238106Sdes	{
803238106Sdes		OUTYY(("P(server_do_tcp:%s)\n", $2));
804238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
805238106Sdes			yyerror("expected yes or no.");
806238106Sdes		else cfg_parser->cfg->do_tcp = (strcmp($2, "yes")==0);
807238106Sdes		free($2);
808238106Sdes	}
809238106Sdes	;
810366095Scyserver_prefer_ip4: VAR_PREFER_IP4 STRING_ARG
811366095Scy	{
812366095Scy		OUTYY(("P(server_prefer_ip4:%s)\n", $2));
813366095Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
814366095Scy			yyerror("expected yes or no.");
815366095Scy		else cfg_parser->cfg->prefer_ip4 = (strcmp($2, "yes")==0);
816366095Scy		free($2);
817366095Scy	}
818366095Scy	;
819307729Sdesserver_prefer_ip6: VAR_PREFER_IP6 STRING_ARG
820307729Sdes	{
821307729Sdes		OUTYY(("P(server_prefer_ip6:%s)\n", $2));
822307729Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
823307729Sdes			yyerror("expected yes or no.");
824307729Sdes		else cfg_parser->cfg->prefer_ip6 = (strcmp($2, "yes")==0);
825307729Sdes		free($2);
826307729Sdes	}
827307729Sdes	;
828296415Sdesserver_tcp_mss: VAR_TCP_MSS STRING_ARG
829296415Sdes	{
830296415Sdes		OUTYY(("P(server_tcp_mss:%s)\n", $2));
831296415Sdes                if(atoi($2) == 0 && strcmp($2, "0") != 0)
832296415Sdes                        yyerror("number expected");
833296415Sdes                else cfg_parser->cfg->tcp_mss = atoi($2);
834296415Sdes                free($2);
835296415Sdes	}
836296415Sdes	;
837296415Sdesserver_outgoing_tcp_mss: VAR_OUTGOING_TCP_MSS STRING_ARG
838296415Sdes	{
839296415Sdes		OUTYY(("P(server_outgoing_tcp_mss:%s)\n", $2));
840296415Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
841296415Sdes			yyerror("number expected");
842296415Sdes		else cfg_parser->cfg->outgoing_tcp_mss = atoi($2);
843296415Sdes		free($2);
844296415Sdes	}
845296415Sdes	;
846356345Scyserver_tcp_idle_timeout: VAR_TCP_IDLE_TIMEOUT STRING_ARG
847356345Scy	{
848356345Scy		OUTYY(("P(server_tcp_idle_timeout:%s)\n", $2));
849356345Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
850356345Scy			yyerror("number expected");
851356345Scy		else if (atoi($2) > 120000)
852356345Scy			cfg_parser->cfg->tcp_idle_timeout = 120000;
853356345Scy		else if (atoi($2) < 1)
854356345Scy			cfg_parser->cfg->tcp_idle_timeout = 1;
855356345Scy		else cfg_parser->cfg->tcp_idle_timeout = atoi($2);
856356345Scy		free($2);
857356345Scy	}
858356345Scy	;
859356345Scyserver_tcp_keepalive: VAR_EDNS_TCP_KEEPALIVE STRING_ARG
860356345Scy	{
861356345Scy		OUTYY(("P(server_tcp_keepalive:%s)\n", $2));
862356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
863356345Scy			yyerror("expected yes or no.");
864356345Scy		else cfg_parser->cfg->do_tcp_keepalive = (strcmp($2, "yes")==0);
865356345Scy		free($2);
866356345Scy	}
867356345Scy	;
868356345Scyserver_tcp_keepalive_timeout: VAR_EDNS_TCP_KEEPALIVE_TIMEOUT STRING_ARG
869356345Scy	{
870356345Scy		OUTYY(("P(server_tcp_keepalive_timeout:%s)\n", $2));
871356345Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
872356345Scy			yyerror("number expected");
873356345Scy		else if (atoi($2) > 6553500)
874356345Scy			cfg_parser->cfg->tcp_keepalive_timeout = 6553500;
875356345Scy		else if (atoi($2) < 1)
876356345Scy			cfg_parser->cfg->tcp_keepalive_timeout = 0;
877356345Scy		else cfg_parser->cfg->tcp_keepalive_timeout = atoi($2);
878356345Scy		free($2);
879356345Scy	}
880356345Scy	;
881238106Sdesserver_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG
882238106Sdes	{
883238106Sdes		OUTYY(("P(server_tcp_upstream:%s)\n", $2));
884238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
885238106Sdes			yyerror("expected yes or no.");
886238106Sdes		else cfg_parser->cfg->tcp_upstream = (strcmp($2, "yes")==0);
887238106Sdes		free($2);
888238106Sdes	}
889238106Sdes	;
890356345Scyserver_udp_upstream_without_downstream: VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM STRING_ARG
891356345Scy	{
892356345Scy		OUTYY(("P(server_udp_upstream_without_downstream:%s)\n", $2));
893356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
894356345Scy			yyerror("expected yes or no.");
895356345Scy		else cfg_parser->cfg->udp_upstream_without_downstream = (strcmp($2, "yes")==0);
896356345Scy		free($2);
897356345Scy	}
898356345Scy	;
899238106Sdesserver_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG
900238106Sdes	{
901238106Sdes		OUTYY(("P(server_ssl_upstream:%s)\n", $2));
902238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
903238106Sdes			yyerror("expected yes or no.");
904238106Sdes		else cfg_parser->cfg->ssl_upstream = (strcmp($2, "yes")==0);
905238106Sdes		free($2);
906238106Sdes	}
907238106Sdes	;
908238106Sdesserver_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG
909238106Sdes	{
910238106Sdes		OUTYY(("P(server_ssl_service_key:%s)\n", $2));
911238106Sdes		free(cfg_parser->cfg->ssl_service_key);
912238106Sdes		cfg_parser->cfg->ssl_service_key = $2;
913238106Sdes	}
914238106Sdes	;
915238106Sdesserver_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG
916238106Sdes	{
917238106Sdes		OUTYY(("P(server_ssl_service_pem:%s)\n", $2));
918238106Sdes		free(cfg_parser->cfg->ssl_service_pem);
919238106Sdes		cfg_parser->cfg->ssl_service_pem = $2;
920238106Sdes	}
921238106Sdes	;
922238106Sdesserver_ssl_port: VAR_SSL_PORT STRING_ARG
923238106Sdes	{
924238106Sdes		OUTYY(("P(server_ssl_port:%s)\n", $2));
925238106Sdes		if(atoi($2) == 0)
926238106Sdes			yyerror("port number expected");
927238106Sdes		else cfg_parser->cfg->ssl_port = atoi($2);
928238106Sdes		free($2);
929238106Sdes	}
930238106Sdes	;
931356345Scyserver_tls_cert_bundle: VAR_TLS_CERT_BUNDLE STRING_ARG
932356345Scy	{
933356345Scy		OUTYY(("P(server_tls_cert_bundle:%s)\n", $2));
934356345Scy		free(cfg_parser->cfg->tls_cert_bundle);
935356345Scy		cfg_parser->cfg->tls_cert_bundle = $2;
936356345Scy	}
937356345Scy	;
938356345Scyserver_tls_win_cert: VAR_TLS_WIN_CERT STRING_ARG
939356345Scy	{
940356345Scy		OUTYY(("P(server_tls_win_cert:%s)\n", $2));
941356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
942356345Scy			yyerror("expected yes or no.");
943356345Scy		else cfg_parser->cfg->tls_win_cert = (strcmp($2, "yes")==0);
944356345Scy		free($2);
945356345Scy	}
946356345Scy	;
947356345Scyserver_tls_additional_port: VAR_TLS_ADDITIONAL_PORT STRING_ARG
948356345Scy	{
949356345Scy		OUTYY(("P(server_tls_additional_port:%s)\n", $2));
950356345Scy		if(!cfg_strlist_insert(&cfg_parser->cfg->tls_additional_port,
951356345Scy			$2))
952356345Scy			yyerror("out of memory");
953356345Scy	}
954356345Scy	;
955356345Scyserver_tls_ciphers: VAR_TLS_CIPHERS STRING_ARG
956356345Scy	{
957356345Scy		OUTYY(("P(server_tls_ciphers:%s)\n", $2));
958356345Scy		free(cfg_parser->cfg->tls_ciphers);
959356345Scy		cfg_parser->cfg->tls_ciphers = $2;
960356345Scy	}
961356345Scy	;
962356345Scyserver_tls_ciphersuites: VAR_TLS_CIPHERSUITES STRING_ARG
963356345Scy	{
964356345Scy		OUTYY(("P(server_tls_ciphersuites:%s)\n", $2));
965356345Scy		free(cfg_parser->cfg->tls_ciphersuites);
966356345Scy		cfg_parser->cfg->tls_ciphersuites = $2;
967356345Scy	}
968356345Scy	;
969356345Scyserver_tls_session_ticket_keys: VAR_TLS_SESSION_TICKET_KEYS STRING_ARG
970356345Scy	{
971356345Scy		OUTYY(("P(server_tls_session_ticket_keys:%s)\n", $2));
972356345Scy		if(!cfg_strlist_append(&cfg_parser->cfg->tls_session_ticket_keys,
973356345Scy			$2))
974356345Scy			yyerror("out of memory");
975356345Scy	}
976356345Scy	;
977366095Scyserver_tls_use_sni: VAR_TLS_USE_SNI STRING_ARG
978366095Scy	{
979366095Scy		OUTYY(("P(server_tls_use_sni:%s)\n", $2));
980366095Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
981366095Scy			yyerror("expected yes or no.");
982366095Scy		else cfg_parser->cfg->tls_use_sni = (strcmp($2, "yes")==0);
983366095Scy		free($2);
984366095Scy	}
985366095Scy	;
986368129Scyserver_https_port: VAR_HTTPS_PORT STRING_ARG
987368129Scy	{
988368129Scy		OUTYY(("P(server_https_port:%s)\n", $2));
989368129Scy		if(atoi($2) == 0)
990368129Scy			yyerror("port number expected");
991368129Scy		else cfg_parser->cfg->https_port = atoi($2);
992368693Scy		free($2);
993368129Scy	};
994368129Scyserver_http_endpoint: VAR_HTTP_ENDPOINT STRING_ARG
995368129Scy	{
996368129Scy		OUTYY(("P(server_http_endpoint:%s)\n", $2));
997368129Scy		free(cfg_parser->cfg->http_endpoint);
998368129Scy		if($2 && $2[0] != '/') {
999368129Scy			cfg_parser->cfg->http_endpoint = malloc(strlen($2)+2);
1000368129Scy			if(!cfg_parser->cfg->http_endpoint)
1001368129Scy				yyerror("out of memory");
1002368129Scy			cfg_parser->cfg->http_endpoint[0] = '/';
1003368129Scy			memmove(cfg_parser->cfg->http_endpoint+1, $2,
1004368129Scy				strlen($2)+1);
1005368129Scy			free($2);
1006368129Scy		} else {
1007368129Scy			cfg_parser->cfg->http_endpoint = $2;
1008368129Scy		}
1009368129Scy	};
1010368129Scyserver_http_max_streams: VAR_HTTP_MAX_STREAMS STRING_ARG
1011368129Scy	{
1012368129Scy		OUTYY(("P(server_http_max_streams:%s)\n", $2));
1013368129Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1014368129Scy			yyerror("number expected");
1015368129Scy		else cfg_parser->cfg->http_max_streams = atoi($2);
1016368129Scy		free($2);
1017368129Scy	};
1018368129Scyserver_http_query_buffer_size: VAR_HTTP_QUERY_BUFFER_SIZE STRING_ARG
1019368129Scy	{
1020368129Scy		OUTYY(("P(server_http_query_buffer_size:%s)\n", $2));
1021368129Scy		if(!cfg_parse_memsize($2,
1022368129Scy			&cfg_parser->cfg->http_query_buffer_size))
1023368129Scy			yyerror("memory size expected");
1024368129Scy		free($2);
1025368129Scy	};
1026368129Scyserver_http_response_buffer_size: VAR_HTTP_RESPONSE_BUFFER_SIZE STRING_ARG
1027368129Scy	{
1028368129Scy		OUTYY(("P(server_http_response_buffer_size:%s)\n", $2));
1029368129Scy		if(!cfg_parse_memsize($2,
1030368129Scy			&cfg_parser->cfg->http_response_buffer_size))
1031368129Scy			yyerror("memory size expected");
1032368129Scy		free($2);
1033368129Scy	};
1034368129Scyserver_http_nodelay: VAR_HTTP_NODELAY STRING_ARG
1035368129Scy	{
1036368129Scy		OUTYY(("P(server_http_nodelay:%s)\n", $2));
1037368129Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1038368129Scy			yyerror("expected yes or no.");
1039368129Scy		else cfg_parser->cfg->http_nodelay = (strcmp($2, "yes")==0);
1040368129Scy		free($2);
1041368693Scy	}
1042368693Scyserver_http_notls_downstream: VAR_HTTP_NOTLS_DOWNSTREAM STRING_ARG
1043368693Scy	{
1044368693Scy		OUTYY(("P(server_http_notls_downstream:%s)\n", $2));
1045368693Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1046368693Scy			yyerror("expected yes or no.");
1047368693Scy		else cfg_parser->cfg->http_notls_downstream = (strcmp($2, "yes")==0);
1048368693Scy		free($2);
1049368129Scy	};
1050356345Scyserver_use_systemd: VAR_USE_SYSTEMD STRING_ARG
1051356345Scy	{
1052356345Scy		OUTYY(("P(server_use_systemd:%s)\n", $2));
1053356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1054356345Scy			yyerror("expected yes or no.");
1055356345Scy		else cfg_parser->cfg->use_systemd = (strcmp($2, "yes")==0);
1056356345Scy		free($2);
1057356345Scy	}
1058356345Scy	;
1059238106Sdesserver_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG
1060238106Sdes	{
1061238106Sdes		OUTYY(("P(server_do_daemonize:%s)\n", $2));
1062238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1063238106Sdes			yyerror("expected yes or no.");
1064238106Sdes		else cfg_parser->cfg->do_daemonize = (strcmp($2, "yes")==0);
1065238106Sdes		free($2);
1066238106Sdes	}
1067238106Sdes	;
1068238106Sdesserver_use_syslog: VAR_USE_SYSLOG STRING_ARG
1069238106Sdes	{
1070238106Sdes		OUTYY(("P(server_use_syslog:%s)\n", $2));
1071238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1072238106Sdes			yyerror("expected yes or no.");
1073238106Sdes		else cfg_parser->cfg->use_syslog = (strcmp($2, "yes")==0);
1074238106Sdes#if !defined(HAVE_SYSLOG_H) && !defined(UB_ON_WINDOWS)
1075238106Sdes		if(strcmp($2, "yes") == 0)
1076238106Sdes			yyerror("no syslog services are available. "
1077238106Sdes				"(reconfigure and compile to add)");
1078238106Sdes#endif
1079238106Sdes		free($2);
1080238106Sdes	}
1081238106Sdes	;
1082238106Sdesserver_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG
1083238106Sdes	{
1084238106Sdes		OUTYY(("P(server_log_time_ascii:%s)\n", $2));
1085238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1086238106Sdes			yyerror("expected yes or no.");
1087238106Sdes		else cfg_parser->cfg->log_time_ascii = (strcmp($2, "yes")==0);
1088238106Sdes		free($2);
1089238106Sdes	}
1090238106Sdes	;
1091238106Sdesserver_log_queries: VAR_LOG_QUERIES STRING_ARG
1092238106Sdes	{
1093238106Sdes		OUTYY(("P(server_log_queries:%s)\n", $2));
1094238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1095238106Sdes			yyerror("expected yes or no.");
1096238106Sdes		else cfg_parser->cfg->log_queries = (strcmp($2, "yes")==0);
1097238106Sdes		free($2);
1098238106Sdes	}
1099238106Sdes	;
1100356345Scyserver_log_replies: VAR_LOG_REPLIES STRING_ARG
1101356345Scy  {
1102356345Scy  	OUTYY(("P(server_log_replies:%s)\n", $2));
1103356345Scy  	if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1104356345Scy  		yyerror("expected yes or no.");
1105356345Scy  	else cfg_parser->cfg->log_replies = (strcmp($2, "yes")==0);
1106356345Scy  	free($2);
1107356345Scy  }
1108356345Scy  ;
1109356345Scyserver_log_tag_queryreply: VAR_LOG_TAG_QUERYREPLY STRING_ARG
1110356345Scy  {
1111356345Scy  	OUTYY(("P(server_log_tag_queryreply:%s)\n", $2));
1112356345Scy  	if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1113356345Scy  		yyerror("expected yes or no.");
1114356345Scy  	else cfg_parser->cfg->log_tag_queryreply = (strcmp($2, "yes")==0);
1115356345Scy  	free($2);
1116356345Scy  }
1117356345Scy  ;
1118356345Scyserver_log_servfail: VAR_LOG_SERVFAIL STRING_ARG
1119356345Scy	{
1120356345Scy		OUTYY(("P(server_log_servfail:%s)\n", $2));
1121356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1122356345Scy			yyerror("expected yes or no.");
1123356345Scy		else cfg_parser->cfg->log_servfail = (strcmp($2, "yes")==0);
1124356345Scy		free($2);
1125356345Scy	}
1126356345Scy	;
1127356345Scyserver_log_local_actions: VAR_LOG_LOCAL_ACTIONS STRING_ARG
1128356345Scy  {
1129356345Scy  	OUTYY(("P(server_log_local_actions:%s)\n", $2));
1130356345Scy  	if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1131356345Scy  		yyerror("expected yes or no.");
1132356345Scy  	else cfg_parser->cfg->log_local_actions = (strcmp($2, "yes")==0);
1133356345Scy  	free($2);
1134356345Scy  }
1135356345Scy  ;
1136238106Sdesserver_chroot: VAR_CHROOT STRING_ARG
1137238106Sdes	{
1138238106Sdes		OUTYY(("P(server_chroot:%s)\n", $2));
1139238106Sdes		free(cfg_parser->cfg->chrootdir);
1140238106Sdes		cfg_parser->cfg->chrootdir = $2;
1141238106Sdes	}
1142238106Sdes	;
1143238106Sdesserver_username: VAR_USERNAME STRING_ARG
1144238106Sdes	{
1145238106Sdes		OUTYY(("P(server_username:%s)\n", $2));
1146238106Sdes		free(cfg_parser->cfg->username);
1147238106Sdes		cfg_parser->cfg->username = $2;
1148238106Sdes	}
1149238106Sdes	;
1150238106Sdesserver_directory: VAR_DIRECTORY STRING_ARG
1151238106Sdes	{
1152238106Sdes		OUTYY(("P(server_directory:%s)\n", $2));
1153238106Sdes		free(cfg_parser->cfg->directory);
1154238106Sdes		cfg_parser->cfg->directory = $2;
1155307729Sdes		/* change there right away for includes relative to this */
1156307729Sdes		if($2[0]) {
1157307729Sdes			char* d;
1158307729Sdes#ifdef UB_ON_WINDOWS
1159307729Sdes			w_config_adjust_directory(cfg_parser->cfg);
1160307729Sdes#endif
1161307729Sdes			d = cfg_parser->cfg->directory;
1162307729Sdes			/* adjust directory if we have already chroot,
1163307729Sdes			 * like, we reread after sighup */
1164307729Sdes			if(cfg_parser->chroot && cfg_parser->chroot[0] &&
1165307729Sdes				strncmp(d, cfg_parser->chroot, strlen(
1166307729Sdes				cfg_parser->chroot)) == 0)
1167307729Sdes				d += strlen(cfg_parser->chroot);
1168356345Scy			if(d[0]) {
1169356345Scy			    if(chdir(d))
1170307729Sdes				log_err("cannot chdir to directory: %s (%s)",
1171307729Sdes					d, strerror(errno));
1172356345Scy			}
1173307729Sdes		}
1174238106Sdes	}
1175238106Sdes	;
1176238106Sdesserver_logfile: VAR_LOGFILE STRING_ARG
1177238106Sdes	{
1178238106Sdes		OUTYY(("P(server_logfile:%s)\n", $2));
1179238106Sdes		free(cfg_parser->cfg->logfile);
1180238106Sdes		cfg_parser->cfg->logfile = $2;
1181238106Sdes		cfg_parser->cfg->use_syslog = 0;
1182238106Sdes	}
1183238106Sdes	;
1184238106Sdesserver_pidfile: VAR_PIDFILE STRING_ARG
1185238106Sdes	{
1186238106Sdes		OUTYY(("P(server_pidfile:%s)\n", $2));
1187238106Sdes		free(cfg_parser->cfg->pidfile);
1188238106Sdes		cfg_parser->cfg->pidfile = $2;
1189238106Sdes	}
1190238106Sdes	;
1191238106Sdesserver_root_hints: VAR_ROOT_HINTS STRING_ARG
1192238106Sdes	{
1193238106Sdes		OUTYY(("P(server_root_hints:%s)\n", $2));
1194238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, $2))
1195238106Sdes			yyerror("out of memory");
1196238106Sdes	}
1197238106Sdes	;
1198238106Sdesserver_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG
1199238106Sdes	{
1200238106Sdes		OUTYY(("P(server_dlv_anchor_file:%s)\n", $2));
1201368129Scy		log_warn("option dlv-anchor-file ignored: DLV is decommissioned");
1202368129Scy		free($2);
1203238106Sdes	}
1204238106Sdes	;
1205238106Sdesserver_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG
1206238106Sdes	{
1207238106Sdes		OUTYY(("P(server_dlv_anchor:%s)\n", $2));
1208368129Scy		log_warn("option dlv-anchor ignored: DLV is decommissioned");
1209368129Scy		free($2);
1210238106Sdes	}
1211238106Sdes	;
1212238106Sdesserver_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG
1213238106Sdes	{
1214238106Sdes		OUTYY(("P(server_auto_trust_anchor_file:%s)\n", $2));
1215238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->
1216238106Sdes			auto_trust_anchor_file_list, $2))
1217238106Sdes			yyerror("out of memory");
1218238106Sdes	}
1219238106Sdes	;
1220238106Sdesserver_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG
1221238106Sdes	{
1222238106Sdes		OUTYY(("P(server_trust_anchor_file:%s)\n", $2));
1223238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->
1224238106Sdes			trust_anchor_file_list, $2))
1225238106Sdes			yyerror("out of memory");
1226238106Sdes	}
1227238106Sdes	;
1228238106Sdesserver_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG
1229238106Sdes	{
1230238106Sdes		OUTYY(("P(server_trusted_keys_file:%s)\n", $2));
1231238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->
1232238106Sdes			trusted_keys_file_list, $2))
1233238106Sdes			yyerror("out of memory");
1234238106Sdes	}
1235238106Sdes	;
1236238106Sdesserver_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG
1237238106Sdes	{
1238238106Sdes		OUTYY(("P(server_trust_anchor:%s)\n", $2));
1239238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, $2))
1240238106Sdes			yyerror("out of memory");
1241238106Sdes	}
1242238106Sdes	;
1243356345Scyserver_trust_anchor_signaling: VAR_TRUST_ANCHOR_SIGNALING STRING_ARG
1244356345Scy	{
1245356345Scy		OUTYY(("P(server_trust_anchor_signaling:%s)\n", $2));
1246356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1247356345Scy			yyerror("expected yes or no.");
1248356345Scy		else
1249356345Scy			cfg_parser->cfg->trust_anchor_signaling =
1250356345Scy				(strcmp($2, "yes")==0);
1251356345Scy		free($2);
1252356345Scy	}
1253356345Scy	;
1254356345Scyserver_root_key_sentinel: VAR_ROOT_KEY_SENTINEL STRING_ARG
1255356345Scy	{
1256356345Scy		OUTYY(("P(server_root_key_sentinel:%s)\n", $2));
1257356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1258356345Scy			yyerror("expected yes or no.");
1259356345Scy		else
1260356345Scy			cfg_parser->cfg->root_key_sentinel =
1261356345Scy				(strcmp($2, "yes")==0);
1262356345Scy		free($2);
1263356345Scy	}
1264356345Scy	;
1265238106Sdesserver_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG
1266238106Sdes	{
1267238106Sdes		OUTYY(("P(server_domain_insecure:%s)\n", $2));
1268238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, $2))
1269238106Sdes			yyerror("out of memory");
1270238106Sdes	}
1271238106Sdes	;
1272238106Sdesserver_hide_identity: VAR_HIDE_IDENTITY STRING_ARG
1273238106Sdes	{
1274238106Sdes		OUTYY(("P(server_hide_identity:%s)\n", $2));
1275238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1276238106Sdes			yyerror("expected yes or no.");
1277238106Sdes		else cfg_parser->cfg->hide_identity = (strcmp($2, "yes")==0);
1278238106Sdes		free($2);
1279238106Sdes	}
1280238106Sdes	;
1281238106Sdesserver_hide_version: VAR_HIDE_VERSION STRING_ARG
1282238106Sdes	{
1283238106Sdes		OUTYY(("P(server_hide_version:%s)\n", $2));
1284238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1285238106Sdes			yyerror("expected yes or no.");
1286238106Sdes		else cfg_parser->cfg->hide_version = (strcmp($2, "yes")==0);
1287238106Sdes		free($2);
1288238106Sdes	}
1289238106Sdes	;
1290356345Scyserver_hide_trustanchor: VAR_HIDE_TRUSTANCHOR STRING_ARG
1291356345Scy	{
1292356345Scy		OUTYY(("P(server_hide_trustanchor:%s)\n", $2));
1293356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1294356345Scy			yyerror("expected yes or no.");
1295356345Scy		else cfg_parser->cfg->hide_trustanchor = (strcmp($2, "yes")==0);
1296356345Scy		free($2);
1297356345Scy	}
1298356345Scy	;
1299238106Sdesserver_identity: VAR_IDENTITY STRING_ARG
1300238106Sdes	{
1301238106Sdes		OUTYY(("P(server_identity:%s)\n", $2));
1302238106Sdes		free(cfg_parser->cfg->identity);
1303238106Sdes		cfg_parser->cfg->identity = $2;
1304238106Sdes	}
1305238106Sdes	;
1306238106Sdesserver_version: VAR_VERSION STRING_ARG
1307238106Sdes	{
1308238106Sdes		OUTYY(("P(server_version:%s)\n", $2));
1309238106Sdes		free(cfg_parser->cfg->version);
1310238106Sdes		cfg_parser->cfg->version = $2;
1311238106Sdes	}
1312238106Sdes	;
1313369939Sgit2svnserver_nsid: VAR_NSID STRING_ARG
1314369939Sgit2svn	{
1315369939Sgit2svn		OUTYY(("P(server_nsid:%s)\n", $2));
1316369939Sgit2svn		free(cfg_parser->cfg->nsid_cfg_str);
1317369939Sgit2svn		cfg_parser->cfg->nsid_cfg_str = $2;
1318369939Sgit2svn		free(cfg_parser->cfg->nsid);
1319369939Sgit2svn		cfg_parser->cfg->nsid = NULL;
1320369939Sgit2svn		cfg_parser->cfg->nsid_len = 0;
1321369939Sgit2svn		if (*$2 == 0)
1322369939Sgit2svn			; /* pass; empty string is not setting nsid */
1323369939Sgit2svn		else if (!(cfg_parser->cfg->nsid = cfg_parse_nsid(
1324369939Sgit2svn					$2, &cfg_parser->cfg->nsid_len)))
1325369939Sgit2svn			yyerror("the NSID must be either a hex string or an "
1326369939Sgit2svn			    "ascii character string prepended with ascii_.");
1327369939Sgit2svn	}
1328369939Sgit2svn	;
1329238106Sdesserver_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG
1330238106Sdes	{
1331238106Sdes		OUTYY(("P(server_so_rcvbuf:%s)\n", $2));
1332238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_rcvbuf))
1333238106Sdes			yyerror("buffer size expected");
1334238106Sdes		free($2);
1335238106Sdes	}
1336238106Sdes	;
1337238106Sdesserver_so_sndbuf: VAR_SO_SNDBUF STRING_ARG
1338238106Sdes	{
1339238106Sdes		OUTYY(("P(server_so_sndbuf:%s)\n", $2));
1340238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_sndbuf))
1341238106Sdes			yyerror("buffer size expected");
1342238106Sdes		free($2);
1343238106Sdes	}
1344238106Sdes	;
1345266114Sdesserver_so_reuseport: VAR_SO_REUSEPORT STRING_ARG
1346266114Sdes    {
1347266114Sdes        OUTYY(("P(server_so_reuseport:%s)\n", $2));
1348266114Sdes        if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1349266114Sdes            yyerror("expected yes or no.");
1350266114Sdes        else cfg_parser->cfg->so_reuseport =
1351266114Sdes            (strcmp($2, "yes")==0);
1352266114Sdes        free($2);
1353266114Sdes    }
1354266114Sdes    ;
1355287917Sdesserver_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG
1356287917Sdes    {
1357287917Sdes        OUTYY(("P(server_ip_transparent:%s)\n", $2));
1358287917Sdes        if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1359287917Sdes            yyerror("expected yes or no.");
1360287917Sdes        else cfg_parser->cfg->ip_transparent =
1361287917Sdes            (strcmp($2, "yes")==0);
1362287917Sdes        free($2);
1363287917Sdes    }
1364287917Sdes    ;
1365307729Sdesserver_ip_freebind: VAR_IP_FREEBIND STRING_ARG
1366307729Sdes    {
1367307729Sdes        OUTYY(("P(server_ip_freebind:%s)\n", $2));
1368307729Sdes        if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1369307729Sdes            yyerror("expected yes or no.");
1370307729Sdes        else cfg_parser->cfg->ip_freebind =
1371307729Sdes            (strcmp($2, "yes")==0);
1372307729Sdes        free($2);
1373307729Sdes    }
1374307729Sdes    ;
1375366095Scyserver_ip_dscp: VAR_IP_DSCP STRING_ARG
1376366095Scy	{
1377366095Scy		OUTYY(("P(server_ip_dscp:%s)\n", $2));
1378366095Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1379366095Scy			yyerror("number expected");
1380366095Scy		else if (atoi($2) > 63)
1381366095Scy			yyerror("value too large (max 63)");
1382366095Scy		else if (atoi($2) < 0)
1383366095Scy			yyerror("value too small (min 0)");
1384366095Scy		else
1385366095Scy			cfg_parser->cfg->ip_dscp = atoi($2);
1386366095Scy		free($2);
1387366095Scy	}
1388366095Scy	;
1389356345Scyserver_stream_wait_size: VAR_STREAM_WAIT_SIZE STRING_ARG
1390356345Scy	{
1391356345Scy		OUTYY(("P(server_stream_wait_size:%s)\n", $2));
1392356345Scy		if(!cfg_parse_memsize($2, &cfg_parser->cfg->stream_wait_size))
1393356345Scy			yyerror("memory size expected");
1394356345Scy		free($2);
1395356345Scy	}
1396356345Scy	;
1397238106Sdesserver_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG
1398238106Sdes	{
1399238106Sdes		OUTYY(("P(server_edns_buffer_size:%s)\n", $2));
1400238106Sdes		if(atoi($2) == 0)
1401238106Sdes			yyerror("number expected");
1402238106Sdes		else if (atoi($2) < 12)
1403238106Sdes			yyerror("edns buffer size too small");
1404238106Sdes		else if (atoi($2) > 65535)
1405238106Sdes			cfg_parser->cfg->edns_buffer_size = 65535;
1406238106Sdes		else cfg_parser->cfg->edns_buffer_size = atoi($2);
1407238106Sdes		free($2);
1408238106Sdes	}
1409238106Sdes	;
1410238106Sdesserver_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG
1411238106Sdes	{
1412238106Sdes		OUTYY(("P(server_msg_buffer_size:%s)\n", $2));
1413238106Sdes		if(atoi($2) == 0)
1414238106Sdes			yyerror("number expected");
1415238106Sdes		else if (atoi($2) < 4096)
1416238106Sdes			yyerror("message buffer size too small (use 4096)");
1417238106Sdes		else cfg_parser->cfg->msg_buffer_size = atoi($2);
1418238106Sdes		free($2);
1419238106Sdes	}
1420238106Sdes	;
1421238106Sdesserver_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG
1422238106Sdes	{
1423238106Sdes		OUTYY(("P(server_msg_cache_size:%s)\n", $2));
1424238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->msg_cache_size))
1425238106Sdes			yyerror("memory size expected");
1426238106Sdes		free($2);
1427238106Sdes	}
1428238106Sdes	;
1429238106Sdesserver_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG
1430238106Sdes	{
1431238106Sdes		OUTYY(("P(server_msg_cache_slabs:%s)\n", $2));
1432238106Sdes		if(atoi($2) == 0)
1433238106Sdes			yyerror("number expected");
1434238106Sdes		else {
1435238106Sdes			cfg_parser->cfg->msg_cache_slabs = atoi($2);
1436238106Sdes			if(!is_pow2(cfg_parser->cfg->msg_cache_slabs))
1437238106Sdes				yyerror("must be a power of 2");
1438238106Sdes		}
1439238106Sdes		free($2);
1440238106Sdes	}
1441238106Sdes	;
1442238106Sdesserver_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG
1443238106Sdes	{
1444238106Sdes		OUTYY(("P(server_num_queries_per_thread:%s)\n", $2));
1445238106Sdes		if(atoi($2) == 0)
1446238106Sdes			yyerror("number expected");
1447238106Sdes		else cfg_parser->cfg->num_queries_per_thread = atoi($2);
1448238106Sdes		free($2);
1449238106Sdes	}
1450238106Sdes	;
1451238106Sdesserver_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG
1452238106Sdes	{
1453238106Sdes		OUTYY(("P(server_jostle_timeout:%s)\n", $2));
1454238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1455238106Sdes			yyerror("number expected");
1456238106Sdes		else cfg_parser->cfg->jostle_time = atoi($2);
1457238106Sdes		free($2);
1458238106Sdes	}
1459238106Sdes	;
1460266114Sdesserver_delay_close: VAR_DELAY_CLOSE STRING_ARG
1461266114Sdes	{
1462266114Sdes		OUTYY(("P(server_delay_close:%s)\n", $2));
1463266114Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1464266114Sdes			yyerror("number expected");
1465266114Sdes		else cfg_parser->cfg->delay_close = atoi($2);
1466266114Sdes		free($2);
1467266114Sdes	}
1468266114Sdes	;
1469368693Scyserver_udp_connect: VAR_UDP_CONNECT STRING_ARG
1470368693Scy	{
1471368693Scy		OUTYY(("P(server_udp_connect:%s)\n", $2));
1472368693Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1473368693Scy			yyerror("expected yes or no.");
1474368693Scy		else cfg_parser->cfg->udp_connect = (strcmp($2, "yes")==0);
1475368693Scy		free($2);
1476368693Scy	}
1477368693Scy	;
1478268839Sdesserver_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG
1479268839Sdes	{
1480268839Sdes		OUTYY(("P(server_unblock_lan_zones:%s)\n", $2));
1481268839Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1482268839Sdes			yyerror("expected yes or no.");
1483268839Sdes		else cfg_parser->cfg->unblock_lan_zones =
1484268839Sdes			(strcmp($2, "yes")==0);
1485268839Sdes		free($2);
1486268839Sdes	}
1487268839Sdes	;
1488295535Sdesserver_insecure_lan_zones: VAR_INSECURE_LAN_ZONES STRING_ARG
1489295535Sdes	{
1490295535Sdes		OUTYY(("P(server_insecure_lan_zones:%s)\n", $2));
1491295535Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1492295535Sdes			yyerror("expected yes or no.");
1493295535Sdes		else cfg_parser->cfg->insecure_lan_zones =
1494295535Sdes			(strcmp($2, "yes")==0);
1495295535Sdes		free($2);
1496295535Sdes	}
1497295535Sdes	;
1498238106Sdesserver_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG
1499238106Sdes	{
1500238106Sdes		OUTYY(("P(server_rrset_cache_size:%s)\n", $2));
1501238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->rrset_cache_size))
1502238106Sdes			yyerror("memory size expected");
1503238106Sdes		free($2);
1504238106Sdes	}
1505238106Sdes	;
1506238106Sdesserver_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG
1507238106Sdes	{
1508238106Sdes		OUTYY(("P(server_rrset_cache_slabs:%s)\n", $2));
1509238106Sdes		if(atoi($2) == 0)
1510238106Sdes			yyerror("number expected");
1511238106Sdes		else {
1512238106Sdes			cfg_parser->cfg->rrset_cache_slabs = atoi($2);
1513238106Sdes			if(!is_pow2(cfg_parser->cfg->rrset_cache_slabs))
1514238106Sdes				yyerror("must be a power of 2");
1515238106Sdes		}
1516238106Sdes		free($2);
1517238106Sdes	}
1518238106Sdes	;
1519238106Sdesserver_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG
1520238106Sdes	{
1521238106Sdes		OUTYY(("P(server_infra_host_ttl:%s)\n", $2));
1522238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1523238106Sdes			yyerror("number expected");
1524238106Sdes		else cfg_parser->cfg->host_ttl = atoi($2);
1525238106Sdes		free($2);
1526238106Sdes	}
1527238106Sdes	;
1528238106Sdesserver_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG
1529238106Sdes	{
1530238106Sdes		OUTYY(("P(server_infra_lame_ttl:%s)\n", $2));
1531238106Sdes		verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option "
1532238106Sdes			"removed, use infra-host-ttl)", $2);
1533238106Sdes		free($2);
1534238106Sdes	}
1535238106Sdes	;
1536238106Sdesserver_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG
1537238106Sdes	{
1538238106Sdes		OUTYY(("P(server_infra_cache_numhosts:%s)\n", $2));
1539238106Sdes		if(atoi($2) == 0)
1540238106Sdes			yyerror("number expected");
1541238106Sdes		else cfg_parser->cfg->infra_cache_numhosts = atoi($2);
1542238106Sdes		free($2);
1543238106Sdes	}
1544238106Sdes	;
1545238106Sdesserver_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG
1546238106Sdes	{
1547238106Sdes		OUTYY(("P(server_infra_cache_lame_size:%s)\n", $2));
1548238106Sdes		verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s "
1549238106Sdes			"(option removed, use infra-cache-numhosts)", $2);
1550238106Sdes		free($2);
1551238106Sdes	}
1552238106Sdes	;
1553238106Sdesserver_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG
1554238106Sdes	{
1555238106Sdes		OUTYY(("P(server_infra_cache_slabs:%s)\n", $2));
1556238106Sdes		if(atoi($2) == 0)
1557238106Sdes			yyerror("number expected");
1558238106Sdes		else {
1559238106Sdes			cfg_parser->cfg->infra_cache_slabs = atoi($2);
1560238106Sdes			if(!is_pow2(cfg_parser->cfg->infra_cache_slabs))
1561238106Sdes				yyerror("must be a power of 2");
1562238106Sdes		}
1563238106Sdes		free($2);
1564238106Sdes	}
1565238106Sdes	;
1566282089Sdesserver_infra_cache_min_rtt: VAR_INFRA_CACHE_MIN_RTT STRING_ARG
1567282089Sdes	{
1568282089Sdes		OUTYY(("P(server_infra_cache_min_rtt:%s)\n", $2));
1569282089Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1570282089Sdes			yyerror("number expected");
1571282089Sdes		else cfg_parser->cfg->infra_cache_min_rtt = atoi($2);
1572282089Sdes		free($2);
1573282089Sdes	}
1574282089Sdes	;
1575368693Scyserver_infra_keep_probing: VAR_INFRA_KEEP_PROBING STRING_ARG
1576368693Scy	{
1577368693Scy		OUTYY(("P(server_infra_keep_probing:%s)\n", $2));
1578368693Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1579368693Scy			yyerror("expected yes or no.");
1580368693Scy		else cfg_parser->cfg->infra_keep_probing =
1581368693Scy			(strcmp($2, "yes")==0);
1582368693Scy		free($2);
1583368693Scy	}
1584368693Scy	;
1585238106Sdesserver_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG
1586238106Sdes	{
1587238106Sdes		OUTYY(("P(server_target_fetch_policy:%s)\n", $2));
1588238106Sdes		free(cfg_parser->cfg->target_fetch_policy);
1589238106Sdes		cfg_parser->cfg->target_fetch_policy = $2;
1590238106Sdes	}
1591238106Sdes	;
1592238106Sdesserver_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG
1593238106Sdes	{
1594238106Sdes		OUTYY(("P(server_harden_short_bufsize:%s)\n", $2));
1595238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1596238106Sdes			yyerror("expected yes or no.");
1597238106Sdes		else cfg_parser->cfg->harden_short_bufsize =
1598238106Sdes			(strcmp($2, "yes")==0);
1599238106Sdes		free($2);
1600238106Sdes	}
1601238106Sdes	;
1602238106Sdesserver_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG
1603238106Sdes	{
1604238106Sdes		OUTYY(("P(server_harden_large_queries:%s)\n", $2));
1605238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1606238106Sdes			yyerror("expected yes or no.");
1607238106Sdes		else cfg_parser->cfg->harden_large_queries =
1608238106Sdes			(strcmp($2, "yes")==0);
1609238106Sdes		free($2);
1610238106Sdes	}
1611238106Sdes	;
1612238106Sdesserver_harden_glue: VAR_HARDEN_GLUE STRING_ARG
1613238106Sdes	{
1614238106Sdes		OUTYY(("P(server_harden_glue:%s)\n", $2));
1615238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1616238106Sdes			yyerror("expected yes or no.");
1617238106Sdes		else cfg_parser->cfg->harden_glue =
1618238106Sdes			(strcmp($2, "yes")==0);
1619238106Sdes		free($2);
1620238106Sdes	}
1621238106Sdes	;
1622238106Sdesserver_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG
1623238106Sdes	{
1624238106Sdes		OUTYY(("P(server_harden_dnssec_stripped:%s)\n", $2));
1625238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1626238106Sdes			yyerror("expected yes or no.");
1627238106Sdes		else cfg_parser->cfg->harden_dnssec_stripped =
1628238106Sdes			(strcmp($2, "yes")==0);
1629238106Sdes		free($2);
1630238106Sdes	}
1631238106Sdes	;
1632238106Sdesserver_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG
1633238106Sdes	{
1634238106Sdes		OUTYY(("P(server_harden_below_nxdomain:%s)\n", $2));
1635238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1636238106Sdes			yyerror("expected yes or no.");
1637238106Sdes		else cfg_parser->cfg->harden_below_nxdomain =
1638238106Sdes			(strcmp($2, "yes")==0);
1639238106Sdes		free($2);
1640238106Sdes	}
1641238106Sdes	;
1642238106Sdesserver_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG
1643238106Sdes	{
1644238106Sdes		OUTYY(("P(server_harden_referral_path:%s)\n", $2));
1645238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1646238106Sdes			yyerror("expected yes or no.");
1647238106Sdes		else cfg_parser->cfg->harden_referral_path =
1648238106Sdes			(strcmp($2, "yes")==0);
1649238106Sdes		free($2);
1650238106Sdes	}
1651238106Sdes	;
1652287917Sdesserver_harden_algo_downgrade: VAR_HARDEN_ALGO_DOWNGRADE STRING_ARG
1653287917Sdes	{
1654287917Sdes		OUTYY(("P(server_harden_algo_downgrade:%s)\n", $2));
1655287917Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1656287917Sdes			yyerror("expected yes or no.");
1657287917Sdes		else cfg_parser->cfg->harden_algo_downgrade =
1658287917Sdes			(strcmp($2, "yes")==0);
1659287917Sdes		free($2);
1660287917Sdes	}
1661287917Sdes	;
1662238106Sdesserver_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG
1663238106Sdes	{
1664238106Sdes		OUTYY(("P(server_use_caps_for_id:%s)\n", $2));
1665238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1666238106Sdes			yyerror("expected yes or no.");
1667238106Sdes		else cfg_parser->cfg->use_caps_bits_for_id =
1668238106Sdes			(strcmp($2, "yes")==0);
1669238106Sdes		free($2);
1670238106Sdes	}
1671238106Sdes	;
1672287917Sdesserver_caps_whitelist: VAR_CAPS_WHITELIST STRING_ARG
1673287917Sdes	{
1674287917Sdes		OUTYY(("P(server_caps_whitelist:%s)\n", $2));
1675287917Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, $2))
1676287917Sdes			yyerror("out of memory");
1677287917Sdes	}
1678287917Sdes	;
1679238106Sdesserver_private_address: VAR_PRIVATE_ADDRESS STRING_ARG
1680238106Sdes	{
1681238106Sdes		OUTYY(("P(server_private_address:%s)\n", $2));
1682238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, $2))
1683238106Sdes			yyerror("out of memory");
1684238106Sdes	}
1685238106Sdes	;
1686238106Sdesserver_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG
1687238106Sdes	{
1688238106Sdes		OUTYY(("P(server_private_domain:%s)\n", $2));
1689238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, $2))
1690238106Sdes			yyerror("out of memory");
1691238106Sdes	}
1692238106Sdes	;
1693238106Sdesserver_prefetch: VAR_PREFETCH STRING_ARG
1694238106Sdes	{
1695238106Sdes		OUTYY(("P(server_prefetch:%s)\n", $2));
1696238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1697238106Sdes			yyerror("expected yes or no.");
1698238106Sdes		else cfg_parser->cfg->prefetch = (strcmp($2, "yes")==0);
1699238106Sdes		free($2);
1700238106Sdes	}
1701238106Sdes	;
1702238106Sdesserver_prefetch_key: VAR_PREFETCH_KEY STRING_ARG
1703238106Sdes	{
1704238106Sdes		OUTYY(("P(server_prefetch_key:%s)\n", $2));
1705238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1706238106Sdes			yyerror("expected yes or no.");
1707238106Sdes		else cfg_parser->cfg->prefetch_key = (strcmp($2, "yes")==0);
1708238106Sdes		free($2);
1709238106Sdes	}
1710238106Sdes	;
1711356345Scyserver_deny_any: VAR_DENY_ANY STRING_ARG
1712356345Scy	{
1713356345Scy		OUTYY(("P(server_deny_any:%s)\n", $2));
1714356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1715356345Scy			yyerror("expected yes or no.");
1716356345Scy		else cfg_parser->cfg->deny_any = (strcmp($2, "yes")==0);
1717356345Scy		free($2);
1718356345Scy	}
1719356345Scy	;
1720238106Sdesserver_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG
1721238106Sdes	{
1722238106Sdes		OUTYY(("P(server_unwanted_reply_threshold:%s)\n", $2));
1723238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1724238106Sdes			yyerror("number expected");
1725238106Sdes		else cfg_parser->cfg->unwanted_threshold = atoi($2);
1726238106Sdes		free($2);
1727238106Sdes	}
1728238106Sdes	;
1729238106Sdesserver_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG
1730238106Sdes	{
1731238106Sdes		OUTYY(("P(server_do_not_query_address:%s)\n", $2));
1732238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, $2))
1733238106Sdes			yyerror("out of memory");
1734238106Sdes	}
1735238106Sdes	;
1736238106Sdesserver_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG
1737238106Sdes	{
1738238106Sdes		OUTYY(("P(server_do_not_query_localhost:%s)\n", $2));
1739238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1740238106Sdes			yyerror("expected yes or no.");
1741238106Sdes		else cfg_parser->cfg->donotquery_localhost =
1742238106Sdes			(strcmp($2, "yes")==0);
1743238106Sdes		free($2);
1744238106Sdes	}
1745238106Sdes	;
1746238106Sdesserver_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG
1747238106Sdes	{
1748238106Sdes		OUTYY(("P(server_access_control:%s %s)\n", $2, $3));
1749238106Sdes		if(strcmp($3, "deny")!=0 && strcmp($3, "refuse")!=0 &&
1750266114Sdes			strcmp($3, "deny_non_local")!=0 &&
1751266114Sdes			strcmp($3, "refuse_non_local")!=0 &&
1752356345Scy			strcmp($3, "allow_setrd")!=0 &&
1753238106Sdes			strcmp($3, "allow")!=0 &&
1754238106Sdes			strcmp($3, "allow_snoop")!=0) {
1755266114Sdes			yyerror("expected deny, refuse, deny_non_local, "
1756356345Scy				"refuse_non_local, allow, allow_setrd or "
1757356345Scy				"allow_snoop in access control action");
1758356345Scy			free($2);
1759356345Scy			free($3);
1760238106Sdes		} else {
1761238106Sdes			if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3))
1762238106Sdes				fatal_exit("out of memory adding acl");
1763238106Sdes		}
1764238106Sdes	}
1765238106Sdes	;
1766238106Sdesserver_module_conf: VAR_MODULE_CONF STRING_ARG
1767238106Sdes	{
1768238106Sdes		OUTYY(("P(server_module_conf:%s)\n", $2));
1769238106Sdes		free(cfg_parser->cfg->module_conf);
1770238106Sdes		cfg_parser->cfg->module_conf = $2;
1771238106Sdes	}
1772238106Sdes	;
1773238106Sdesserver_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG
1774238106Sdes	{
1775238106Sdes		OUTYY(("P(server_val_override_date:%s)\n", $2));
1776296415Sdes		if(*$2 == '\0' || strcmp($2, "0") == 0) {
1777238106Sdes			cfg_parser->cfg->val_date_override = 0;
1778238106Sdes		} else if(strlen($2) == 14) {
1779238106Sdes			cfg_parser->cfg->val_date_override =
1780238106Sdes				cfg_convert_timeval($2);
1781238106Sdes			if(!cfg_parser->cfg->val_date_override)
1782238106Sdes				yyerror("bad date/time specification");
1783238106Sdes		} else {
1784238106Sdes			if(atoi($2) == 0)
1785238106Sdes				yyerror("number expected");
1786238106Sdes			cfg_parser->cfg->val_date_override = atoi($2);
1787238106Sdes		}
1788238106Sdes		free($2);
1789238106Sdes	}
1790238106Sdes	;
1791238106Sdesserver_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG
1792238106Sdes	{
1793238106Sdes		OUTYY(("P(server_val_sig_skew_min:%s)\n", $2));
1794296415Sdes		if(*$2 == '\0' || strcmp($2, "0") == 0) {
1795238106Sdes			cfg_parser->cfg->val_sig_skew_min = 0;
1796238106Sdes		} else {
1797238106Sdes			cfg_parser->cfg->val_sig_skew_min = atoi($2);
1798238106Sdes			if(!cfg_parser->cfg->val_sig_skew_min)
1799238106Sdes				yyerror("number expected");
1800238106Sdes		}
1801238106Sdes		free($2);
1802238106Sdes	}
1803238106Sdes	;
1804238106Sdesserver_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG
1805238106Sdes	{
1806238106Sdes		OUTYY(("P(server_val_sig_skew_max:%s)\n", $2));
1807296415Sdes		if(*$2 == '\0' || strcmp($2, "0") == 0) {
1808238106Sdes			cfg_parser->cfg->val_sig_skew_max = 0;
1809238106Sdes		} else {
1810238106Sdes			cfg_parser->cfg->val_sig_skew_max = atoi($2);
1811238106Sdes			if(!cfg_parser->cfg->val_sig_skew_max)
1812238106Sdes				yyerror("number expected");
1813238106Sdes		}
1814238106Sdes		free($2);
1815238106Sdes	}
1816238106Sdes	;
1817238106Sdesserver_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG
1818238106Sdes	{
1819238106Sdes		OUTYY(("P(server_cache_max_ttl:%s)\n", $2));
1820238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1821238106Sdes			yyerror("number expected");
1822238106Sdes		else cfg_parser->cfg->max_ttl = atoi($2);
1823238106Sdes		free($2);
1824238106Sdes	}
1825238106Sdes	;
1826287917Sdesserver_cache_max_negative_ttl: VAR_CACHE_MAX_NEGATIVE_TTL STRING_ARG
1827287917Sdes	{
1828287917Sdes		OUTYY(("P(server_cache_max_negative_ttl:%s)\n", $2));
1829287917Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1830287917Sdes			yyerror("number expected");
1831287917Sdes		else cfg_parser->cfg->max_negative_ttl = atoi($2);
1832287917Sdes		free($2);
1833287917Sdes	}
1834287917Sdes	;
1835238106Sdesserver_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG
1836238106Sdes	{
1837238106Sdes		OUTYY(("P(server_cache_min_ttl:%s)\n", $2));
1838238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1839238106Sdes			yyerror("number expected");
1840238106Sdes		else cfg_parser->cfg->min_ttl = atoi($2);
1841238106Sdes		free($2);
1842238106Sdes	}
1843238106Sdes	;
1844238106Sdesserver_bogus_ttl: VAR_BOGUS_TTL STRING_ARG
1845238106Sdes	{
1846238106Sdes		OUTYY(("P(server_bogus_ttl:%s)\n", $2));
1847238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1848238106Sdes			yyerror("number expected");
1849238106Sdes		else cfg_parser->cfg->bogus_ttl = atoi($2);
1850238106Sdes		free($2);
1851238106Sdes	}
1852238106Sdes	;
1853238106Sdesserver_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG
1854238106Sdes	{
1855238106Sdes		OUTYY(("P(server_val_clean_additional:%s)\n", $2));
1856238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1857238106Sdes			yyerror("expected yes or no.");
1858238106Sdes		else cfg_parser->cfg->val_clean_additional =
1859238106Sdes			(strcmp($2, "yes")==0);
1860238106Sdes		free($2);
1861238106Sdes	}
1862238106Sdes	;
1863238106Sdesserver_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG
1864238106Sdes	{
1865238106Sdes		OUTYY(("P(server_val_permissive_mode:%s)\n", $2));
1866238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1867238106Sdes			yyerror("expected yes or no.");
1868238106Sdes		else cfg_parser->cfg->val_permissive_mode =
1869238106Sdes			(strcmp($2, "yes")==0);
1870238106Sdes		free($2);
1871238106Sdes	}
1872238106Sdes	;
1873356345Scyserver_aggressive_nsec: VAR_AGGRESSIVE_NSEC STRING_ARG
1874356345Scy	{
1875356345Scy		OUTYY(("P(server_aggressive_nsec:%s)\n", $2));
1876356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1877356345Scy			yyerror("expected yes or no.");
1878356345Scy		else
1879356345Scy			cfg_parser->cfg->aggressive_nsec =
1880356345Scy				(strcmp($2, "yes")==0);
1881356345Scy		free($2);
1882356345Scy	}
1883356345Scy	;
1884238106Sdesserver_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG
1885238106Sdes	{
1886238106Sdes		OUTYY(("P(server_ignore_cd_flag:%s)\n", $2));
1887238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1888238106Sdes			yyerror("expected yes or no.");
1889238106Sdes		else cfg_parser->cfg->ignore_cd = (strcmp($2, "yes")==0);
1890238106Sdes		free($2);
1891238106Sdes	}
1892238106Sdes	;
1893356345Scyserver_serve_expired: VAR_SERVE_EXPIRED STRING_ARG
1894356345Scy	{
1895356345Scy		OUTYY(("P(server_serve_expired:%s)\n", $2));
1896356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1897356345Scy			yyerror("expected yes or no.");
1898356345Scy		else cfg_parser->cfg->serve_expired = (strcmp($2, "yes")==0);
1899356345Scy		free($2);
1900356345Scy	}
1901356345Scy	;
1902356345Scyserver_serve_expired_ttl: VAR_SERVE_EXPIRED_TTL STRING_ARG
1903356345Scy	{
1904356345Scy		OUTYY(("P(server_serve_expired_ttl:%s)\n", $2));
1905356345Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1906356345Scy			yyerror("number expected");
1907356345Scy		else cfg_parser->cfg->serve_expired_ttl = atoi($2);
1908356345Scy		free($2);
1909356345Scy	}
1910356345Scy	;
1911356345Scyserver_serve_expired_ttl_reset: VAR_SERVE_EXPIRED_TTL_RESET STRING_ARG
1912356345Scy	{
1913356345Scy		OUTYY(("P(server_serve_expired_ttl_reset:%s)\n", $2));
1914356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1915356345Scy			yyerror("expected yes or no.");
1916356345Scy		else cfg_parser->cfg->serve_expired_ttl_reset = (strcmp($2, "yes")==0);
1917356345Scy		free($2);
1918356345Scy	}
1919356345Scy	;
1920361435Scyserver_serve_expired_reply_ttl: VAR_SERVE_EXPIRED_REPLY_TTL STRING_ARG
1921361435Scy	{
1922361435Scy		OUTYY(("P(server_serve_expired_reply_ttl:%s)\n", $2));
1923361435Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1924361435Scy			yyerror("number expected");
1925361435Scy		else cfg_parser->cfg->serve_expired_reply_ttl = atoi($2);
1926361435Scy		free($2);
1927361435Scy	}
1928361435Scy	;
1929361435Scyserver_serve_expired_client_timeout: VAR_SERVE_EXPIRED_CLIENT_TIMEOUT STRING_ARG
1930361435Scy	{
1931361435Scy		OUTYY(("P(server_serve_expired_client_timeout:%s)\n", $2));
1932361435Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1933361435Scy			yyerror("number expected");
1934361435Scy		else cfg_parser->cfg->serve_expired_client_timeout = atoi($2);
1935361435Scy		free($2);
1936361435Scy	}
1937361435Scy	;
1938369939Sgit2svnserver_serve_original_ttl: VAR_SERVE_ORIGINAL_TTL STRING_ARG
1939369939Sgit2svn	{
1940369939Sgit2svn		OUTYY(("P(server_serve_original_ttl:%s)\n", $2));
1941369939Sgit2svn		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1942369939Sgit2svn			yyerror("expected yes or no.");
1943369939Sgit2svn		else cfg_parser->cfg->serve_original_ttl = (strcmp($2, "yes")==0);
1944369939Sgit2svn		free($2);
1945369939Sgit2svn	}
1946369939Sgit2svn	;
1947356345Scyserver_fake_dsa: VAR_FAKE_DSA STRING_ARG
1948356345Scy	{
1949356345Scy		OUTYY(("P(server_fake_dsa:%s)\n", $2));
1950356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1951356345Scy			yyerror("expected yes or no.");
1952361435Scy#if defined(HAVE_SSL) || defined(HAVE_NETTLE)
1953356345Scy		else fake_dsa = (strcmp($2, "yes")==0);
1954356345Scy		if(fake_dsa)
1955356345Scy			log_warn("test option fake_dsa is enabled");
1956356345Scy#endif
1957356345Scy		free($2);
1958356345Scy	}
1959356345Scy	;
1960356345Scyserver_fake_sha1: VAR_FAKE_SHA1 STRING_ARG
1961356345Scy	{
1962356345Scy		OUTYY(("P(server_fake_sha1:%s)\n", $2));
1963356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1964356345Scy			yyerror("expected yes or no.");
1965361435Scy#if defined(HAVE_SSL) || defined(HAVE_NETTLE)
1966356345Scy		else fake_sha1 = (strcmp($2, "yes")==0);
1967356345Scy		if(fake_sha1)
1968356345Scy			log_warn("test option fake_sha1 is enabled");
1969356345Scy#endif
1970356345Scy		free($2);
1971356345Scy	}
1972356345Scy	;
1973238106Sdesserver_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG
1974238106Sdes	{
1975238106Sdes		OUTYY(("P(server_val_log_level:%s)\n", $2));
1976238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1977238106Sdes			yyerror("number expected");
1978238106Sdes		else cfg_parser->cfg->val_log_level = atoi($2);
1979238106Sdes		free($2);
1980238106Sdes	}
1981238106Sdes	;
1982238106Sdesserver_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG
1983238106Sdes	{
1984238106Sdes		OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", $2));
1985238106Sdes		free(cfg_parser->cfg->val_nsec3_key_iterations);
1986238106Sdes		cfg_parser->cfg->val_nsec3_key_iterations = $2;
1987238106Sdes	}
1988238106Sdes	;
1989238106Sdesserver_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG
1990238106Sdes	{
1991238106Sdes		OUTYY(("P(server_add_holddown:%s)\n", $2));
1992238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1993238106Sdes			yyerror("number expected");
1994238106Sdes		else cfg_parser->cfg->add_holddown = atoi($2);
1995238106Sdes		free($2);
1996238106Sdes	}
1997238106Sdes	;
1998238106Sdesserver_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG
1999238106Sdes	{
2000238106Sdes		OUTYY(("P(server_del_holddown:%s)\n", $2));
2001238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2002238106Sdes			yyerror("number expected");
2003238106Sdes		else cfg_parser->cfg->del_holddown = atoi($2);
2004238106Sdes		free($2);
2005238106Sdes	}
2006238106Sdes	;
2007238106Sdesserver_keep_missing: VAR_KEEP_MISSING STRING_ARG
2008238106Sdes	{
2009238106Sdes		OUTYY(("P(server_keep_missing:%s)\n", $2));
2010238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2011238106Sdes			yyerror("number expected");
2012238106Sdes		else cfg_parser->cfg->keep_missing = atoi($2);
2013238106Sdes		free($2);
2014238106Sdes	}
2015238106Sdes	;
2016289063Sdesserver_permit_small_holddown: VAR_PERMIT_SMALL_HOLDDOWN STRING_ARG
2017289063Sdes	{
2018289063Sdes		OUTYY(("P(server_permit_small_holddown:%s)\n", $2));
2019289063Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2020289063Sdes			yyerror("expected yes or no.");
2021289063Sdes		else cfg_parser->cfg->permit_small_holddown =
2022289063Sdes			(strcmp($2, "yes")==0);
2023289063Sdes		free($2);
2024289063Sdes	}
2025238106Sdesserver_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG
2026238106Sdes	{
2027238106Sdes		OUTYY(("P(server_key_cache_size:%s)\n", $2));
2028238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->key_cache_size))
2029238106Sdes			yyerror("memory size expected");
2030238106Sdes		free($2);
2031238106Sdes	}
2032238106Sdes	;
2033238106Sdesserver_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG
2034238106Sdes	{
2035238106Sdes		OUTYY(("P(server_key_cache_slabs:%s)\n", $2));
2036238106Sdes		if(atoi($2) == 0)
2037238106Sdes			yyerror("number expected");
2038238106Sdes		else {
2039238106Sdes			cfg_parser->cfg->key_cache_slabs = atoi($2);
2040238106Sdes			if(!is_pow2(cfg_parser->cfg->key_cache_slabs))
2041238106Sdes				yyerror("must be a power of 2");
2042238106Sdes		}
2043238106Sdes		free($2);
2044238106Sdes	}
2045238106Sdes	;
2046238106Sdesserver_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG
2047238106Sdes	{
2048238106Sdes		OUTYY(("P(server_neg_cache_size:%s)\n", $2));
2049238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->neg_cache_size))
2050238106Sdes			yyerror("memory size expected");
2051238106Sdes		free($2);
2052238106Sdes	}
2053238106Sdes	;
2054238106Sdesserver_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
2055238106Sdes	{
2056238106Sdes		OUTYY(("P(server_local_zone:%s %s)\n", $2, $3));
2057238106Sdes		if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 &&
2058238106Sdes		   strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 &&
2059238106Sdes		   strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0
2060307729Sdes		   && strcmp($3, "typetransparent")!=0
2061307729Sdes		   && strcmp($3, "always_transparent")!=0
2062307729Sdes		   && strcmp($3, "always_refuse")!=0
2063307729Sdes		   && strcmp($3, "always_nxdomain")!=0
2064369939Sgit2svn		   && strcmp($3, "always_nodata")!=0
2065369939Sgit2svn		   && strcmp($3, "always_deny")!=0
2066369939Sgit2svn		   && strcmp($3, "always_null")!=0
2067356345Scy		   && strcmp($3, "noview")!=0
2068356345Scy		   && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0
2069356345Scy		   && strcmp($3, "inform_redirect") != 0
2070356345Scy			 && strcmp($3, "ipset") != 0) {
2071238106Sdes			yyerror("local-zone type: expected static, deny, "
2072238106Sdes				"refuse, redirect, transparent, "
2073307729Sdes				"typetransparent, inform, inform_deny, "
2074356345Scy				"inform_redirect, always_transparent, "
2075369939Sgit2svn				"always_refuse, always_nxdomain, "
2076369939Sgit2svn				"always_nodata, always_deny, always_null, "
2077369939Sgit2svn				"noview, nodefault or ipset");
2078356345Scy			free($2);
2079356345Scy			free($3);
2080356345Scy		} else if(strcmp($3, "nodefault")==0) {
2081238106Sdes			if(!cfg_strlist_insert(&cfg_parser->cfg->
2082238106Sdes				local_zones_nodefault, $2))
2083238106Sdes				fatal_exit("out of memory adding local-zone");
2084238106Sdes			free($3);
2085356345Scy#ifdef USE_IPSET
2086356345Scy		} else if(strcmp($3, "ipset")==0) {
2087356345Scy			if(!cfg_strlist_insert(&cfg_parser->cfg->
2088356345Scy				local_zones_ipset, $2))
2089356345Scy				fatal_exit("out of memory adding local-zone");
2090356345Scy			free($3);
2091356345Scy#endif
2092238106Sdes		} else {
2093238106Sdes			if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones,
2094238106Sdes				$2, $3))
2095238106Sdes				fatal_exit("out of memory adding local-zone");
2096238106Sdes		}
2097238106Sdes	}
2098238106Sdes	;
2099238106Sdesserver_local_data: VAR_LOCAL_DATA STRING_ARG
2100238106Sdes	{
2101238106Sdes		OUTYY(("P(server_local_data:%s)\n", $2));
2102238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, $2))
2103238106Sdes			fatal_exit("out of memory adding local-data");
2104238106Sdes	}
2105238106Sdes	;
2106238106Sdesserver_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG
2107238106Sdes	{
2108238106Sdes		char* ptr;
2109238106Sdes		OUTYY(("P(server_local_data_ptr:%s)\n", $2));
2110238106Sdes		ptr = cfg_ptr_reverse($2);
2111238106Sdes		free($2);
2112238106Sdes		if(ptr) {
2113238106Sdes			if(!cfg_strlist_insert(&cfg_parser->cfg->
2114238106Sdes				local_data, ptr))
2115238106Sdes				fatal_exit("out of memory adding local-data");
2116238106Sdes		} else {
2117238106Sdes			yyerror("local-data-ptr could not be reversed");
2118238106Sdes		}
2119238106Sdes	}
2120238106Sdes	;
2121238106Sdesserver_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG
2122238106Sdes	{
2123238106Sdes		OUTYY(("P(server_minimal_responses:%s)\n", $2));
2124238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2125238106Sdes			yyerror("expected yes or no.");
2126238106Sdes		else cfg_parser->cfg->minimal_responses =
2127238106Sdes			(strcmp($2, "yes")==0);
2128238106Sdes		free($2);
2129238106Sdes	}
2130238106Sdes	;
2131238106Sdesserver_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG
2132238106Sdes	{
2133238106Sdes		OUTYY(("P(server_rrset_roundrobin:%s)\n", $2));
2134238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2135238106Sdes			yyerror("expected yes or no.");
2136238106Sdes		else cfg_parser->cfg->rrset_roundrobin =
2137238106Sdes			(strcmp($2, "yes")==0);
2138238106Sdes		free($2);
2139238106Sdes	}
2140238106Sdes	;
2141356345Scyserver_unknown_server_time_limit: VAR_UNKNOWN_SERVER_TIME_LIMIT STRING_ARG
2142356345Scy	{
2143356345Scy		OUTYY(("P(server_unknown_server_time_limit:%s)\n", $2));
2144356345Scy		cfg_parser->cfg->unknown_server_time_limit = atoi($2);
2145356345Scy		free($2);
2146356345Scy	}
2147356345Scy	;
2148266114Sdesserver_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG
2149266114Sdes	{
2150266114Sdes		OUTYY(("P(server_max_udp_size:%s)\n", $2));
2151266114Sdes		cfg_parser->cfg->max_udp_size = atoi($2);
2152266114Sdes		free($2);
2153266114Sdes	}
2154266114Sdes	;
2155276605Sdesserver_dns64_prefix: VAR_DNS64_PREFIX STRING_ARG
2156276605Sdes	{
2157276605Sdes		OUTYY(("P(dns64_prefix:%s)\n", $2));
2158276605Sdes		free(cfg_parser->cfg->dns64_prefix);
2159276605Sdes		cfg_parser->cfg->dns64_prefix = $2;
2160276605Sdes	}
2161276605Sdes	;
2162276605Sdesserver_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG
2163276605Sdes	{
2164276605Sdes		OUTYY(("P(server_dns64_synthall:%s)\n", $2));
2165276605Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2166276605Sdes			yyerror("expected yes or no.");
2167276605Sdes		else cfg_parser->cfg->dns64_synthall = (strcmp($2, "yes")==0);
2168276605Sdes		free($2);
2169276605Sdes	}
2170276605Sdes	;
2171356345Scyserver_dns64_ignore_aaaa: VAR_DNS64_IGNORE_AAAA STRING_ARG
2172356345Scy	{
2173356345Scy		OUTYY(("P(dns64_ignore_aaaa:%s)\n", $2));
2174356345Scy		if(!cfg_strlist_insert(&cfg_parser->cfg->dns64_ignore_aaaa,
2175356345Scy			$2))
2176356345Scy			fatal_exit("out of memory adding dns64-ignore-aaaa");
2177356345Scy	}
2178356345Scy	;
2179307729Sdesserver_define_tag: VAR_DEFINE_TAG STRING_ARG
2180307729Sdes	{
2181307729Sdes		char* p, *s = $2;
2182307729Sdes		OUTYY(("P(server_define_tag:%s)\n", $2));
2183307729Sdes		while((p=strsep(&s, " \t\n")) != NULL) {
2184307729Sdes			if(*p) {
2185307729Sdes				if(!config_add_tag(cfg_parser->cfg, p))
2186307729Sdes					yyerror("could not define-tag, "
2187307729Sdes						"out of memory");
2188307729Sdes			}
2189307729Sdes		}
2190307729Sdes		free($2);
2191307729Sdes	}
2192307729Sdes	;
2193307729Sdesserver_local_zone_tag: VAR_LOCAL_ZONE_TAG STRING_ARG STRING_ARG
2194307729Sdes	{
2195307729Sdes		size_t len = 0;
2196307729Sdes		uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
2197307729Sdes			&len);
2198307729Sdes		free($3);
2199307729Sdes		OUTYY(("P(server_local_zone_tag:%s)\n", $2));
2200356345Scy		if(!bitlist) {
2201307729Sdes			yyerror("could not parse tags, (define-tag them first)");
2202356345Scy			free($2);
2203356345Scy		}
2204307729Sdes		if(bitlist) {
2205307729Sdes			if(!cfg_strbytelist_insert(
2206307729Sdes				&cfg_parser->cfg->local_zone_tags,
2207307729Sdes				$2, bitlist, len)) {
2208307729Sdes				yyerror("out of memory");
2209307729Sdes				free($2);
2210307729Sdes			}
2211307729Sdes		}
2212307729Sdes	}
2213307729Sdes	;
2214307729Sdesserver_access_control_tag: VAR_ACCESS_CONTROL_TAG STRING_ARG STRING_ARG
2215307729Sdes	{
2216307729Sdes		size_t len = 0;
2217307729Sdes		uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
2218307729Sdes			&len);
2219307729Sdes		free($3);
2220307729Sdes		OUTYY(("P(server_access_control_tag:%s)\n", $2));
2221356345Scy		if(!bitlist) {
2222307729Sdes			yyerror("could not parse tags, (define-tag them first)");
2223356345Scy			free($2);
2224356345Scy		}
2225307729Sdes		if(bitlist) {
2226307729Sdes			if(!cfg_strbytelist_insert(
2227307729Sdes				&cfg_parser->cfg->acl_tags,
2228307729Sdes				$2, bitlist, len)) {
2229307729Sdes				yyerror("out of memory");
2230307729Sdes				free($2);
2231307729Sdes			}
2232307729Sdes		}
2233307729Sdes	}
2234307729Sdes	;
2235307729Sdesserver_access_control_tag_action: VAR_ACCESS_CONTROL_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG
2236307729Sdes	{
2237307729Sdes		OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", $2, $3, $4));
2238307729Sdes		if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions,
2239307729Sdes			$2, $3, $4)) {
2240307729Sdes			yyerror("out of memory");
2241307729Sdes			free($2);
2242307729Sdes			free($3);
2243307729Sdes			free($4);
2244307729Sdes		}
2245307729Sdes	}
2246307729Sdes	;
2247307729Sdesserver_access_control_tag_data: VAR_ACCESS_CONTROL_TAG_DATA STRING_ARG STRING_ARG STRING_ARG
2248307729Sdes	{
2249307729Sdes		OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", $2, $3, $4));
2250307729Sdes		if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas,
2251307729Sdes			$2, $3, $4)) {
2252307729Sdes			yyerror("out of memory");
2253307729Sdes			free($2);
2254307729Sdes			free($3);
2255307729Sdes			free($4);
2256307729Sdes		}
2257307729Sdes	}
2258307729Sdes	;
2259307729Sdesserver_local_zone_override: VAR_LOCAL_ZONE_OVERRIDE STRING_ARG STRING_ARG STRING_ARG
2260307729Sdes	{
2261307729Sdes		OUTYY(("P(server_local_zone_override:%s %s %s)\n", $2, $3, $4));
2262307729Sdes		if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides,
2263307729Sdes			$2, $3, $4)) {
2264307729Sdes			yyerror("out of memory");
2265307729Sdes			free($2);
2266307729Sdes			free($3);
2267307729Sdes			free($4);
2268307729Sdes		}
2269307729Sdes	}
2270307729Sdes	;
2271356345Scyserver_access_control_view: VAR_ACCESS_CONTROL_VIEW STRING_ARG STRING_ARG
2272356345Scy	{
2273356345Scy		OUTYY(("P(server_access_control_view:%s %s)\n", $2, $3));
2274356345Scy		if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view,
2275356345Scy			$2, $3)) {
2276356345Scy			yyerror("out of memory");
2277356345Scy		}
2278356345Scy	}
2279356345Scy	;
2280356345Scyserver_response_ip_tag: VAR_RESPONSE_IP_TAG STRING_ARG STRING_ARG
2281356345Scy	{
2282356345Scy		size_t len = 0;
2283356345Scy		uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
2284356345Scy			&len);
2285356345Scy		free($3);
2286356345Scy		OUTYY(("P(response_ip_tag:%s)\n", $2));
2287356345Scy		if(!bitlist) {
2288356345Scy			yyerror("could not parse tags, (define-tag them first)");
2289356345Scy			free($2);
2290356345Scy		}
2291356345Scy		if(bitlist) {
2292356345Scy			if(!cfg_strbytelist_insert(
2293356345Scy				&cfg_parser->cfg->respip_tags,
2294356345Scy				$2, bitlist, len)) {
2295356345Scy				yyerror("out of memory");
2296356345Scy				free($2);
2297356345Scy			}
2298356345Scy		}
2299356345Scy	}
2300356345Scy	;
2301356345Scyserver_ip_ratelimit: VAR_IP_RATELIMIT STRING_ARG
2302356345Scy	{
2303356345Scy		OUTYY(("P(server_ip_ratelimit:%s)\n", $2));
2304356345Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2305356345Scy			yyerror("number expected");
2306356345Scy		else cfg_parser->cfg->ip_ratelimit = atoi($2);
2307356345Scy		free($2);
2308356345Scy	}
2309356345Scy	;
2310356345Scy
2311287917Sdesserver_ratelimit: VAR_RATELIMIT STRING_ARG
2312287917Sdes	{
2313287917Sdes		OUTYY(("P(server_ratelimit:%s)\n", $2));
2314287917Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2315287917Sdes			yyerror("number expected");
2316287917Sdes		else cfg_parser->cfg->ratelimit = atoi($2);
2317287917Sdes		free($2);
2318287917Sdes	}
2319287917Sdes	;
2320356345Scyserver_ip_ratelimit_size: VAR_IP_RATELIMIT_SIZE STRING_ARG
2321356345Scy  {
2322356345Scy  	OUTYY(("P(server_ip_ratelimit_size:%s)\n", $2));
2323356345Scy  	if(!cfg_parse_memsize($2, &cfg_parser->cfg->ip_ratelimit_size))
2324356345Scy  		yyerror("memory size expected");
2325356345Scy  	free($2);
2326356345Scy  }
2327356345Scy  ;
2328287917Sdesserver_ratelimit_size: VAR_RATELIMIT_SIZE STRING_ARG
2329287917Sdes	{
2330287917Sdes		OUTYY(("P(server_ratelimit_size:%s)\n", $2));
2331287917Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->ratelimit_size))
2332287917Sdes			yyerror("memory size expected");
2333287917Sdes		free($2);
2334287917Sdes	}
2335287917Sdes	;
2336356345Scyserver_ip_ratelimit_slabs: VAR_IP_RATELIMIT_SLABS STRING_ARG
2337356345Scy  {
2338356345Scy  	OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", $2));
2339356345Scy  	if(atoi($2) == 0)
2340356345Scy  		yyerror("number expected");
2341356345Scy  	else {
2342356345Scy  		cfg_parser->cfg->ip_ratelimit_slabs = atoi($2);
2343356345Scy  		if(!is_pow2(cfg_parser->cfg->ip_ratelimit_slabs))
2344356345Scy  			yyerror("must be a power of 2");
2345356345Scy  	}
2346356345Scy  	free($2);
2347356345Scy  }
2348356345Scy  ;
2349287917Sdesserver_ratelimit_slabs: VAR_RATELIMIT_SLABS STRING_ARG
2350287917Sdes	{
2351287917Sdes		OUTYY(("P(server_ratelimit_slabs:%s)\n", $2));
2352287917Sdes		if(atoi($2) == 0)
2353287917Sdes			yyerror("number expected");
2354287917Sdes		else {
2355287917Sdes			cfg_parser->cfg->ratelimit_slabs = atoi($2);
2356287917Sdes			if(!is_pow2(cfg_parser->cfg->ratelimit_slabs))
2357287917Sdes				yyerror("must be a power of 2");
2358287917Sdes		}
2359287917Sdes		free($2);
2360287917Sdes	}
2361287917Sdes	;
2362287917Sdesserver_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG
2363287917Sdes	{
2364287917Sdes		OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", $2, $3));
2365287917Sdes		if(atoi($3) == 0 && strcmp($3, "0") != 0) {
2366287917Sdes			yyerror("number expected");
2367356345Scy			free($2);
2368356345Scy			free($3);
2369287917Sdes		} else {
2370287917Sdes			if(!cfg_str2list_insert(&cfg_parser->cfg->
2371287917Sdes				ratelimit_for_domain, $2, $3))
2372287917Sdes				fatal_exit("out of memory adding "
2373287917Sdes					"ratelimit-for-domain");
2374287917Sdes		}
2375287917Sdes	}
2376287917Sdes	;
2377287917Sdesserver_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG
2378287917Sdes	{
2379287917Sdes		OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", $2, $3));
2380287917Sdes		if(atoi($3) == 0 && strcmp($3, "0") != 0) {
2381287917Sdes			yyerror("number expected");
2382356345Scy			free($2);
2383356345Scy			free($3);
2384287917Sdes		} else {
2385287917Sdes			if(!cfg_str2list_insert(&cfg_parser->cfg->
2386287917Sdes				ratelimit_below_domain, $2, $3))
2387287917Sdes				fatal_exit("out of memory adding "
2388287917Sdes					"ratelimit-below-domain");
2389287917Sdes		}
2390287917Sdes	}
2391287917Sdes	;
2392356345Scyserver_ip_ratelimit_factor: VAR_IP_RATELIMIT_FACTOR STRING_ARG
2393356345Scy  {
2394356345Scy  	OUTYY(("P(server_ip_ratelimit_factor:%s)\n", $2));
2395356345Scy  	if(atoi($2) == 0 && strcmp($2, "0") != 0)
2396356345Scy  		yyerror("number expected");
2397356345Scy  	else cfg_parser->cfg->ip_ratelimit_factor = atoi($2);
2398356345Scy  	free($2);
2399356345Scy	}
2400356345Scy	;
2401287917Sdesserver_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG
2402287917Sdes	{
2403287917Sdes		OUTYY(("P(server_ratelimit_factor:%s)\n", $2));
2404287917Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2405287917Sdes			yyerror("number expected");
2406287917Sdes		else cfg_parser->cfg->ratelimit_factor = atoi($2);
2407287917Sdes		free($2);
2408287917Sdes	}
2409287917Sdes	;
2410356345Scyserver_low_rtt: VAR_LOW_RTT STRING_ARG
2411356345Scy	{
2412356345Scy		OUTYY(("P(low-rtt option is deprecated, use fast-server-num instead)\n"));
2413356345Scy		free($2);
2414356345Scy	}
2415356345Scy	;
2416356345Scyserver_fast_server_num: VAR_FAST_SERVER_NUM STRING_ARG
2417356345Scy	{
2418356345Scy		OUTYY(("P(server_fast_server_num:%s)\n", $2));
2419356345Scy		if(atoi($2) <= 0)
2420356345Scy			yyerror("number expected");
2421356345Scy		else cfg_parser->cfg->fast_server_num = atoi($2);
2422356345Scy		free($2);
2423356345Scy	}
2424356345Scy	;
2425356345Scyserver_fast_server_permil: VAR_FAST_SERVER_PERMIL STRING_ARG
2426356345Scy	{
2427356345Scy		OUTYY(("P(server_fast_server_permil:%s)\n", $2));
2428356345Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2429356345Scy			yyerror("number expected");
2430356345Scy		else cfg_parser->cfg->fast_server_permil = atoi($2);
2431356345Scy		free($2);
2432356345Scy	}
2433356345Scy	;
2434292206Sdesserver_qname_minimisation: VAR_QNAME_MINIMISATION STRING_ARG
2435292206Sdes	{
2436292206Sdes		OUTYY(("P(server_qname_minimisation:%s)\n", $2));
2437292206Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2438292206Sdes			yyerror("expected yes or no.");
2439292206Sdes		else cfg_parser->cfg->qname_minimisation =
2440292206Sdes			(strcmp($2, "yes")==0);
2441292206Sdes		free($2);
2442292206Sdes	}
2443292206Sdes	;
2444356345Scyserver_qname_minimisation_strict: VAR_QNAME_MINIMISATION_STRICT STRING_ARG
2445356345Scy	{
2446356345Scy		OUTYY(("P(server_qname_minimisation_strict:%s)\n", $2));
2447356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2448356345Scy			yyerror("expected yes or no.");
2449356345Scy		else cfg_parser->cfg->qname_minimisation_strict =
2450356345Scy			(strcmp($2, "yes")==0);
2451356345Scy		free($2);
2452356345Scy	}
2453356345Scy	;
2454369939Sgit2svnserver_pad_responses: VAR_PAD_RESPONSES STRING_ARG
2455369939Sgit2svn	{
2456369939Sgit2svn		OUTYY(("P(server_pad_responses:%s)\n", $2));
2457369939Sgit2svn		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2458369939Sgit2svn			yyerror("expected yes or no.");
2459369939Sgit2svn		else cfg_parser->cfg->pad_responses =
2460369939Sgit2svn			(strcmp($2, "yes")==0);
2461369939Sgit2svn		free($2);
2462369939Sgit2svn	}
2463369939Sgit2svn	;
2464369939Sgit2svnserver_pad_responses_block_size: VAR_PAD_RESPONSES_BLOCK_SIZE STRING_ARG
2465369939Sgit2svn	{
2466369939Sgit2svn		OUTYY(("P(server_pad_responses_block_size:%s)\n", $2));
2467369939Sgit2svn		if(atoi($2) == 0)
2468369939Sgit2svn			yyerror("number expected");
2469369939Sgit2svn		else cfg_parser->cfg->pad_responses_block_size = atoi($2);
2470369939Sgit2svn		free($2);
2471369939Sgit2svn	}
2472369939Sgit2svn	;
2473369939Sgit2svnserver_pad_queries: VAR_PAD_QUERIES STRING_ARG
2474369939Sgit2svn	{
2475369939Sgit2svn		OUTYY(("P(server_pad_queries:%s)\n", $2));
2476369939Sgit2svn		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2477369939Sgit2svn			yyerror("expected yes or no.");
2478369939Sgit2svn		else cfg_parser->cfg->pad_queries =
2479369939Sgit2svn			(strcmp($2, "yes")==0);
2480369939Sgit2svn		free($2);
2481369939Sgit2svn	}
2482369939Sgit2svn	;
2483369939Sgit2svnserver_pad_queries_block_size: VAR_PAD_QUERIES_BLOCK_SIZE STRING_ARG
2484369939Sgit2svn	{
2485369939Sgit2svn		OUTYY(("P(server_pad_queries_block_size:%s)\n", $2));
2486369939Sgit2svn		if(atoi($2) == 0)
2487369939Sgit2svn			yyerror("number expected");
2488369939Sgit2svn		else cfg_parser->cfg->pad_queries_block_size = atoi($2);
2489369939Sgit2svn		free($2);
2490369939Sgit2svn	}
2491369939Sgit2svn	;
2492356345Scyserver_ipsecmod_enabled: VAR_IPSECMOD_ENABLED STRING_ARG
2493356345Scy	{
2494356345Scy	#ifdef USE_IPSECMOD
2495356345Scy		OUTYY(("P(server_ipsecmod_enabled:%s)\n", $2));
2496356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2497356345Scy			yyerror("expected yes or no.");
2498356345Scy		else cfg_parser->cfg->ipsecmod_enabled = (strcmp($2, "yes")==0);
2499356345Scy	#else
2500356345Scy		OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
2501356345Scy	#endif
2502356345Scy		free($2);
2503356345Scy	}
2504356345Scy	;
2505356345Scyserver_ipsecmod_ignore_bogus: VAR_IPSECMOD_IGNORE_BOGUS STRING_ARG
2506356345Scy	{
2507356345Scy	#ifdef USE_IPSECMOD
2508356345Scy		OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", $2));
2509356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2510356345Scy			yyerror("expected yes or no.");
2511356345Scy		else cfg_parser->cfg->ipsecmod_ignore_bogus = (strcmp($2, "yes")==0);
2512356345Scy	#else
2513356345Scy		OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
2514356345Scy	#endif
2515356345Scy		free($2);
2516356345Scy	}
2517356345Scy	;
2518356345Scyserver_ipsecmod_hook: VAR_IPSECMOD_HOOK STRING_ARG
2519356345Scy	{
2520356345Scy	#ifdef USE_IPSECMOD
2521356345Scy		OUTYY(("P(server_ipsecmod_hook:%s)\n", $2));
2522356345Scy		free(cfg_parser->cfg->ipsecmod_hook);
2523356345Scy		cfg_parser->cfg->ipsecmod_hook = $2;
2524356345Scy	#else
2525356345Scy		OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
2526356345Scy		free($2);
2527356345Scy	#endif
2528356345Scy	}
2529356345Scy	;
2530356345Scyserver_ipsecmod_max_ttl: VAR_IPSECMOD_MAX_TTL STRING_ARG
2531356345Scy	{
2532356345Scy	#ifdef USE_IPSECMOD
2533356345Scy		OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", $2));
2534356345Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2535356345Scy			yyerror("number expected");
2536356345Scy		else cfg_parser->cfg->ipsecmod_max_ttl = atoi($2);
2537356345Scy		free($2);
2538356345Scy	#else
2539356345Scy		OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
2540356345Scy		free($2);
2541356345Scy	#endif
2542356345Scy	}
2543356345Scy	;
2544356345Scyserver_ipsecmod_whitelist: VAR_IPSECMOD_WHITELIST STRING_ARG
2545356345Scy	{
2546356345Scy	#ifdef USE_IPSECMOD
2547356345Scy		OUTYY(("P(server_ipsecmod_whitelist:%s)\n", $2));
2548356345Scy		if(!cfg_strlist_insert(&cfg_parser->cfg->ipsecmod_whitelist, $2))
2549356345Scy			yyerror("out of memory");
2550356345Scy	#else
2551356345Scy		OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
2552356345Scy		free($2);
2553356345Scy	#endif
2554356345Scy	}
2555356345Scy	;
2556356345Scyserver_ipsecmod_strict: VAR_IPSECMOD_STRICT STRING_ARG
2557356345Scy	{
2558356345Scy	#ifdef USE_IPSECMOD
2559356345Scy		OUTYY(("P(server_ipsecmod_strict:%s)\n", $2));
2560356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2561356345Scy			yyerror("expected yes or no.");
2562356345Scy		else cfg_parser->cfg->ipsecmod_strict = (strcmp($2, "yes")==0);
2563356345Scy		free($2);
2564356345Scy	#else
2565356345Scy		OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
2566356345Scy		free($2);
2567356345Scy	#endif
2568356345Scy	}
2569356345Scy	;
2570368693Scyserver_edns_client_string: VAR_EDNS_CLIENT_STRING STRING_ARG STRING_ARG
2571368129Scy	{
2572368693Scy		OUTYY(("P(server_edns_client_string:%s %s)\n", $2, $3));
2573368129Scy		if(!cfg_str2list_insert(
2574368693Scy			&cfg_parser->cfg->edns_client_strings, $2, $3))
2575368129Scy			fatal_exit("out of memory adding "
2576368693Scy				"edns-client-string");
2577368129Scy	}
2578368129Scy	;
2579368693Scyserver_edns_client_string_opcode: VAR_EDNS_CLIENT_STRING_OPCODE STRING_ARG
2580368129Scy	{
2581368693Scy		OUTYY(("P(edns_client_string_opcode:%s)\n", $2));
2582368129Scy		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2583368129Scy			yyerror("option code expected");
2584368129Scy		else if(atoi($2) > 65535 || atoi($2) < 0)
2585368129Scy			yyerror("option code must be in interval [0, 65535]");
2586368693Scy		else cfg_parser->cfg->edns_client_string_opcode = atoi($2);
2587368693Scy		free($2);
2588368129Scy
2589368129Scy	}
2590368129Scy	;
2591238106Sdesstub_name: VAR_NAME STRING_ARG
2592238106Sdes	{
2593238106Sdes		OUTYY(("P(name:%s)\n", $2));
2594238106Sdes		if(cfg_parser->cfg->stubs->name)
2595238106Sdes			yyerror("stub name override, there must be one name "
2596238106Sdes				"for one stub-zone");
2597238106Sdes		free(cfg_parser->cfg->stubs->name);
2598238106Sdes		cfg_parser->cfg->stubs->name = $2;
2599238106Sdes	}
2600238106Sdes	;
2601238106Sdesstub_host: VAR_STUB_HOST STRING_ARG
2602238106Sdes	{
2603238106Sdes		OUTYY(("P(stub-host:%s)\n", $2));
2604238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, $2))
2605238106Sdes			yyerror("out of memory");
2606238106Sdes	}
2607238106Sdes	;
2608238106Sdesstub_addr: VAR_STUB_ADDR STRING_ARG
2609238106Sdes	{
2610238106Sdes		OUTYY(("P(stub-addr:%s)\n", $2));
2611238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, $2))
2612238106Sdes			yyerror("out of memory");
2613238106Sdes	}
2614238106Sdes	;
2615238106Sdesstub_first: VAR_STUB_FIRST STRING_ARG
2616238106Sdes	{
2617238106Sdes		OUTYY(("P(stub-first:%s)\n", $2));
2618238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2619238106Sdes			yyerror("expected yes or no.");
2620238106Sdes		else cfg_parser->cfg->stubs->isfirst=(strcmp($2, "yes")==0);
2621238106Sdes		free($2);
2622238106Sdes	}
2623238106Sdes	;
2624356345Scystub_no_cache: VAR_STUB_NO_CACHE STRING_ARG
2625356345Scy	{
2626356345Scy		OUTYY(("P(stub-no-cache:%s)\n", $2));
2627356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2628356345Scy			yyerror("expected yes or no.");
2629356345Scy		else cfg_parser->cfg->stubs->no_cache=(strcmp($2, "yes")==0);
2630356345Scy		free($2);
2631356345Scy	}
2632356345Scy	;
2633356345Scystub_ssl_upstream: VAR_STUB_SSL_UPSTREAM STRING_ARG
2634356345Scy	{
2635356345Scy		OUTYY(("P(stub-ssl-upstream:%s)\n", $2));
2636356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2637356345Scy			yyerror("expected yes or no.");
2638356345Scy		else cfg_parser->cfg->stubs->ssl_upstream =
2639356345Scy			(strcmp($2, "yes")==0);
2640356345Scy		free($2);
2641356345Scy	}
2642356345Scy	;
2643238106Sdesstub_prime: VAR_STUB_PRIME STRING_ARG
2644238106Sdes	{
2645238106Sdes		OUTYY(("P(stub-prime:%s)\n", $2));
2646238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2647238106Sdes			yyerror("expected yes or no.");
2648238106Sdes		else cfg_parser->cfg->stubs->isprime =
2649238106Sdes			(strcmp($2, "yes")==0);
2650238106Sdes		free($2);
2651238106Sdes	}
2652238106Sdes	;
2653238106Sdesforward_name: VAR_NAME STRING_ARG
2654238106Sdes	{
2655238106Sdes		OUTYY(("P(name:%s)\n", $2));
2656238106Sdes		if(cfg_parser->cfg->forwards->name)
2657238106Sdes			yyerror("forward name override, there must be one "
2658238106Sdes				"name for one forward-zone");
2659238106Sdes		free(cfg_parser->cfg->forwards->name);
2660238106Sdes		cfg_parser->cfg->forwards->name = $2;
2661238106Sdes	}
2662238106Sdes	;
2663238106Sdesforward_host: VAR_FORWARD_HOST STRING_ARG
2664238106Sdes	{
2665238106Sdes		OUTYY(("P(forward-host:%s)\n", $2));
2666238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, $2))
2667238106Sdes			yyerror("out of memory");
2668238106Sdes	}
2669238106Sdes	;
2670238106Sdesforward_addr: VAR_FORWARD_ADDR STRING_ARG
2671238106Sdes	{
2672238106Sdes		OUTYY(("P(forward-addr:%s)\n", $2));
2673238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, $2))
2674238106Sdes			yyerror("out of memory");
2675238106Sdes	}
2676238106Sdes	;
2677238106Sdesforward_first: VAR_FORWARD_FIRST STRING_ARG
2678238106Sdes	{
2679238106Sdes		OUTYY(("P(forward-first:%s)\n", $2));
2680238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2681238106Sdes			yyerror("expected yes or no.");
2682238106Sdes		else cfg_parser->cfg->forwards->isfirst=(strcmp($2, "yes")==0);
2683238106Sdes		free($2);
2684238106Sdes	}
2685238106Sdes	;
2686356345Scyforward_no_cache: VAR_FORWARD_NO_CACHE STRING_ARG
2687356345Scy	{
2688356345Scy		OUTYY(("P(forward-no-cache:%s)\n", $2));
2689356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2690356345Scy			yyerror("expected yes or no.");
2691356345Scy		else cfg_parser->cfg->forwards->no_cache=(strcmp($2, "yes")==0);
2692356345Scy		free($2);
2693356345Scy	}
2694356345Scy	;
2695356345Scyforward_ssl_upstream: VAR_FORWARD_SSL_UPSTREAM STRING_ARG
2696356345Scy	{
2697356345Scy		OUTYY(("P(forward-ssl-upstream:%s)\n", $2));
2698356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2699356345Scy			yyerror("expected yes or no.");
2700356345Scy		else cfg_parser->cfg->forwards->ssl_upstream =
2701356345Scy			(strcmp($2, "yes")==0);
2702356345Scy		free($2);
2703356345Scy	}
2704356345Scy	;
2705356345Scyauth_name: VAR_NAME STRING_ARG
2706356345Scy	{
2707356345Scy		OUTYY(("P(name:%s)\n", $2));
2708356345Scy		if(cfg_parser->cfg->auths->name)
2709356345Scy			yyerror("auth name override, there must be one name "
2710356345Scy				"for one auth-zone");
2711356345Scy		free(cfg_parser->cfg->auths->name);
2712356345Scy		cfg_parser->cfg->auths->name = $2;
2713356345Scy	}
2714356345Scy	;
2715356345Scyauth_zonefile: VAR_ZONEFILE STRING_ARG
2716356345Scy	{
2717356345Scy		OUTYY(("P(zonefile:%s)\n", $2));
2718356345Scy		free(cfg_parser->cfg->auths->zonefile);
2719356345Scy		cfg_parser->cfg->auths->zonefile = $2;
2720356345Scy	}
2721356345Scy	;
2722356345Scyauth_master: VAR_MASTER STRING_ARG
2723356345Scy	{
2724356345Scy		OUTYY(("P(master:%s)\n", $2));
2725356345Scy		if(!cfg_strlist_insert(&cfg_parser->cfg->auths->masters, $2))
2726356345Scy			yyerror("out of memory");
2727356345Scy	}
2728356345Scy	;
2729356345Scyauth_url: VAR_URL STRING_ARG
2730356345Scy	{
2731356345Scy		OUTYY(("P(url:%s)\n", $2));
2732356345Scy		if(!cfg_strlist_insert(&cfg_parser->cfg->auths->urls, $2))
2733356345Scy			yyerror("out of memory");
2734356345Scy	}
2735356345Scy	;
2736356345Scyauth_allow_notify: VAR_ALLOW_NOTIFY STRING_ARG
2737356345Scy	{
2738356345Scy		OUTYY(("P(allow-notify:%s)\n", $2));
2739356345Scy		if(!cfg_strlist_insert(&cfg_parser->cfg->auths->allow_notify,
2740356345Scy			$2))
2741356345Scy			yyerror("out of memory");
2742356345Scy	}
2743356345Scy	;
2744356345Scyauth_for_downstream: VAR_FOR_DOWNSTREAM STRING_ARG
2745356345Scy	{
2746356345Scy		OUTYY(("P(for-downstream:%s)\n", $2));
2747356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2748356345Scy			yyerror("expected yes or no.");
2749356345Scy		else cfg_parser->cfg->auths->for_downstream =
2750356345Scy			(strcmp($2, "yes")==0);
2751356345Scy		free($2);
2752356345Scy	}
2753356345Scy	;
2754356345Scyauth_for_upstream: VAR_FOR_UPSTREAM STRING_ARG
2755356345Scy	{
2756356345Scy		OUTYY(("P(for-upstream:%s)\n", $2));
2757356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2758356345Scy			yyerror("expected yes or no.");
2759356345Scy		else cfg_parser->cfg->auths->for_upstream =
2760356345Scy			(strcmp($2, "yes")==0);
2761356345Scy		free($2);
2762356345Scy	}
2763356345Scy	;
2764356345Scyauth_fallback_enabled: VAR_FALLBACK_ENABLED STRING_ARG
2765356345Scy	{
2766356345Scy		OUTYY(("P(fallback-enabled:%s)\n", $2));
2767356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2768356345Scy			yyerror("expected yes or no.");
2769356345Scy		else cfg_parser->cfg->auths->fallback_enabled =
2770356345Scy			(strcmp($2, "yes")==0);
2771356345Scy		free($2);
2772356345Scy	}
2773356345Scy	;
2774356345Scyview_name: VAR_NAME STRING_ARG
2775356345Scy	{
2776356345Scy		OUTYY(("P(name:%s)\n", $2));
2777356345Scy		if(cfg_parser->cfg->views->name)
2778356345Scy			yyerror("view name override, there must be one "
2779356345Scy				"name for one view");
2780356345Scy		free(cfg_parser->cfg->views->name);
2781356345Scy		cfg_parser->cfg->views->name = $2;
2782356345Scy	}
2783356345Scy	;
2784356345Scyview_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
2785356345Scy	{
2786356345Scy		OUTYY(("P(view_local_zone:%s %s)\n", $2, $3));
2787356345Scy		if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 &&
2788356345Scy		   strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 &&
2789356345Scy		   strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0
2790356345Scy		   && strcmp($3, "typetransparent")!=0
2791356345Scy		   && strcmp($3, "always_transparent")!=0
2792356345Scy		   && strcmp($3, "always_refuse")!=0
2793356345Scy		   && strcmp($3, "always_nxdomain")!=0
2794356345Scy		   && strcmp($3, "noview")!=0
2795356345Scy		   && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0) {
2796356345Scy			yyerror("local-zone type: expected static, deny, "
2797356345Scy				"refuse, redirect, transparent, "
2798356345Scy				"typetransparent, inform, inform_deny, "
2799356345Scy				"always_transparent, always_refuse, "
2800356345Scy				"always_nxdomain, noview or nodefault");
2801356345Scy			free($2);
2802356345Scy			free($3);
2803356345Scy		} else if(strcmp($3, "nodefault")==0) {
2804356345Scy			if(!cfg_strlist_insert(&cfg_parser->cfg->views->
2805356345Scy				local_zones_nodefault, $2))
2806356345Scy				fatal_exit("out of memory adding local-zone");
2807356345Scy			free($3);
2808356345Scy#ifdef USE_IPSET
2809356345Scy		} else if(strcmp($3, "ipset")==0) {
2810356345Scy			if(!cfg_strlist_insert(&cfg_parser->cfg->views->
2811356345Scy				local_zones_ipset, $2))
2812356345Scy				fatal_exit("out of memory adding local-zone");
2813356345Scy			free($3);
2814356345Scy#endif
2815356345Scy		} else {
2816356345Scy			if(!cfg_str2list_insert(
2817356345Scy				&cfg_parser->cfg->views->local_zones,
2818356345Scy				$2, $3))
2819356345Scy				fatal_exit("out of memory adding local-zone");
2820356345Scy		}
2821356345Scy	}
2822356345Scy	;
2823356345Scyview_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG
2824356345Scy	{
2825356345Scy		OUTYY(("P(view_response_ip:%s %s)\n", $2, $3));
2826356345Scy		validate_respip_action($3);
2827356345Scy		if(!cfg_str2list_insert(
2828356345Scy			&cfg_parser->cfg->views->respip_actions, $2, $3))
2829356345Scy			fatal_exit("out of memory adding per-view "
2830356345Scy				"response-ip action");
2831356345Scy	}
2832356345Scy	;
2833356345Scyview_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG
2834356345Scy	{
2835356345Scy		OUTYY(("P(view_response_ip_data:%s)\n", $2));
2836356345Scy		if(!cfg_str2list_insert(
2837356345Scy			&cfg_parser->cfg->views->respip_data, $2, $3))
2838356345Scy			fatal_exit("out of memory adding response-ip-data");
2839356345Scy	}
2840356345Scy	;
2841356345Scyview_local_data: VAR_LOCAL_DATA STRING_ARG
2842356345Scy	{
2843356345Scy		OUTYY(("P(view_local_data:%s)\n", $2));
2844356345Scy		if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, $2)) {
2845356345Scy			fatal_exit("out of memory adding local-data");
2846356345Scy		}
2847356345Scy	}
2848356345Scy	;
2849356345Scyview_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG
2850356345Scy	{
2851356345Scy		char* ptr;
2852356345Scy		OUTYY(("P(view_local_data_ptr:%s)\n", $2));
2853356345Scy		ptr = cfg_ptr_reverse($2);
2854356345Scy		free($2);
2855356345Scy		if(ptr) {
2856356345Scy			if(!cfg_strlist_insert(&cfg_parser->cfg->views->
2857356345Scy				local_data, ptr))
2858356345Scy				fatal_exit("out of memory adding local-data");
2859356345Scy		} else {
2860356345Scy			yyerror("local-data-ptr could not be reversed");
2861356345Scy		}
2862356345Scy	}
2863356345Scy	;
2864356345Scyview_first: VAR_VIEW_FIRST STRING_ARG
2865356345Scy	{
2866356345Scy		OUTYY(("P(view-first:%s)\n", $2));
2867356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2868356345Scy			yyerror("expected yes or no.");
2869356345Scy		else cfg_parser->cfg->views->isfirst=(strcmp($2, "yes")==0);
2870356345Scy		free($2);
2871356345Scy	}
2872356345Scy	;
2873238106Sdesrcstart: VAR_REMOTE_CONTROL
2874238106Sdes	{
2875238106Sdes		OUTYY(("\nP(remote-control:)\n"));
2876238106Sdes	}
2877238106Sdes	;
2878238106Sdescontents_rc: contents_rc content_rc
2879238106Sdes	| ;
2880238106Sdescontent_rc: rc_control_enable | rc_control_interface | rc_control_port |
2881238106Sdes	rc_server_key_file | rc_server_cert_file | rc_control_key_file |
2882276699Sdes	rc_control_cert_file | rc_control_use_cert
2883238106Sdes	;
2884238106Sdesrc_control_enable: VAR_CONTROL_ENABLE STRING_ARG
2885238106Sdes	{
2886238106Sdes		OUTYY(("P(control_enable:%s)\n", $2));
2887238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2888238106Sdes			yyerror("expected yes or no.");
2889238106Sdes		else cfg_parser->cfg->remote_control_enable =
2890238106Sdes			(strcmp($2, "yes")==0);
2891238106Sdes		free($2);
2892238106Sdes	}
2893238106Sdes	;
2894238106Sdesrc_control_port: VAR_CONTROL_PORT STRING_ARG
2895238106Sdes	{
2896238106Sdes		OUTYY(("P(control_port:%s)\n", $2));
2897238106Sdes		if(atoi($2) == 0)
2898238106Sdes			yyerror("control port number expected");
2899238106Sdes		else cfg_parser->cfg->control_port = atoi($2);
2900238106Sdes		free($2);
2901238106Sdes	}
2902238106Sdes	;
2903238106Sdesrc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG
2904238106Sdes	{
2905238106Sdes		OUTYY(("P(control_interface:%s)\n", $2));
2906356345Scy		if(!cfg_strlist_append(&cfg_parser->cfg->control_ifs, $2))
2907238106Sdes			yyerror("out of memory");
2908238106Sdes	}
2909238106Sdes	;
2910276699Sdesrc_control_use_cert: VAR_CONTROL_USE_CERT STRING_ARG
2911276699Sdes	{
2912276699Sdes		OUTYY(("P(control_use_cert:%s)\n", $2));
2913356345Scy		cfg_parser->cfg->control_use_cert = (strcmp($2, "yes")==0);
2914276699Sdes		free($2);
2915276699Sdes	}
2916276699Sdes	;
2917238106Sdesrc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG
2918238106Sdes	{
2919238106Sdes		OUTYY(("P(rc_server_key_file:%s)\n", $2));
2920238106Sdes		free(cfg_parser->cfg->server_key_file);
2921238106Sdes		cfg_parser->cfg->server_key_file = $2;
2922238106Sdes	}
2923238106Sdes	;
2924238106Sdesrc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG
2925238106Sdes	{
2926238106Sdes		OUTYY(("P(rc_server_cert_file:%s)\n", $2));
2927238106Sdes		free(cfg_parser->cfg->server_cert_file);
2928238106Sdes		cfg_parser->cfg->server_cert_file = $2;
2929238106Sdes	}
2930238106Sdes	;
2931238106Sdesrc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG
2932238106Sdes	{
2933238106Sdes		OUTYY(("P(rc_control_key_file:%s)\n", $2));
2934238106Sdes		free(cfg_parser->cfg->control_key_file);
2935238106Sdes		cfg_parser->cfg->control_key_file = $2;
2936238106Sdes	}
2937238106Sdes	;
2938238106Sdesrc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG
2939238106Sdes	{
2940238106Sdes		OUTYY(("P(rc_control_cert_file:%s)\n", $2));
2941238106Sdes		free(cfg_parser->cfg->control_cert_file);
2942238106Sdes		cfg_parser->cfg->control_cert_file = $2;
2943238106Sdes	}
2944238106Sdes	;
2945276605Sdesdtstart: VAR_DNSTAP
2946276605Sdes	{
2947276605Sdes		OUTYY(("\nP(dnstap:)\n"));
2948276605Sdes	}
2949276605Sdes	;
2950276605Sdescontents_dt: contents_dt content_dt
2951276605Sdes	| ;
2952366095Scycontent_dt: dt_dnstap_enable | dt_dnstap_socket_path | dt_dnstap_bidirectional |
2953366095Scy	dt_dnstap_ip | dt_dnstap_tls | dt_dnstap_tls_server_name |
2954366095Scy	dt_dnstap_tls_cert_bundle |
2955366095Scy	dt_dnstap_tls_client_key_file | dt_dnstap_tls_client_cert_file |
2956276605Sdes	dt_dnstap_send_identity | dt_dnstap_send_version |
2957276605Sdes	dt_dnstap_identity | dt_dnstap_version |
2958276605Sdes	dt_dnstap_log_resolver_query_messages |
2959276605Sdes	dt_dnstap_log_resolver_response_messages |
2960276605Sdes	dt_dnstap_log_client_query_messages |
2961276605Sdes	dt_dnstap_log_client_response_messages |
2962276605Sdes	dt_dnstap_log_forwarder_query_messages |
2963276605Sdes	dt_dnstap_log_forwarder_response_messages
2964276605Sdes	;
2965276605Sdesdt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG
2966276605Sdes	{
2967276605Sdes		OUTYY(("P(dt_dnstap_enable:%s)\n", $2));
2968276605Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2969276605Sdes			yyerror("expected yes or no.");
2970276605Sdes		else cfg_parser->cfg->dnstap = (strcmp($2, "yes")==0);
2971356345Scy		free($2);
2972276605Sdes	}
2973276605Sdes	;
2974366095Scydt_dnstap_bidirectional: VAR_DNSTAP_BIDIRECTIONAL STRING_ARG
2975366095Scy	{
2976366095Scy		OUTYY(("P(dt_dnstap_bidirectional:%s)\n", $2));
2977366095Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2978366095Scy			yyerror("expected yes or no.");
2979366095Scy		else cfg_parser->cfg->dnstap_bidirectional =
2980366095Scy			(strcmp($2, "yes")==0);
2981366095Scy		free($2);
2982366095Scy	}
2983366095Scy	;
2984276605Sdesdt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG
2985276605Sdes	{
2986276605Sdes		OUTYY(("P(dt_dnstap_socket_path:%s)\n", $2));
2987276605Sdes		free(cfg_parser->cfg->dnstap_socket_path);
2988276605Sdes		cfg_parser->cfg->dnstap_socket_path = $2;
2989276605Sdes	}
2990276605Sdes	;
2991366095Scydt_dnstap_ip: VAR_DNSTAP_IP STRING_ARG
2992366095Scy	{
2993366095Scy		OUTYY(("P(dt_dnstap_ip:%s)\n", $2));
2994366095Scy		free(cfg_parser->cfg->dnstap_ip);
2995366095Scy		cfg_parser->cfg->dnstap_ip = $2;
2996366095Scy	}
2997366095Scy	;
2998366095Scydt_dnstap_tls: VAR_DNSTAP_TLS STRING_ARG
2999366095Scy	{
3000366095Scy		OUTYY(("P(dt_dnstap_tls:%s)\n", $2));
3001366095Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3002366095Scy			yyerror("expected yes or no.");
3003366095Scy		else cfg_parser->cfg->dnstap_tls = (strcmp($2, "yes")==0);
3004366095Scy		free($2);
3005366095Scy	}
3006366095Scy	;
3007366095Scydt_dnstap_tls_server_name: VAR_DNSTAP_TLS_SERVER_NAME STRING_ARG
3008366095Scy	{
3009366095Scy		OUTYY(("P(dt_dnstap_tls_server_name:%s)\n", $2));
3010366095Scy		free(cfg_parser->cfg->dnstap_tls_server_name);
3011366095Scy		cfg_parser->cfg->dnstap_tls_server_name = $2;
3012366095Scy	}
3013366095Scy	;
3014366095Scydt_dnstap_tls_cert_bundle: VAR_DNSTAP_TLS_CERT_BUNDLE STRING_ARG
3015366095Scy	{
3016366095Scy		OUTYY(("P(dt_dnstap_tls_cert_bundle:%s)\n", $2));
3017366095Scy		free(cfg_parser->cfg->dnstap_tls_cert_bundle);
3018366095Scy		cfg_parser->cfg->dnstap_tls_cert_bundle = $2;
3019366095Scy	}
3020366095Scy	;
3021366095Scydt_dnstap_tls_client_key_file: VAR_DNSTAP_TLS_CLIENT_KEY_FILE STRING_ARG
3022366095Scy	{
3023366095Scy		OUTYY(("P(dt_dnstap_tls_client_key_file:%s)\n", $2));
3024366095Scy		free(cfg_parser->cfg->dnstap_tls_client_key_file);
3025366095Scy		cfg_parser->cfg->dnstap_tls_client_key_file = $2;
3026366095Scy	}
3027366095Scy	;
3028366095Scydt_dnstap_tls_client_cert_file: VAR_DNSTAP_TLS_CLIENT_CERT_FILE STRING_ARG
3029366095Scy	{
3030366095Scy		OUTYY(("P(dt_dnstap_tls_client_cert_file:%s)\n", $2));
3031366095Scy		free(cfg_parser->cfg->dnstap_tls_client_cert_file);
3032366095Scy		cfg_parser->cfg->dnstap_tls_client_cert_file = $2;
3033366095Scy	}
3034366095Scy	;
3035276605Sdesdt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG
3036276605Sdes	{
3037276605Sdes		OUTYY(("P(dt_dnstap_send_identity:%s)\n", $2));
3038276605Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3039276605Sdes			yyerror("expected yes or no.");
3040276605Sdes		else cfg_parser->cfg->dnstap_send_identity = (strcmp($2, "yes")==0);
3041356345Scy		free($2);
3042276605Sdes	}
3043276605Sdes	;
3044276605Sdesdt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG
3045276605Sdes	{
3046276605Sdes		OUTYY(("P(dt_dnstap_send_version:%s)\n", $2));
3047276605Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3048276605Sdes			yyerror("expected yes or no.");
3049276605Sdes		else cfg_parser->cfg->dnstap_send_version = (strcmp($2, "yes")==0);
3050356345Scy		free($2);
3051276605Sdes	}
3052276605Sdes	;
3053276605Sdesdt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG
3054276605Sdes	{
3055276605Sdes		OUTYY(("P(dt_dnstap_identity:%s)\n", $2));
3056276605Sdes		free(cfg_parser->cfg->dnstap_identity);
3057276605Sdes		cfg_parser->cfg->dnstap_identity = $2;
3058276605Sdes	}
3059276605Sdes	;
3060276605Sdesdt_dnstap_version: VAR_DNSTAP_VERSION STRING_ARG
3061276605Sdes	{
3062276605Sdes		OUTYY(("P(dt_dnstap_version:%s)\n", $2));
3063276605Sdes		free(cfg_parser->cfg->dnstap_version);
3064276605Sdes		cfg_parser->cfg->dnstap_version = $2;
3065276605Sdes	}
3066276605Sdes	;
3067276605Sdesdt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES STRING_ARG
3068276605Sdes	{
3069276605Sdes		OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", $2));
3070276605Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3071276605Sdes			yyerror("expected yes or no.");
3072276605Sdes		else cfg_parser->cfg->dnstap_log_resolver_query_messages =
3073276605Sdes			(strcmp($2, "yes")==0);
3074356345Scy		free($2);
3075276605Sdes	}
3076276605Sdes	;
3077276605Sdesdt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG
3078276605Sdes	{
3079276605Sdes		OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", $2));
3080276605Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3081276605Sdes			yyerror("expected yes or no.");
3082276605Sdes		else cfg_parser->cfg->dnstap_log_resolver_response_messages =
3083276605Sdes			(strcmp($2, "yes")==0);
3084356345Scy		free($2);
3085276605Sdes	}
3086276605Sdes	;
3087276605Sdesdt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG
3088276605Sdes	{
3089276605Sdes		OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", $2));
3090276605Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3091276605Sdes			yyerror("expected yes or no.");
3092276605Sdes		else cfg_parser->cfg->dnstap_log_client_query_messages =
3093276605Sdes			(strcmp($2, "yes")==0);
3094356345Scy		free($2);
3095276605Sdes	}
3096276605Sdes	;
3097276605Sdesdt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG
3098276605Sdes	{
3099276605Sdes		OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", $2));
3100276605Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3101276605Sdes			yyerror("expected yes or no.");
3102276605Sdes		else cfg_parser->cfg->dnstap_log_client_response_messages =
3103276605Sdes			(strcmp($2, "yes")==0);
3104356345Scy		free($2);
3105276605Sdes	}
3106276605Sdes	;
3107276605Sdesdt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG
3108276605Sdes	{
3109276605Sdes		OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", $2));
3110276605Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3111276605Sdes			yyerror("expected yes or no.");
3112276605Sdes		else cfg_parser->cfg->dnstap_log_forwarder_query_messages =
3113276605Sdes			(strcmp($2, "yes")==0);
3114356345Scy		free($2);
3115276605Sdes	}
3116276605Sdes	;
3117276605Sdesdt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG
3118276605Sdes	{
3119276605Sdes		OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", $2));
3120276605Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3121276605Sdes			yyerror("expected yes or no.");
3122276605Sdes		else cfg_parser->cfg->dnstap_log_forwarder_response_messages =
3123276605Sdes			(strcmp($2, "yes")==0);
3124356345Scy		free($2);
3125276605Sdes	}
3126276605Sdes	;
3127238106Sdespythonstart: VAR_PYTHON
3128238106Sdes	{
3129238106Sdes		OUTYY(("\nP(python:)\n"));
3130238106Sdes	}
3131238106Sdes	;
3132238106Sdescontents_py: contents_py content_py
3133238106Sdes	| ;
3134238106Sdescontent_py: py_script
3135238106Sdes	;
3136238106Sdespy_script: VAR_PYTHON_SCRIPT STRING_ARG
3137238106Sdes	{
3138238106Sdes		OUTYY(("P(python-script:%s)\n", $2));
3139356345Scy		if(!cfg_strlist_append_ex(&cfg_parser->cfg->python_script, $2))
3140356345Scy			yyerror("out of memory");
3141238106Sdes	}
3142366095Scydynlibstart: VAR_DYNLIB
3143366095Scy	{
3144366095Scy		OUTYY(("\nP(dynlib:)\n"));
3145366095Scy	}
3146366095Scy	;
3147366095Scycontents_dl: contents_dl content_dl
3148366095Scy	| ;
3149366095Scycontent_dl: dl_file
3150366095Scy	;
3151366095Scydl_file: VAR_DYNLIB_FILE STRING_ARG
3152366095Scy	{
3153366095Scy		OUTYY(("P(dynlib-file:%s)\n", $2));
3154366095Scy		if(!cfg_strlist_append_ex(&cfg_parser->cfg->dynlib_file, $2))
3155366095Scy			yyerror("out of memory");
3156366095Scy	}
3157307729Sdesserver_disable_dnssec_lame_check: VAR_DISABLE_DNSSEC_LAME_CHECK STRING_ARG
3158307729Sdes	{
3159307729Sdes		OUTYY(("P(disable_dnssec_lame_check:%s)\n", $2));
3160307729Sdes		if (strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3161307729Sdes			yyerror("expected yes or no.");
3162307729Sdes		else cfg_parser->cfg->disable_dnssec_lame_check =
3163307729Sdes			(strcmp($2, "yes")==0);
3164307729Sdes		free($2);
3165307729Sdes	}
3166356345Scy	;
3167356345Scyserver_log_identity: VAR_LOG_IDENTITY STRING_ARG
3168356345Scy	{
3169356345Scy		OUTYY(("P(server_log_identity:%s)\n", $2));
3170356345Scy		free(cfg_parser->cfg->log_identity);
3171356345Scy		cfg_parser->cfg->log_identity = $2;
3172356345Scy	}
3173356345Scy	;
3174356345Scyserver_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG
3175356345Scy	{
3176356345Scy		OUTYY(("P(server_response_ip:%s %s)\n", $2, $3));
3177356345Scy		validate_respip_action($3);
3178356345Scy		if(!cfg_str2list_insert(&cfg_parser->cfg->respip_actions,
3179356345Scy			$2, $3))
3180356345Scy			fatal_exit("out of memory adding response-ip");
3181356345Scy	}
3182356345Scy	;
3183356345Scyserver_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG
3184356345Scy	{
3185356345Scy		OUTYY(("P(server_response_ip_data:%s)\n", $2));
3186356345Scy		if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data,
3187356345Scy			$2, $3))
3188356345Scy			fatal_exit("out of memory adding response-ip-data");
3189356345Scy	}
3190356345Scy	;
3191356345Scydnscstart: VAR_DNSCRYPT
3192356345Scy	{
3193356345Scy		OUTYY(("\nP(dnscrypt:)\n"));
3194356345Scy	}
3195356345Scy	;
3196356345Scycontents_dnsc: contents_dnsc content_dnsc
3197356345Scy	| ;
3198356345Scycontent_dnsc:
3199356345Scy	dnsc_dnscrypt_enable | dnsc_dnscrypt_port | dnsc_dnscrypt_provider |
3200356345Scy	dnsc_dnscrypt_secret_key | dnsc_dnscrypt_provider_cert |
3201356345Scy	dnsc_dnscrypt_provider_cert_rotated |
3202356345Scy	dnsc_dnscrypt_shared_secret_cache_size |
3203356345Scy	dnsc_dnscrypt_shared_secret_cache_slabs |
3204356345Scy	dnsc_dnscrypt_nonce_cache_size |
3205356345Scy	dnsc_dnscrypt_nonce_cache_slabs
3206356345Scy	;
3207356345Scydnsc_dnscrypt_enable: VAR_DNSCRYPT_ENABLE STRING_ARG
3208356345Scy	{
3209356345Scy		OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", $2));
3210356345Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3211356345Scy			yyerror("expected yes or no.");
3212356345Scy		else cfg_parser->cfg->dnscrypt = (strcmp($2, "yes")==0);
3213356345Scy		free($2);
3214356345Scy	}
3215356345Scy	;
3216356345Scy
3217356345Scydnsc_dnscrypt_port: VAR_DNSCRYPT_PORT STRING_ARG
3218356345Scy	{
3219356345Scy		OUTYY(("P(dnsc_dnscrypt_port:%s)\n", $2));
3220356345Scy		if(atoi($2) == 0)
3221356345Scy			yyerror("port number expected");
3222356345Scy		else cfg_parser->cfg->dnscrypt_port = atoi($2);
3223356345Scy		free($2);
3224356345Scy	}
3225356345Scy	;
3226356345Scydnsc_dnscrypt_provider: VAR_DNSCRYPT_PROVIDER STRING_ARG
3227356345Scy	{
3228356345Scy		OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", $2));
3229356345Scy		free(cfg_parser->cfg->dnscrypt_provider);
3230356345Scy		cfg_parser->cfg->dnscrypt_provider = $2;
3231356345Scy	}
3232356345Scy	;
3233356345Scydnsc_dnscrypt_provider_cert: VAR_DNSCRYPT_PROVIDER_CERT STRING_ARG
3234356345Scy	{
3235356345Scy		OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", $2));
3236356345Scy		if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_provider_cert, $2))
3237356345Scy			log_warn("dnscrypt-provider-cert %s is a duplicate", $2);
3238356345Scy		if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert, $2))
3239356345Scy			fatal_exit("out of memory adding dnscrypt-provider-cert");
3240356345Scy	}
3241356345Scy	;
3242356345Scydnsc_dnscrypt_provider_cert_rotated: VAR_DNSCRYPT_PROVIDER_CERT_ROTATED STRING_ARG
3243356345Scy	{
3244356345Scy		OUTYY(("P(dnsc_dnscrypt_provider_cert_rotated:%s)\n", $2));
3245356345Scy		if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert_rotated, $2))
3246356345Scy			fatal_exit("out of memory adding dnscrypt-provider-cert-rotated");
3247356345Scy	}
3248356345Scy	;
3249356345Scydnsc_dnscrypt_secret_key: VAR_DNSCRYPT_SECRET_KEY STRING_ARG
3250356345Scy	{
3251356345Scy		OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", $2));
3252356345Scy		if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_secret_key, $2))
3253356345Scy			log_warn("dnscrypt-secret-key: %s is a duplicate", $2);
3254356345Scy		if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_secret_key, $2))
3255356345Scy			fatal_exit("out of memory adding dnscrypt-secret-key");
3256356345Scy	}
3257356345Scy	;
3258356345Scydnsc_dnscrypt_shared_secret_cache_size: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE STRING_ARG
3259356345Scy  {
3260356345Scy  	OUTYY(("P(dnscrypt_shared_secret_cache_size:%s)\n", $2));
3261356345Scy  	if(!cfg_parse_memsize($2, &cfg_parser->cfg->dnscrypt_shared_secret_cache_size))
3262356345Scy  		yyerror("memory size expected");
3263356345Scy  	free($2);
3264356345Scy  }
3265356345Scy  ;
3266356345Scydnsc_dnscrypt_shared_secret_cache_slabs: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS STRING_ARG
3267356345Scy  {
3268356345Scy  	OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", $2));
3269356345Scy  	if(atoi($2) == 0)
3270356345Scy  		yyerror("number expected");
3271356345Scy  	else {
3272356345Scy  		cfg_parser->cfg->dnscrypt_shared_secret_cache_slabs = atoi($2);
3273356345Scy  		if(!is_pow2(cfg_parser->cfg->dnscrypt_shared_secret_cache_slabs))
3274356345Scy  			yyerror("must be a power of 2");
3275356345Scy  	}
3276356345Scy  	free($2);
3277356345Scy  }
3278356345Scy  ;
3279356345Scydnsc_dnscrypt_nonce_cache_size: VAR_DNSCRYPT_NONCE_CACHE_SIZE STRING_ARG
3280356345Scy  {
3281356345Scy  	OUTYY(("P(dnscrypt_nonce_cache_size:%s)\n", $2));
3282356345Scy  	if(!cfg_parse_memsize($2, &cfg_parser->cfg->dnscrypt_nonce_cache_size))
3283356345Scy  		yyerror("memory size expected");
3284356345Scy  	free($2);
3285356345Scy  }
3286356345Scy  ;
3287356345Scydnsc_dnscrypt_nonce_cache_slabs: VAR_DNSCRYPT_NONCE_CACHE_SLABS STRING_ARG
3288356345Scy  {
3289356345Scy  	OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", $2));
3290356345Scy  	if(atoi($2) == 0)
3291356345Scy  		yyerror("number expected");
3292356345Scy  	else {
3293356345Scy  		cfg_parser->cfg->dnscrypt_nonce_cache_slabs = atoi($2);
3294356345Scy  		if(!is_pow2(cfg_parser->cfg->dnscrypt_nonce_cache_slabs))
3295356345Scy  			yyerror("must be a power of 2");
3296356345Scy  	}
3297356345Scy  	free($2);
3298356345Scy  }
3299356345Scy  ;
3300356345Scycachedbstart: VAR_CACHEDB
3301356345Scy	{
3302356345Scy		OUTYY(("\nP(cachedb:)\n"));
3303356345Scy	}
3304356345Scy	;
3305356345Scycontents_cachedb: contents_cachedb content_cachedb
3306356345Scy	| ;
3307356345Scycontent_cachedb: cachedb_backend_name | cachedb_secret_seed |
3308366095Scy	redis_server_host | redis_server_port | redis_timeout |
3309366095Scy	redis_expire_records
3310356345Scy	;
3311356345Scycachedb_backend_name: VAR_CACHEDB_BACKEND STRING_ARG
3312356345Scy	{
3313356345Scy	#ifdef USE_CACHEDB
3314356345Scy		OUTYY(("P(backend:%s)\n", $2));
3315356345Scy		free(cfg_parser->cfg->cachedb_backend);
3316356345Scy		cfg_parser->cfg->cachedb_backend = $2;
3317356345Scy	#else
3318356345Scy		OUTYY(("P(Compiled without cachedb, ignoring)\n"));
3319356345Scy		free($2);
3320356345Scy	#endif
3321356345Scy	}
3322356345Scy	;
3323356345Scycachedb_secret_seed: VAR_CACHEDB_SECRETSEED STRING_ARG
3324356345Scy	{
3325356345Scy	#ifdef USE_CACHEDB
3326356345Scy		OUTYY(("P(secret-seed:%s)\n", $2));
3327356345Scy		free(cfg_parser->cfg->cachedb_secret);
3328356345Scy		cfg_parser->cfg->cachedb_secret = $2;
3329356345Scy	#else
3330356345Scy		OUTYY(("P(Compiled without cachedb, ignoring)\n"));
3331356345Scy		free($2);
3332356345Scy	#endif
3333356345Scy	}
3334356345Scy	;
3335356345Scyredis_server_host: VAR_CACHEDB_REDISHOST STRING_ARG
3336356345Scy	{
3337356345Scy	#if defined(USE_CACHEDB) && defined(USE_REDIS)
3338356345Scy		OUTYY(("P(redis_server_host:%s)\n", $2));
3339356345Scy		free(cfg_parser->cfg->redis_server_host);
3340356345Scy		cfg_parser->cfg->redis_server_host = $2;
3341356345Scy	#else
3342356345Scy		OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
3343356345Scy		free($2);
3344356345Scy	#endif
3345356345Scy	}
3346356345Scy	;
3347356345Scyredis_server_port: VAR_CACHEDB_REDISPORT STRING_ARG
3348356345Scy	{
3349356345Scy	#if defined(USE_CACHEDB) && defined(USE_REDIS)
3350356345Scy		int port;
3351356345Scy		OUTYY(("P(redis_server_port:%s)\n", $2));
3352356345Scy		port = atoi($2);
3353356345Scy		if(port == 0 || port < 0 || port > 65535)
3354356345Scy			yyerror("valid redis server port number expected");
3355356345Scy		else cfg_parser->cfg->redis_server_port = port;
3356356345Scy	#else
3357356345Scy		OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
3358356345Scy	#endif
3359356345Scy		free($2);
3360356345Scy	}
3361356345Scy	;
3362356345Scyredis_timeout: VAR_CACHEDB_REDISTIMEOUT STRING_ARG
3363356345Scy	{
3364356345Scy	#if defined(USE_CACHEDB) && defined(USE_REDIS)
3365356345Scy		OUTYY(("P(redis_timeout:%s)\n", $2));
3366356345Scy		if(atoi($2) == 0)
3367356345Scy			yyerror("redis timeout value expected");
3368356345Scy		else cfg_parser->cfg->redis_timeout = atoi($2);
3369356345Scy	#else
3370356345Scy		OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
3371356345Scy	#endif
3372356345Scy		free($2);
3373356345Scy	}
3374356345Scy	;
3375366095Scyredis_expire_records: VAR_CACHEDB_REDISEXPIRERECORDS STRING_ARG
3376366095Scy	{
3377366095Scy	#if defined(USE_CACHEDB) && defined(USE_REDIS)
3378366095Scy		OUTYY(("P(redis_expire_records:%s)\n", $2));
3379366095Scy		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3380366095Scy			yyerror("expected yes or no.");
3381366095Scy		else cfg_parser->cfg->redis_expire_records = (strcmp($2, "yes")==0);
3382366095Scy	#else
3383366095Scy		OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
3384366095Scy	#endif
3385366095Scy		free($2);
3386366095Scy	}
3387366095Scy	;
3388356345Scyserver_tcp_connection_limit: VAR_TCP_CONNECTION_LIMIT STRING_ARG STRING_ARG
3389356345Scy	{
3390356345Scy		OUTYY(("P(server_tcp_connection_limit:%s %s)\n", $2, $3));
3391356345Scy		if (atoi($3) < 0)
3392356345Scy			yyerror("positive number expected");
3393356345Scy		else {
3394356345Scy			if(!cfg_str2list_insert(&cfg_parser->cfg->tcp_connection_limits, $2, $3))
3395356345Scy				fatal_exit("out of memory adding tcp connection limit");
3396356345Scy		}
3397356345Scy	}
3398356345Scy	;
3399356345Scy	ipsetstart: VAR_IPSET
3400356345Scy		{
3401356345Scy			OUTYY(("\nP(ipset:)\n"));
3402356345Scy		}
3403356345Scy		;
3404356345Scy	contents_ipset: contents_ipset content_ipset
3405356345Scy		| ;
3406356345Scy	content_ipset: ipset_name_v4 | ipset_name_v6
3407356345Scy		;
3408356345Scy	ipset_name_v4: VAR_IPSET_NAME_V4 STRING_ARG
3409356345Scy		{
3410356345Scy		#ifdef USE_IPSET
3411356345Scy			OUTYY(("P(name-v4:%s)\n", $2));
3412356345Scy			if(cfg_parser->cfg->ipset_name_v4)
3413356345Scy				yyerror("ipset name v4 override, there must be one "
3414356345Scy					"name for ip v4");
3415356345Scy			free(cfg_parser->cfg->ipset_name_v4);
3416356345Scy			cfg_parser->cfg->ipset_name_v4 = $2;
3417356345Scy		#else
3418356345Scy			OUTYY(("P(Compiled without ipset, ignoring)\n"));
3419356345Scy			free($2);
3420356345Scy		#endif
3421356345Scy		}
3422356345Scy	;
3423356345Scy	ipset_name_v6: VAR_IPSET_NAME_V6 STRING_ARG
3424356345Scy	{
3425356345Scy		#ifdef USE_IPSET
3426356345Scy			OUTYY(("P(name-v6:%s)\n", $2));
3427356345Scy			if(cfg_parser->cfg->ipset_name_v6)
3428356345Scy				yyerror("ipset name v6 override, there must be one "
3429356345Scy					"name for ip v6");
3430356345Scy			free(cfg_parser->cfg->ipset_name_v6);
3431356345Scy			cfg_parser->cfg->ipset_name_v6 = $2;
3432356345Scy		#else
3433356345Scy			OUTYY(("P(Compiled without ipset, ignoring)\n"));
3434356345Scy			free($2);
3435356345Scy		#endif
3436356345Scy		}
3437356345Scy	;
3438238106Sdes%%
3439238106Sdes
3440238106Sdes/* parse helper routines could be here */
3441356345Scystatic void
3442356345Scyvalidate_respip_action(const char* action)
3443356345Scy{
3444356345Scy	if(strcmp(action, "deny")!=0 &&
3445356345Scy		strcmp(action, "redirect")!=0 &&
3446356345Scy		strcmp(action, "inform")!=0 &&
3447356345Scy		strcmp(action, "inform_deny")!=0 &&
3448356345Scy		strcmp(action, "always_transparent")!=0 &&
3449356345Scy		strcmp(action, "always_refuse")!=0 &&
3450356345Scy		strcmp(action, "always_nxdomain")!=0)
3451356345Scy	{
3452356345Scy		yyerror("response-ip action: expected deny, redirect, "
3453356345Scy			"inform, inform_deny, always_transparent, "
3454356345Scy			"always_refuse or always_nxdomain");
3455356345Scy	}
3456356345Scy}
3457356345Scy
3458356345Scy
3459