xref: /openbsd-src/usr.sbin/unbound/util/configparser.y (revision 98bc733b08604094f4138174a0ee0bb9faaca4bd)
1933707f3Ssthen /*
2933707f3Ssthen  * configparser.y -- yacc grammar for unbound configuration files
3933707f3Ssthen  *
4933707f3Ssthen  * Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
5933707f3Ssthen  *
6933707f3Ssthen  * Copyright (c) 2007, NLnet Labs. All rights reserved.
7933707f3Ssthen  *
8933707f3Ssthen  * This software is open source.
9933707f3Ssthen  *
10933707f3Ssthen  * Redistribution and use in source and binary forms, with or without
11933707f3Ssthen  * modification, are permitted provided that the following conditions
12933707f3Ssthen  * are met:
13933707f3Ssthen  *
14933707f3Ssthen  * Redistributions of source code must retain the above copyright notice,
15933707f3Ssthen  * this list of conditions and the following disclaimer.
16933707f3Ssthen  *
17933707f3Ssthen  * Redistributions in binary form must reproduce the above copyright notice,
18933707f3Ssthen  * this list of conditions and the following disclaimer in the documentation
19933707f3Ssthen  * and/or other materials provided with the distribution.
20933707f3Ssthen  *
21933707f3Ssthen  * Neither the name of the NLNET LABS nor the names of its contributors may
22933707f3Ssthen  * be used to endorse or promote products derived from this software without
23933707f3Ssthen  * specific prior written permission.
24933707f3Ssthen  *
25933707f3Ssthen  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
265d76a658Ssthen  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
275d76a658Ssthen  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
285d76a658Ssthen  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
295d76a658Ssthen  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
305d76a658Ssthen  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
315d76a658Ssthen  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
325d76a658Ssthen  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
335d76a658Ssthen  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
345d76a658Ssthen  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
355d76a658Ssthen  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36933707f3Ssthen  */
37933707f3Ssthen 
38933707f3Ssthen %{
39933707f3Ssthen #include "config.h"
40933707f3Ssthen 
41933707f3Ssthen #include <stdarg.h>
42933707f3Ssthen #include <stdio.h>
43933707f3Ssthen #include <string.h>
44933707f3Ssthen #include <stdlib.h>
45933707f3Ssthen #include <assert.h>
46933707f3Ssthen 
47933707f3Ssthen #include "util/configyyrename.h"
48933707f3Ssthen #include "util/config_file.h"
49933707f3Ssthen #include "util/net_help.h"
508b7325afSsthen #include "sldns/str2wire.h"
51933707f3Ssthen 
52933707f3Ssthen int ub_c_lex(void);
53933707f3Ssthen void ub_c_error(const char *message);
54933707f3Ssthen 
552be9e038Ssthen static void validate_respip_action(const char* action);
5645872187Ssthen static void validate_acl_action(const char* action);
572be9e038Ssthen 
58933707f3Ssthen /* these need to be global, otherwise they cannot be used inside yacc */
59933707f3Ssthen extern struct config_parser_state* cfg_parser;
60933707f3Ssthen 
61933707f3Ssthen #if 0
62933707f3Ssthen #define OUTYY(s)  printf s /* used ONLY when debugging */
63933707f3Ssthen #else
64933707f3Ssthen #define OUTYY(s)
65933707f3Ssthen #endif
66933707f3Ssthen 
67933707f3Ssthen %}
68933707f3Ssthen %union {
69933707f3Ssthen 	char*	str;
70933707f3Ssthen };
71933707f3Ssthen 
72933707f3Ssthen %token SPACE LETTER NEWLINE COMMENT COLON ANY ZONESTR
73933707f3Ssthen %token <str> STRING_ARG
74a3167c07Ssthen %token VAR_FORCE_TOPLEVEL
75933707f3Ssthen %token VAR_SERVER VAR_VERBOSITY VAR_NUM_THREADS VAR_PORT
76a3167c07Ssthen %token VAR_OUTGOING_RANGE VAR_INTERFACE VAR_PREFER_IP4
778b7325afSsthen %token VAR_DO_IP4 VAR_DO_IP6 VAR_DO_NAT64 VAR_PREFER_IP6 VAR_DO_UDP VAR_DO_TCP
782308e98cSsthen %token VAR_TCP_MSS VAR_OUTGOING_TCP_MSS VAR_TCP_IDLE_TIMEOUT
792308e98cSsthen %token VAR_EDNS_TCP_KEEPALIVE VAR_EDNS_TCP_KEEPALIVE_TIMEOUT
808b7325afSsthen %token VAR_SOCK_QUEUE_TIMEOUT
81933707f3Ssthen %token VAR_CHROOT VAR_USERNAME VAR_DIRECTORY VAR_LOGFILE VAR_PIDFILE
82933707f3Ssthen %token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS VAR_NUM_QUERIES_PER_THREAD
83933707f3Ssthen %token VAR_RRSET_CACHE_SIZE VAR_RRSET_CACHE_SLABS VAR_OUTGOING_NUM_TCP
84933707f3Ssthen %token VAR_INFRA_HOST_TTL VAR_INFRA_LAME_TTL VAR_INFRA_CACHE_SLABS
85933707f3Ssthen %token VAR_INFRA_CACHE_NUMHOSTS VAR_INFRA_CACHE_LAME_SIZE VAR_NAME
86933707f3Ssthen %token VAR_STUB_ZONE VAR_STUB_HOST VAR_STUB_ADDR VAR_TARGET_FETCH_POLICY
87933707f3Ssthen %token VAR_HARDEN_SHORT_BUFSIZE VAR_HARDEN_LARGE_QUERIES
88933707f3Ssthen %token VAR_FORWARD_ZONE VAR_FORWARD_HOST VAR_FORWARD_ADDR
89933707f3Ssthen %token VAR_DO_NOT_QUERY_ADDRESS VAR_HIDE_IDENTITY VAR_HIDE_VERSION
90933707f3Ssthen %token VAR_IDENTITY VAR_VERSION VAR_HARDEN_GLUE VAR_MODULE_CONF
91933707f3Ssthen %token VAR_TRUST_ANCHOR_FILE VAR_TRUST_ANCHOR VAR_VAL_OVERRIDE_DATE
92933707f3Ssthen %token VAR_BOGUS_TTL VAR_VAL_CLEAN_ADDITIONAL VAR_VAL_PERMISSIVE_MODE
93933707f3Ssthen %token VAR_INCOMING_NUM_TCP VAR_MSG_BUFFER_SIZE VAR_KEY_CACHE_SIZE
94933707f3Ssthen %token VAR_KEY_CACHE_SLABS VAR_TRUSTED_KEYS_FILE
95933707f3Ssthen %token VAR_VAL_NSEC3_KEYSIZE_ITERATIONS VAR_USE_SYSLOG
96933707f3Ssthen %token VAR_OUTGOING_INTERFACE VAR_ROOT_HINTS VAR_DO_NOT_QUERY_LOCALHOST
97933707f3Ssthen %token VAR_CACHE_MAX_TTL VAR_HARDEN_DNSSEC_STRIPPED VAR_ACCESS_CONTROL
98933707f3Ssthen %token VAR_LOCAL_ZONE VAR_LOCAL_DATA VAR_INTERFACE_AUTOMATIC
99933707f3Ssthen %token VAR_STATISTICS_INTERVAL VAR_DO_DAEMONIZE VAR_USE_CAPS_FOR_ID
100933707f3Ssthen %token VAR_STATISTICS_CUMULATIVE VAR_OUTGOING_PORT_PERMIT
101933707f3Ssthen %token VAR_OUTGOING_PORT_AVOID VAR_DLV_ANCHOR_FILE VAR_DLV_ANCHOR
102933707f3Ssthen %token VAR_NEG_CACHE_SIZE VAR_HARDEN_REFERRAL_PATH VAR_PRIVATE_ADDRESS
103933707f3Ssthen %token VAR_PRIVATE_DOMAIN VAR_REMOTE_CONTROL VAR_CONTROL_ENABLE
104933707f3Ssthen %token VAR_CONTROL_INTERFACE VAR_CONTROL_PORT VAR_SERVER_KEY_FILE
105933707f3Ssthen %token VAR_SERVER_CERT_FILE VAR_CONTROL_KEY_FILE VAR_CONTROL_CERT_FILE
106191f22c6Ssthen %token VAR_CONTROL_USE_CERT VAR_TCP_REUSE_TIMEOUT VAR_MAX_REUSE_TCP_QUERIES
107933707f3Ssthen %token VAR_EXTENDED_STATISTICS VAR_LOCAL_DATA_PTR VAR_JOSTLE_TIMEOUT
108933707f3Ssthen %token VAR_STUB_PRIME VAR_UNWANTED_REPLY_THRESHOLD VAR_LOG_TIME_ASCII
109933707f3Ssthen %token VAR_DOMAIN_INSECURE VAR_PYTHON VAR_PYTHON_SCRIPT VAR_VAL_SIG_SKEW_MIN
110191f22c6Ssthen %token VAR_VAL_SIG_SKEW_MAX VAR_VAL_MAX_RESTART VAR_CACHE_MIN_TTL
111191f22c6Ssthen %token VAR_VAL_LOG_LEVEL VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING
112191f22c6Ssthen %token VAR_ADD_HOLDDOWN VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE
113191f22c6Ssthen %token VAR_PREFETCH VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT
114191f22c6Ssthen %token VAR_HARDEN_BELOW_NXDOMAIN VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES
115191f22c6Ssthen %token VAR_LOG_REPLIES VAR_LOG_LOCAL_ACTIONS VAR_TCP_UPSTREAM
116191f22c6Ssthen %token VAR_SSL_UPSTREAM VAR_TCP_AUTH_QUERY_TIMEOUT VAR_SSL_SERVICE_KEY
117191f22c6Ssthen %token VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST
118938a3a5eSflorian %token VAR_STUB_SSL_UPSTREAM VAR_FORWARD_SSL_UPSTREAM VAR_TLS_CERT_BUNDLE
119e21c60efSsthen %token VAR_STUB_TCP_UPSTREAM VAR_FORWARD_TCP_UPSTREAM
1202c144df0Ssthen %token VAR_HTTPS_PORT VAR_HTTP_ENDPOINT VAR_HTTP_MAX_STREAMS
1212c144df0Ssthen %token VAR_HTTP_QUERY_BUFFER_SIZE VAR_HTTP_RESPONSE_BUFFER_SIZE
122eba819a2Ssthen %token VAR_HTTP_NODELAY VAR_HTTP_NOTLS_DOWNSTREAM
123d8d14d0cSsthen %token VAR_STUB_FIRST VAR_MINIMAL_RESPONSES VAR_RRSET_ROUNDROBIN
124eba819a2Ssthen %token VAR_MAX_UDP_SIZE VAR_DELAY_CLOSE VAR_UDP_CONNECT
12532e31f52Ssthen %token VAR_UNBLOCK_LAN_ZONES VAR_INSECURE_LAN_ZONES
126d1e2768aSsthen %token VAR_INFRA_CACHE_MIN_RTT VAR_INFRA_CACHE_MAX_RTT VAR_INFRA_KEEP_PROBING
1272308e98cSsthen %token VAR_DNS64_PREFIX VAR_DNS64_SYNTHALL VAR_DNS64_IGNORE_AAAA
1288b7325afSsthen %token VAR_NAT64_PREFIX
129a3167c07Ssthen %token VAR_DNSTAP VAR_DNSTAP_ENABLE VAR_DNSTAP_SOCKET_PATH VAR_DNSTAP_IP
130a3167c07Ssthen %token VAR_DNSTAP_TLS VAR_DNSTAP_TLS_SERVER_NAME VAR_DNSTAP_TLS_CERT_BUNDLE
131a3167c07Ssthen %token VAR_DNSTAP_TLS_CLIENT_KEY_FILE VAR_DNSTAP_TLS_CLIENT_CERT_FILE
132a3167c07Ssthen %token VAR_DNSTAP_SEND_IDENTITY VAR_DNSTAP_SEND_VERSION VAR_DNSTAP_BIDIRECTIONAL
13398f3ca02Sbrad %token VAR_DNSTAP_IDENTITY VAR_DNSTAP_VERSION
13498f3ca02Sbrad %token VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES
13598f3ca02Sbrad %token VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES
13698f3ca02Sbrad %token VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES
13798f3ca02Sbrad %token VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES
13898f3ca02Sbrad %token VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES
13998f3ca02Sbrad %token VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES
140*98bc733bSsthen %token VAR_DNSTAP_SAMPLE_RATE
1412be9e038Ssthen %token VAR_RESPONSE_IP_TAG VAR_RESPONSE_IP VAR_RESPONSE_IP_DATA
142fdfb4ba6Ssthen %token VAR_HARDEN_ALGO_DOWNGRADE VAR_IP_TRANSPARENT
143a3167c07Ssthen %token VAR_IP_DSCP
1442ee382b6Ssthen %token VAR_DISABLE_DNSSEC_LAME_CHECK
14577079be7Ssthen %token VAR_IP_RATELIMIT VAR_IP_RATELIMIT_SLABS VAR_IP_RATELIMIT_SIZE
146fdfb4ba6Ssthen %token VAR_RATELIMIT VAR_RATELIMIT_SLABS VAR_RATELIMIT_SIZE
1478b7325afSsthen %token VAR_OUTBOUND_MSG_RETRY VAR_MAX_SENT_COUNT VAR_MAX_QUERY_RESTARTS
14877079be7Ssthen %token VAR_RATELIMIT_FOR_DOMAIN VAR_RATELIMIT_BELOW_DOMAIN
14977079be7Ssthen %token VAR_IP_RATELIMIT_FACTOR VAR_RATELIMIT_FACTOR
150e21c60efSsthen %token VAR_IP_RATELIMIT_BACKOFF VAR_RATELIMIT_BACKOFF
1512be9e038Ssthen %token VAR_SEND_CLIENT_SUBNET VAR_CLIENT_SUBNET_ZONE
1522be9e038Ssthen %token VAR_CLIENT_SUBNET_ALWAYS_FORWARD VAR_CLIENT_SUBNET_OPCODE
1532be9e038Ssthen %token VAR_MAX_CLIENT_SUBNET_IPV4 VAR_MAX_CLIENT_SUBNET_IPV6
1543150e5f6Ssthen %token VAR_MIN_CLIENT_SUBNET_IPV4 VAR_MIN_CLIENT_SUBNET_IPV6
1553150e5f6Ssthen %token VAR_MAX_ECS_TREE_SIZE_IPV4 VAR_MAX_ECS_TREE_SIZE_IPV6
156a961b961Ssthen %token VAR_CAPS_WHITELIST VAR_CACHE_MAX_NEGATIVE_TTL VAR_PERMIT_SMALL_HOLDDOWN
1572bdc0ed1Ssthen %token VAR_CACHE_MIN_NEGATIVE_TTL
15877079be7Ssthen %token VAR_QNAME_MINIMISATION VAR_QNAME_MINIMISATION_STRICT VAR_IP_FREEBIND
15977079be7Ssthen %token VAR_DEFINE_TAG VAR_LOCAL_ZONE_TAG VAR_ACCESS_CONTROL_TAG
16077079be7Ssthen %token VAR_LOCAL_ZONE_OVERRIDE VAR_ACCESS_CONTROL_TAG_ACTION
16177079be7Ssthen %token VAR_ACCESS_CONTROL_TAG_DATA VAR_VIEW VAR_ACCESS_CONTROL_VIEW
1622308e98cSsthen %token VAR_VIEW_FIRST VAR_SERVE_EXPIRED VAR_SERVE_EXPIRED_TTL
163eaf2578eSsthen %token VAR_SERVE_EXPIRED_TTL_RESET VAR_SERVE_EXPIRED_REPLY_TTL
1640bdb4f62Ssthen %token VAR_SERVE_EXPIRED_CLIENT_TIMEOUT VAR_EDE_SERVE_EXPIRED
1650bdb4f62Ssthen %token VAR_SERVE_ORIGINAL_TTL VAR_FAKE_DSA
166eaf2578eSsthen %token VAR_FAKE_SHA1 VAR_LOG_IDENTITY VAR_HIDE_TRUSTANCHOR
167191f22c6Ssthen %token VAR_HIDE_HTTP_USER_AGENT VAR_HTTP_USER_AGENT
168eaf2578eSsthen %token VAR_TRUST_ANCHOR_SIGNALING VAR_AGGRESSIVE_NSEC VAR_USE_SYSTEMD
169eaf2578eSsthen %token VAR_SHM_ENABLE VAR_SHM_KEY VAR_ROOT_KEY_SENTINEL
1702be9e038Ssthen %token VAR_DNSCRYPT VAR_DNSCRYPT_ENABLE VAR_DNSCRYPT_PORT VAR_DNSCRYPT_PROVIDER
1712be9e038Ssthen %token VAR_DNSCRYPT_SECRET_KEY VAR_DNSCRYPT_PROVIDER_CERT
172bdfc4d55Sflorian %token VAR_DNSCRYPT_PROVIDER_CERT_ROTATED
1737191de28Ssthen %token VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE
1747191de28Ssthen %token VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS
175bdfc4d55Sflorian %token VAR_DNSCRYPT_NONCE_CACHE_SIZE
176bdfc4d55Sflorian %token VAR_DNSCRYPT_NONCE_CACHE_SLABS
1779982a05dSsthen %token VAR_PAD_RESPONSES VAR_PAD_RESPONSES_BLOCK_SIZE
1789982a05dSsthen %token VAR_PAD_QUERIES VAR_PAD_QUERIES_BLOCK_SIZE
1792be9e038Ssthen %token VAR_IPSECMOD_ENABLED VAR_IPSECMOD_HOOK VAR_IPSECMOD_IGNORE_BOGUS
1802be9e038Ssthen %token VAR_IPSECMOD_MAX_TTL VAR_IPSECMOD_WHITELIST VAR_IPSECMOD_STRICT
1817191de28Ssthen %token VAR_CACHEDB VAR_CACHEDB_BACKEND VAR_CACHEDB_SECRETSEED
18220237c55Ssthen %token VAR_CACHEDB_REDISHOST VAR_CACHEDB_REDISPORT VAR_CACHEDB_REDISTIMEOUT
1838b7325afSsthen %token VAR_CACHEDB_REDISEXPIRERECORDS VAR_CACHEDB_REDISPATH VAR_CACHEDB_REDISPASSWORD
184d896b962Ssthen %token VAR_CACHEDB_REDISLOGICALDB
185bdfc4d55Sflorian %token VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM VAR_FOR_UPSTREAM
186bdfc4d55Sflorian %token VAR_AUTH_ZONE VAR_ZONEFILE VAR_MASTER VAR_URL VAR_FOR_DOWNSTREAM
18720237c55Ssthen %token VAR_FALLBACK_ENABLED VAR_TLS_ADDITIONAL_PORT VAR_LOW_RTT VAR_LOW_RTT_PERMIL
1883150e5f6Ssthen %token VAR_FAST_SERVER_PERMIL VAR_FAST_SERVER_NUM
1892308e98cSsthen %token VAR_ALLOW_NOTIFY VAR_TLS_WIN_CERT VAR_TCP_CONNECTION_LIMIT
1908b7325afSsthen %token VAR_ANSWER_COOKIE VAR_COOKIE_SECRET VAR_IP_RATELIMIT_COOKIE
1913150e5f6Ssthen %token VAR_FORWARD_NO_CACHE VAR_STUB_NO_CACHE VAR_LOG_SERVFAIL VAR_DENY_ANY
192f6b99bafSsthen %token VAR_UNKNOWN_SERVER_TIME_LIMIT VAR_LOG_TAG_QUERYREPLY
1932bdc0ed1Ssthen %token VAR_DISCARD_TIMEOUT VAR_WAIT_LIMIT VAR_WAIT_LIMIT_COOKIE
1942bdc0ed1Ssthen %token VAR_WAIT_LIMIT_NETBLOCK VAR_WAIT_LIMIT_COOKIE_NETBLOCK
195a3167c07Ssthen %token VAR_STREAM_WAIT_SIZE VAR_TLS_CIPHERS VAR_TLS_CIPHERSUITES VAR_TLS_USE_SNI
1968240c1b9Ssthen %token VAR_IPSET VAR_IPSET_NAME_V4 VAR_IPSET_NAME_V6
197eaf2578eSsthen %token VAR_TLS_SESSION_TICKET_KEYS VAR_RPZ VAR_TAGS VAR_RPZ_ACTION_OVERRIDE
198eaf2578eSsthen %token VAR_RPZ_CNAME_OVERRIDE VAR_RPZ_LOG VAR_RPZ_LOG_NAME
199eba819a2Ssthen %token VAR_DYNLIB VAR_DYNLIB_FILE VAR_EDNS_CLIENT_STRING
2009982a05dSsthen %token VAR_EDNS_CLIENT_STRING_OPCODE VAR_NSID
201191f22c6Ssthen %token VAR_ZONEMD_PERMISSIVE_MODE VAR_ZONEMD_CHECK VAR_ZONEMD_REJECT_ABSENCE
2020bdb4f62Ssthen %token VAR_RPZ_SIGNAL_NXDOMAIN_RA VAR_INTERFACE_AUTOMATIC_PORTS VAR_EDE
20345872187Ssthen %token VAR_INTERFACE_ACTION VAR_INTERFACE_VIEW VAR_INTERFACE_TAG
20445872187Ssthen %token VAR_INTERFACE_TAG_ACTION VAR_INTERFACE_TAG_DATA
2058b7325afSsthen %token VAR_PROXY_PROTOCOL_PORT VAR_STATISTICS_INHIBIT_ZERO
206d896b962Ssthen %token VAR_HARDEN_UNKNOWN_ADDITIONAL VAR_DISABLE_EDNS_DO VAR_CACHEDB_NO_STORE
2072bdc0ed1Ssthen %token VAR_LOG_DESTADDR VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED
208*98bc733bSsthen %token VAR_COOKIE_SECRET_FILE
209933707f3Ssthen 
210933707f3Ssthen %%
211933707f3Ssthen toplevelvars: /* empty */ | toplevelvars toplevelvar ;
212933707f3Ssthen toplevelvar: serverstart contents_server | stubstart contents_stub |
213933707f3Ssthen 	forwardstart contents_forward | pythonstart contents_py |
214bdfc4d55Sflorian 	rcstart contents_rc | dtstart contents_dt | viewstart contents_view |
215bdfc4d55Sflorian 	dnscstart contents_dnsc | cachedbstart contents_cachedb |
216eaf2578eSsthen 	ipsetstart contents_ipset | authstart contents_auth |
217a3167c07Ssthen 	rpzstart contents_rpz | dynlibstart contents_dl |
218a3167c07Ssthen 	force_toplevel
219933707f3Ssthen 	;
220a3167c07Ssthen force_toplevel: VAR_FORCE_TOPLEVEL
221a3167c07Ssthen 	{
222a3167c07Ssthen 		OUTYY(("\nP(force-toplevel)\n"));
22345872187Ssthen 		cfg_parser->started_toplevel = 0;
224a3167c07Ssthen 	}
225a3167c07Ssthen 	;
226933707f3Ssthen /* server: declaration */
227933707f3Ssthen serverstart: VAR_SERVER
228933707f3Ssthen 	{
229933707f3Ssthen 		OUTYY(("\nP(server:)\n"));
23045872187Ssthen 		cfg_parser->started_toplevel = 1;
231933707f3Ssthen 	}
232933707f3Ssthen 	;
233933707f3Ssthen contents_server: contents_server content_server
234933707f3Ssthen 	| ;
235933707f3Ssthen content_server: server_num_threads | server_verbosity | server_port |
236933707f3Ssthen 	server_outgoing_range | server_do_ip4 |
2378b7325afSsthen 	server_do_ip6 | server_do_nat64 | server_prefer_ip4 |
2388b7325afSsthen 	server_prefer_ip6 | server_do_udp | server_do_tcp |
2392308e98cSsthen 	server_tcp_mss | server_outgoing_tcp_mss | server_tcp_idle_timeout |
2402308e98cSsthen 	server_tcp_keepalive | server_tcp_keepalive_timeout |
2418b7325afSsthen 	server_sock_queue_timeout |
242933707f3Ssthen 	server_interface | server_chroot | server_username |
243933707f3Ssthen 	server_directory | server_logfile | server_pidfile |
244933707f3Ssthen 	server_msg_cache_size | server_msg_cache_slabs |
245933707f3Ssthen 	server_num_queries_per_thread | server_rrset_cache_size |
246933707f3Ssthen 	server_rrset_cache_slabs | server_outgoing_num_tcp |
247933707f3Ssthen 	server_infra_host_ttl | server_infra_lame_ttl |
248933707f3Ssthen 	server_infra_cache_slabs | server_infra_cache_numhosts |
249933707f3Ssthen 	server_infra_cache_lame_size | server_target_fetch_policy |
250933707f3Ssthen 	server_harden_short_bufsize | server_harden_large_queries |
251933707f3Ssthen 	server_do_not_query_address | server_hide_identity |
252933707f3Ssthen 	server_hide_version | server_identity | server_version |
253191f22c6Ssthen 	server_hide_http_user_agent | server_http_user_agent |
254933707f3Ssthen 	server_harden_glue | server_module_conf | server_trust_anchor_file |
255933707f3Ssthen 	server_trust_anchor | server_val_override_date | server_bogus_ttl |
256933707f3Ssthen 	server_val_clean_additional | server_val_permissive_mode |
257933707f3Ssthen 	server_incoming_num_tcp | server_msg_buffer_size |
258933707f3Ssthen 	server_key_cache_size | server_key_cache_slabs |
259933707f3Ssthen 	server_trusted_keys_file | server_val_nsec3_keysize_iterations |
260933707f3Ssthen 	server_use_syslog | server_outgoing_interface | server_root_hints |
261933707f3Ssthen 	server_do_not_query_localhost | server_cache_max_ttl |
262933707f3Ssthen 	server_harden_dnssec_stripped | server_access_control |
263933707f3Ssthen 	server_local_zone | server_local_data | server_interface_automatic |
264933707f3Ssthen 	server_statistics_interval | server_do_daemonize |
265933707f3Ssthen 	server_use_caps_for_id | server_statistics_cumulative |
266933707f3Ssthen 	server_outgoing_port_permit | server_outgoing_port_avoid |
267933707f3Ssthen 	server_dlv_anchor_file | server_dlv_anchor | server_neg_cache_size |
268933707f3Ssthen 	server_harden_referral_path | server_private_address |
269933707f3Ssthen 	server_private_domain | server_extended_statistics |
270933707f3Ssthen 	server_local_data_ptr | server_jostle_timeout |
271933707f3Ssthen 	server_unwanted_reply_threshold | server_log_time_ascii |
272933707f3Ssthen 	server_domain_insecure | server_val_sig_skew_min |
273191f22c6Ssthen 	server_val_sig_skew_max | server_val_max_restart |
274191f22c6Ssthen 	server_cache_min_ttl | server_val_log_level |
275933707f3Ssthen 	server_auto_trust_anchor_file |	server_add_holddown |
276933707f3Ssthen 	server_del_holddown | server_keep_missing | server_so_rcvbuf |
277933707f3Ssthen 	server_edns_buffer_size | server_prefetch | server_prefetch_key |
278933707f3Ssthen 	server_so_sndbuf | server_harden_below_nxdomain | server_ignore_cd_flag |
27977079be7Ssthen 	server_log_queries | server_log_replies | server_tcp_upstream | server_ssl_upstream |
2802308e98cSsthen 	server_log_local_actions |
281d8d14d0cSsthen 	server_ssl_service_key | server_ssl_service_pem | server_ssl_port |
2822c144df0Ssthen 	server_https_port | server_http_endpoint | server_http_max_streams |
2832c144df0Ssthen 	server_http_query_buffer_size | server_http_response_buffer_size |
284eba819a2Ssthen 	server_http_nodelay | server_http_notls_downstream |
2855d76a658Ssthen 	server_minimal_responses | server_rrset_roundrobin | server_max_udp_size |
286eba819a2Ssthen 	server_so_reuseport | server_delay_close | server_udp_connect |
28732e31f52Ssthen 	server_unblock_lan_zones | server_insecure_lan_zones |
2882308e98cSsthen 	server_dns64_prefix | server_dns64_synthall | server_dns64_ignore_aaaa |
2898b7325afSsthen 	server_nat64_prefix |
290d1e2768aSsthen 	server_infra_cache_min_rtt | server_infra_cache_max_rtt | server_harden_algo_downgrade |
29177079be7Ssthen 	server_ip_transparent | server_ip_ratelimit | server_ratelimit |
292eba819a2Ssthen 	server_ip_dscp | server_infra_keep_probing |
29377079be7Ssthen 	server_ip_ratelimit_slabs | server_ratelimit_slabs |
29477079be7Ssthen 	server_ip_ratelimit_size | server_ratelimit_size |
29577079be7Ssthen 	server_ratelimit_for_domain |
296fdfb4ba6Ssthen 	server_ratelimit_below_domain | server_ratelimit_factor |
297e21c60efSsthen 	server_ip_ratelimit_factor | server_ratelimit_backoff |
298e21c60efSsthen 	server_ip_ratelimit_backoff | server_outbound_msg_retry |
2998b7325afSsthen 	server_max_sent_count | server_max_query_restarts |
300e21c60efSsthen 	server_send_client_subnet | server_client_subnet_zone |
301e21c60efSsthen 	server_client_subnet_always_forward | server_client_subnet_opcode |
3022be9e038Ssthen 	server_max_client_subnet_ipv4 | server_max_client_subnet_ipv6 |
3033150e5f6Ssthen 	server_min_client_subnet_ipv4 | server_min_client_subnet_ipv6 |
3043150e5f6Ssthen 	server_max_ecs_tree_size_ipv4 | server_max_ecs_tree_size_ipv6 |
305a961b961Ssthen 	server_caps_whitelist | server_cache_max_negative_ttl |
3062bdc0ed1Ssthen 	server_cache_min_negative_ttl |
3072ee382b6Ssthen 	server_permit_small_holddown | server_qname_minimisation |
3082ee382b6Ssthen 	server_ip_freebind | server_define_tag | server_local_zone_tag |
30977079be7Ssthen 	server_disable_dnssec_lame_check | server_access_control_tag |
31077079be7Ssthen 	server_local_zone_override | server_access_control_tag_action |
31177079be7Ssthen 	server_access_control_tag_data | server_access_control_view |
31245872187Ssthen 	server_interface_action | server_interface_view | server_interface_tag |
31345872187Ssthen 	server_interface_tag_action | server_interface_tag_data |
3149982a05dSsthen 	server_qname_minimisation_strict |
3159982a05dSsthen 	server_pad_responses | server_pad_responses_block_size |
3169982a05dSsthen 	server_pad_queries | server_pad_queries_block_size |
3179982a05dSsthen 	server_serve_expired |
3182308e98cSsthen 	server_serve_expired_ttl | server_serve_expired_ttl_reset |
319eaf2578eSsthen 	server_serve_expired_reply_ttl | server_serve_expired_client_timeout |
3200bdb4f62Ssthen 	server_ede_serve_expired | server_serve_original_ttl | server_fake_dsa |
3219982a05dSsthen 	server_log_identity | server_use_systemd |
3222be9e038Ssthen 	server_response_ip_tag | server_response_ip | server_response_ip_data |
3232be9e038Ssthen 	server_shm_enable | server_shm_key | server_fake_sha1 |
3242be9e038Ssthen 	server_hide_trustanchor | server_trust_anchor_signaling |
32520237c55Ssthen 	server_root_key_sentinel |
3262be9e038Ssthen 	server_ipsecmod_enabled | server_ipsecmod_hook |
3272be9e038Ssthen 	server_ipsecmod_ignore_bogus | server_ipsecmod_max_ttl |
328bdfc4d55Sflorian 	server_ipsecmod_whitelist | server_ipsecmod_strict |
329938a3a5eSflorian 	server_udp_upstream_without_downstream | server_aggressive_nsec |
33020237c55Ssthen 	server_tls_cert_bundle | server_tls_additional_port | server_low_rtt |
3313150e5f6Ssthen 	server_fast_server_permil | server_fast_server_num  | server_tls_win_cert |
3323150e5f6Ssthen 	server_tcp_connection_limit | server_log_servfail | server_deny_any |
333f6b99bafSsthen 	server_unknown_server_time_limit | server_log_tag_queryreply |
3342bdc0ed1Ssthen 	server_discard_timeout | server_wait_limit | server_wait_limit_cookie |
3352bdc0ed1Ssthen 	server_wait_limit_netblock | server_wait_limit_cookie_netblock |
336f6b99bafSsthen 	server_stream_wait_size | server_tls_ciphers |
337a3167c07Ssthen 	server_tls_ciphersuites | server_tls_session_ticket_keys |
3388b7325afSsthen 	server_answer_cookie | server_cookie_secret | server_ip_ratelimit_cookie |
339eba819a2Ssthen 	server_tls_use_sni | server_edns_client_string |
340191f22c6Ssthen 	server_edns_client_string_opcode | server_nsid |
341191f22c6Ssthen 	server_zonemd_permissive_mode | server_max_reuse_tcp_queries |
3420bdb4f62Ssthen 	server_tcp_reuse_timeout | server_tcp_auth_query_timeout |
34345872187Ssthen 	server_interface_automatic_ports | server_ede |
3448b7325afSsthen 	server_proxy_protocol_port | server_statistics_inhibit_zero |
345f46c52bfSsthen 	server_harden_unknown_additional | server_disable_edns_do |
346*98bc733bSsthen 	server_log_destaddr | server_cookie_secret_file
347933707f3Ssthen 	;
348933707f3Ssthen stubstart: VAR_STUB_ZONE
349933707f3Ssthen 	{
350933707f3Ssthen 		struct config_stub* s;
351933707f3Ssthen 		OUTYY(("\nP(stub_zone:)\n"));
35245872187Ssthen 		cfg_parser->started_toplevel = 1;
353933707f3Ssthen 		s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
354933707f3Ssthen 		if(s) {
355933707f3Ssthen 			s->next = cfg_parser->cfg->stubs;
356933707f3Ssthen 			cfg_parser->cfg->stubs = s;
357e21c60efSsthen 		} else {
358933707f3Ssthen 			yyerror("out of memory");
359933707f3Ssthen 		}
360e21c60efSsthen 	}
361933707f3Ssthen 	;
362*98bc733bSsthen contents_stub: content_stub contents_stub
363*98bc733bSsthen 	|
364*98bc733bSsthen 	{
365*98bc733bSsthen 		/* stub end */
366*98bc733bSsthen 		if(cfg_parser->cfg->stubs &&
367*98bc733bSsthen 			!cfg_parser->cfg->stubs->name)
368*98bc733bSsthen 			yyerror("stub-zone without name");
369*98bc733bSsthen 	};
37077079be7Ssthen content_stub: stub_name | stub_host | stub_addr | stub_prime | stub_first |
371e21c60efSsthen 	stub_no_cache | stub_ssl_upstream | stub_tcp_upstream
372933707f3Ssthen 	;
373933707f3Ssthen forwardstart: VAR_FORWARD_ZONE
374933707f3Ssthen 	{
375933707f3Ssthen 		struct config_stub* s;
376933707f3Ssthen 		OUTYY(("\nP(forward_zone:)\n"));
37745872187Ssthen 		cfg_parser->started_toplevel = 1;
378933707f3Ssthen 		s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
379933707f3Ssthen 		if(s) {
380933707f3Ssthen 			s->next = cfg_parser->cfg->forwards;
381933707f3Ssthen 			cfg_parser->cfg->forwards = s;
382e21c60efSsthen 		} else {
383933707f3Ssthen 			yyerror("out of memory");
384933707f3Ssthen 		}
385e21c60efSsthen 	}
386933707f3Ssthen 	;
387*98bc733bSsthen contents_forward: content_forward contents_forward
388*98bc733bSsthen 	|
389*98bc733bSsthen 	{
390*98bc733bSsthen 		/* forward end */
391*98bc733bSsthen 		if(cfg_parser->cfg->forwards &&
392*98bc733bSsthen 			!cfg_parser->cfg->forwards->name)
393*98bc733bSsthen 			yyerror("forward-zone without name");
394*98bc733bSsthen 	};
39577079be7Ssthen content_forward: forward_name | forward_host | forward_addr | forward_first |
396e21c60efSsthen 	forward_no_cache | forward_ssl_upstream | forward_tcp_upstream
39777079be7Ssthen 	;
39877079be7Ssthen viewstart: VAR_VIEW
39977079be7Ssthen 	{
40077079be7Ssthen 		struct config_view* s;
40177079be7Ssthen 		OUTYY(("\nP(view:)\n"));
40245872187Ssthen 		cfg_parser->started_toplevel = 1;
40377079be7Ssthen 		s = (struct config_view*)calloc(1, sizeof(struct config_view));
40477079be7Ssthen 		if(s) {
40577079be7Ssthen 			s->next = cfg_parser->cfg->views;
40677079be7Ssthen 			cfg_parser->cfg->views = s;
407e21c60efSsthen 		} else {
40877079be7Ssthen 			yyerror("out of memory");
40977079be7Ssthen 		}
410e21c60efSsthen 	}
41177079be7Ssthen 	;
412*98bc733bSsthen contents_view: content_view contents_view
413*98bc733bSsthen 	|
414*98bc733bSsthen 	{
415*98bc733bSsthen 		/* view end */
416*98bc733bSsthen 		if(cfg_parser->cfg->views &&
417*98bc733bSsthen 			!cfg_parser->cfg->views->name)
418*98bc733bSsthen 			yyerror("view without name");
419*98bc733bSsthen 	};
4202be9e038Ssthen content_view: view_name | view_local_zone | view_local_data | view_first |
4212be9e038Ssthen 		view_response_ip | view_response_ip_data | view_local_data_ptr
422933707f3Ssthen 	;
423bdfc4d55Sflorian authstart: VAR_AUTH_ZONE
424bdfc4d55Sflorian 	{
425bdfc4d55Sflorian 		struct config_auth* s;
426bdfc4d55Sflorian 		OUTYY(("\nP(auth_zone:)\n"));
42745872187Ssthen 		cfg_parser->started_toplevel = 1;
428bdfc4d55Sflorian 		s = (struct config_auth*)calloc(1, sizeof(struct config_auth));
429bdfc4d55Sflorian 		if(s) {
430bdfc4d55Sflorian 			s->next = cfg_parser->cfg->auths;
431bdfc4d55Sflorian 			cfg_parser->cfg->auths = s;
432bdfc4d55Sflorian 			/* defaults for auth zone */
433bdfc4d55Sflorian 			s->for_downstream = 1;
434bdfc4d55Sflorian 			s->for_upstream = 1;
435938a3a5eSflorian 			s->fallback_enabled = 0;
436191f22c6Ssthen 			s->zonemd_check = 0;
437191f22c6Ssthen 			s->zonemd_reject_absence = 0;
438eaf2578eSsthen 			s->isrpz = 0;
439e21c60efSsthen 		} else {
440bdfc4d55Sflorian 			yyerror("out of memory");
441bdfc4d55Sflorian 		}
442e21c60efSsthen 	}
443bdfc4d55Sflorian 	;
444bdfc4d55Sflorian contents_auth: contents_auth content_auth
445bdfc4d55Sflorian 	| ;
446bdfc4d55Sflorian content_auth: auth_name | auth_zonefile | auth_master | auth_url |
44720237c55Ssthen 	auth_for_downstream | auth_for_upstream | auth_fallback_enabled |
448191f22c6Ssthen 	auth_allow_notify | auth_zonemd_check | auth_zonemd_reject_absence
449bdfc4d55Sflorian 	;
450eaf2578eSsthen 
451eaf2578eSsthen rpz_tag: VAR_TAGS STRING_ARG
452eaf2578eSsthen 	{
453eaf2578eSsthen 		uint8_t* bitlist;
454eaf2578eSsthen 		size_t len = 0;
455eaf2578eSsthen 		OUTYY(("P(server_local_zone_tag:%s)\n", $2));
456eaf2578eSsthen 		bitlist = config_parse_taglist(cfg_parser->cfg, $2,
457eaf2578eSsthen 			&len);
458eaf2578eSsthen 		free($2);
459eaf2578eSsthen 		if(!bitlist) {
460eaf2578eSsthen 			yyerror("could not parse tags, (define-tag them first)");
461eaf2578eSsthen 		}
462eaf2578eSsthen 		if(bitlist) {
463eaf2578eSsthen 			cfg_parser->cfg->auths->rpz_taglist = bitlist;
464eaf2578eSsthen 			cfg_parser->cfg->auths->rpz_taglistlen = len;
465eaf2578eSsthen 
466eaf2578eSsthen 		}
467eaf2578eSsthen 	}
468eaf2578eSsthen 	;
469eaf2578eSsthen 
470eaf2578eSsthen rpz_action_override: VAR_RPZ_ACTION_OVERRIDE STRING_ARG
471eaf2578eSsthen 	{
472eaf2578eSsthen 		OUTYY(("P(rpz_action_override:%s)\n", $2));
473eaf2578eSsthen 		if(strcmp($2, "nxdomain")!=0 && strcmp($2, "nodata")!=0 &&
474eaf2578eSsthen 		   strcmp($2, "passthru")!=0 && strcmp($2, "drop")!=0 &&
475eaf2578eSsthen 		   strcmp($2, "cname")!=0 && strcmp($2, "disabled")!=0) {
476eaf2578eSsthen 			yyerror("rpz-action-override action: expected nxdomain, "
477eaf2578eSsthen 				"nodata, passthru, drop, cname or disabled");
478eaf2578eSsthen 			free($2);
479eaf2578eSsthen 			cfg_parser->cfg->auths->rpz_action_override = NULL;
480eaf2578eSsthen 		}
481eaf2578eSsthen 		else {
482eaf2578eSsthen 			cfg_parser->cfg->auths->rpz_action_override = $2;
483eaf2578eSsthen 		}
484eaf2578eSsthen 	}
485eaf2578eSsthen 	;
486eaf2578eSsthen 
487eaf2578eSsthen rpz_cname_override: VAR_RPZ_CNAME_OVERRIDE STRING_ARG
488eaf2578eSsthen 	{
489eaf2578eSsthen 		OUTYY(("P(rpz_cname_override:%s)\n", $2));
490eaf2578eSsthen 		free(cfg_parser->cfg->auths->rpz_cname);
491eaf2578eSsthen 		cfg_parser->cfg->auths->rpz_cname = $2;
492eaf2578eSsthen 	}
493eaf2578eSsthen 	;
494eaf2578eSsthen 
495eaf2578eSsthen rpz_log: VAR_RPZ_LOG STRING_ARG
496eaf2578eSsthen 	{
497eaf2578eSsthen 		OUTYY(("P(rpz_log:%s)\n", $2));
498eaf2578eSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
499eaf2578eSsthen 			yyerror("expected yes or no.");
500eaf2578eSsthen 		else cfg_parser->cfg->auths->rpz_log = (strcmp($2, "yes")==0);
501eaf2578eSsthen 		free($2);
502eaf2578eSsthen 	}
503eaf2578eSsthen 	;
504eaf2578eSsthen 
505eaf2578eSsthen rpz_log_name: VAR_RPZ_LOG_NAME STRING_ARG
506eaf2578eSsthen 	{
507eaf2578eSsthen 		OUTYY(("P(rpz_log_name:%s)\n", $2));
508eaf2578eSsthen 		free(cfg_parser->cfg->auths->rpz_log_name);
509eaf2578eSsthen 		cfg_parser->cfg->auths->rpz_log_name = $2;
510eaf2578eSsthen 	}
511eaf2578eSsthen 	;
512e21c60efSsthen rpz_signal_nxdomain_ra: VAR_RPZ_SIGNAL_NXDOMAIN_RA STRING_ARG
513e21c60efSsthen 	{
514e21c60efSsthen 		OUTYY(("P(rpz_signal_nxdomain_ra:%s)\n", $2));
515e21c60efSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
516e21c60efSsthen 			yyerror("expected yes or no.");
517e21c60efSsthen 		else cfg_parser->cfg->auths->rpz_signal_nxdomain_ra = (strcmp($2, "yes")==0);
518e21c60efSsthen 		free($2);
519e21c60efSsthen 	}
520e21c60efSsthen 	;
521eaf2578eSsthen 
522eaf2578eSsthen rpzstart: VAR_RPZ
523eaf2578eSsthen 	{
524eaf2578eSsthen 		struct config_auth* s;
525eaf2578eSsthen 		OUTYY(("\nP(rpz:)\n"));
52645872187Ssthen 		cfg_parser->started_toplevel = 1;
527eaf2578eSsthen 		s = (struct config_auth*)calloc(1, sizeof(struct config_auth));
528eaf2578eSsthen 		if(s) {
529eaf2578eSsthen 			s->next = cfg_parser->cfg->auths;
530eaf2578eSsthen 			cfg_parser->cfg->auths = s;
531eaf2578eSsthen 			/* defaults for RPZ auth zone */
532eaf2578eSsthen 			s->for_downstream = 0;
533eaf2578eSsthen 			s->for_upstream = 0;
534eaf2578eSsthen 			s->fallback_enabled = 0;
535eaf2578eSsthen 			s->isrpz = 1;
536e21c60efSsthen 		} else {
537eaf2578eSsthen 			yyerror("out of memory");
538eaf2578eSsthen 		}
539e21c60efSsthen 	}
540eaf2578eSsthen 	;
541eaf2578eSsthen contents_rpz: contents_rpz content_rpz
542eaf2578eSsthen 	| ;
543eaf2578eSsthen content_rpz: auth_name | auth_zonefile | rpz_tag | auth_master | auth_url |
544eaf2578eSsthen 	   auth_allow_notify | rpz_action_override | rpz_cname_override |
545e21c60efSsthen 	   rpz_log | rpz_log_name | rpz_signal_nxdomain_ra | auth_for_downstream
546eaf2578eSsthen 	;
547933707f3Ssthen server_num_threads: VAR_NUM_THREADS STRING_ARG
548933707f3Ssthen 	{
549933707f3Ssthen 		OUTYY(("P(server_num_threads:%s)\n", $2));
550933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
551933707f3Ssthen 			yyerror("number expected");
552933707f3Ssthen 		else cfg_parser->cfg->num_threads = atoi($2);
553933707f3Ssthen 		free($2);
554933707f3Ssthen 	}
555933707f3Ssthen 	;
556933707f3Ssthen server_verbosity: VAR_VERBOSITY STRING_ARG
557933707f3Ssthen 	{
558933707f3Ssthen 		OUTYY(("P(server_verbosity:%s)\n", $2));
559933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
560933707f3Ssthen 			yyerror("number expected");
561933707f3Ssthen 		else cfg_parser->cfg->verbosity = atoi($2);
562933707f3Ssthen 		free($2);
563933707f3Ssthen 	}
564933707f3Ssthen 	;
565933707f3Ssthen server_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG
566933707f3Ssthen 	{
567933707f3Ssthen 		OUTYY(("P(server_statistics_interval:%s)\n", $2));
568933707f3Ssthen 		if(strcmp($2, "") == 0 || strcmp($2, "0") == 0)
569933707f3Ssthen 			cfg_parser->cfg->stat_interval = 0;
570933707f3Ssthen 		else if(atoi($2) == 0)
571933707f3Ssthen 			yyerror("number expected");
572933707f3Ssthen 		else cfg_parser->cfg->stat_interval = atoi($2);
573933707f3Ssthen 		free($2);
574933707f3Ssthen 	}
575933707f3Ssthen 	;
576933707f3Ssthen server_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG
577933707f3Ssthen 	{
578933707f3Ssthen 		OUTYY(("P(server_statistics_cumulative:%s)\n", $2));
579933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
580933707f3Ssthen 			yyerror("expected yes or no.");
581933707f3Ssthen 		else cfg_parser->cfg->stat_cumulative = (strcmp($2, "yes")==0);
582933707f3Ssthen 		free($2);
583933707f3Ssthen 	}
584933707f3Ssthen 	;
585933707f3Ssthen server_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG
586933707f3Ssthen 	{
587933707f3Ssthen 		OUTYY(("P(server_extended_statistics:%s)\n", $2));
588933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
589933707f3Ssthen 			yyerror("expected yes or no.");
590933707f3Ssthen 		else cfg_parser->cfg->stat_extended = (strcmp($2, "yes")==0);
591933707f3Ssthen 		free($2);
592933707f3Ssthen 	}
593933707f3Ssthen 	;
5948b7325afSsthen server_statistics_inhibit_zero: VAR_STATISTICS_INHIBIT_ZERO STRING_ARG
5958b7325afSsthen 	{
5968b7325afSsthen 		OUTYY(("P(server_statistics_inhibit_zero:%s)\n", $2));
5978b7325afSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
5988b7325afSsthen 			yyerror("expected yes or no.");
5998b7325afSsthen 		else cfg_parser->cfg->stat_inhibit_zero = (strcmp($2, "yes")==0);
6008b7325afSsthen 		free($2);
6018b7325afSsthen 	}
6028b7325afSsthen 	;
6032be9e038Ssthen server_shm_enable: VAR_SHM_ENABLE STRING_ARG
6042be9e038Ssthen 	{
6052be9e038Ssthen 		OUTYY(("P(server_shm_enable:%s)\n", $2));
6062be9e038Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
6072be9e038Ssthen 			yyerror("expected yes or no.");
6082be9e038Ssthen 		else cfg_parser->cfg->shm_enable = (strcmp($2, "yes")==0);
6092be9e038Ssthen 		free($2);
6102be9e038Ssthen 	}
6112be9e038Ssthen 	;
6122be9e038Ssthen server_shm_key: VAR_SHM_KEY STRING_ARG
6132be9e038Ssthen 	{
6142be9e038Ssthen 		OUTYY(("P(server_shm_key:%s)\n", $2));
6152be9e038Ssthen 		if(strcmp($2, "") == 0 || strcmp($2, "0") == 0)
6162be9e038Ssthen 			cfg_parser->cfg->shm_key = 0;
6172be9e038Ssthen 		else if(atoi($2) == 0)
6182be9e038Ssthen 			yyerror("number expected");
6192be9e038Ssthen 		else cfg_parser->cfg->shm_key = atoi($2);
6202be9e038Ssthen 		free($2);
6212be9e038Ssthen 	}
6222be9e038Ssthen 	;
623933707f3Ssthen server_port: VAR_PORT STRING_ARG
624933707f3Ssthen 	{
625933707f3Ssthen 		OUTYY(("P(server_port:%s)\n", $2));
626933707f3Ssthen 		if(atoi($2) == 0)
627933707f3Ssthen 			yyerror("port number expected");
628933707f3Ssthen 		else cfg_parser->cfg->port = atoi($2);
629933707f3Ssthen 		free($2);
630933707f3Ssthen 	}
631933707f3Ssthen 	;
6322be9e038Ssthen server_send_client_subnet: VAR_SEND_CLIENT_SUBNET STRING_ARG
6332be9e038Ssthen 	{
6342be9e038Ssthen 	#ifdef CLIENT_SUBNET
6352be9e038Ssthen 		OUTYY(("P(server_send_client_subnet:%s)\n", $2));
6362be9e038Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->client_subnet, $2))
6372be9e038Ssthen 			fatal_exit("out of memory adding client-subnet");
6382be9e038Ssthen 	#else
6392be9e038Ssthen 		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
640eaf2578eSsthen 		free($2);
6412be9e038Ssthen 	#endif
6422be9e038Ssthen 	}
6432be9e038Ssthen 	;
6442be9e038Ssthen server_client_subnet_zone: VAR_CLIENT_SUBNET_ZONE STRING_ARG
6452be9e038Ssthen 	{
6462be9e038Ssthen 	#ifdef CLIENT_SUBNET
6472be9e038Ssthen 		OUTYY(("P(server_client_subnet_zone:%s)\n", $2));
6482be9e038Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->client_subnet_zone,
6492be9e038Ssthen 			$2))
6502be9e038Ssthen 			fatal_exit("out of memory adding client-subnet-zone");
6512be9e038Ssthen 	#else
6522be9e038Ssthen 		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
653eaf2578eSsthen 		free($2);
6542be9e038Ssthen 	#endif
6552be9e038Ssthen 	}
6562be9e038Ssthen 	;
6572be9e038Ssthen server_client_subnet_always_forward:
6582be9e038Ssthen 	VAR_CLIENT_SUBNET_ALWAYS_FORWARD STRING_ARG
6592be9e038Ssthen 	{
6602be9e038Ssthen 	#ifdef CLIENT_SUBNET
6612be9e038Ssthen 		OUTYY(("P(server_client_subnet_always_forward:%s)\n", $2));
6622be9e038Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
6632be9e038Ssthen 			yyerror("expected yes or no.");
6642be9e038Ssthen 		else
6652be9e038Ssthen 			cfg_parser->cfg->client_subnet_always_forward =
6662be9e038Ssthen 				(strcmp($2, "yes")==0);
6672be9e038Ssthen 	#else
6682be9e038Ssthen 		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
6692be9e038Ssthen 	#endif
6702be9e038Ssthen 		free($2);
6712be9e038Ssthen 	}
6722be9e038Ssthen 	;
6732be9e038Ssthen server_client_subnet_opcode: VAR_CLIENT_SUBNET_OPCODE STRING_ARG
6742be9e038Ssthen 	{
6752be9e038Ssthen 	#ifdef CLIENT_SUBNET
6762be9e038Ssthen 		OUTYY(("P(client_subnet_opcode:%s)\n", $2));
677bdfc4d55Sflorian 		OUTYY(("P(Deprecated option, ignoring)\n"));
6782be9e038Ssthen 	#else
6792be9e038Ssthen 		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
6802be9e038Ssthen 	#endif
6812be9e038Ssthen 		free($2);
6822be9e038Ssthen 	}
6832be9e038Ssthen 	;
6842be9e038Ssthen server_max_client_subnet_ipv4: VAR_MAX_CLIENT_SUBNET_IPV4 STRING_ARG
6852be9e038Ssthen 	{
6862be9e038Ssthen 	#ifdef CLIENT_SUBNET
6872be9e038Ssthen 		OUTYY(("P(max_client_subnet_ipv4:%s)\n", $2));
6882be9e038Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
6892be9e038Ssthen 			yyerror("IPv4 subnet length expected");
6902be9e038Ssthen 		else if (atoi($2) > 32)
6912be9e038Ssthen 			cfg_parser->cfg->max_client_subnet_ipv4 = 32;
6922be9e038Ssthen 		else if (atoi($2) < 0)
6932be9e038Ssthen 			cfg_parser->cfg->max_client_subnet_ipv4 = 0;
6942be9e038Ssthen 		else cfg_parser->cfg->max_client_subnet_ipv4 = (uint8_t)atoi($2);
6952be9e038Ssthen 	#else
6962be9e038Ssthen 		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
6972be9e038Ssthen 	#endif
6982be9e038Ssthen 		free($2);
6992be9e038Ssthen 	}
7002be9e038Ssthen 	;
7012be9e038Ssthen server_max_client_subnet_ipv6: VAR_MAX_CLIENT_SUBNET_IPV6 STRING_ARG
7022be9e038Ssthen 	{
7032be9e038Ssthen 	#ifdef CLIENT_SUBNET
7042be9e038Ssthen 		OUTYY(("P(max_client_subnet_ipv6:%s)\n", $2));
7052be9e038Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
7062be9e038Ssthen 			yyerror("Ipv6 subnet length expected");
7072be9e038Ssthen 		else if (atoi($2) > 128)
7082be9e038Ssthen 			cfg_parser->cfg->max_client_subnet_ipv6 = 128;
7092be9e038Ssthen 		else if (atoi($2) < 0)
7102be9e038Ssthen 			cfg_parser->cfg->max_client_subnet_ipv6 = 0;
7112be9e038Ssthen 		else cfg_parser->cfg->max_client_subnet_ipv6 = (uint8_t)atoi($2);
7122be9e038Ssthen 	#else
7132be9e038Ssthen 		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
7142be9e038Ssthen 	#endif
7152be9e038Ssthen 		free($2);
7162be9e038Ssthen 	}
7172be9e038Ssthen 	;
7183150e5f6Ssthen server_min_client_subnet_ipv4: VAR_MIN_CLIENT_SUBNET_IPV4 STRING_ARG
7193150e5f6Ssthen 	{
7203150e5f6Ssthen 	#ifdef CLIENT_SUBNET
7213150e5f6Ssthen 		OUTYY(("P(min_client_subnet_ipv4:%s)\n", $2));
7223150e5f6Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
7233150e5f6Ssthen 			yyerror("IPv4 subnet length expected");
7243150e5f6Ssthen 		else if (atoi($2) > 32)
7253150e5f6Ssthen 			cfg_parser->cfg->min_client_subnet_ipv4 = 32;
7263150e5f6Ssthen 		else if (atoi($2) < 0)
7273150e5f6Ssthen 			cfg_parser->cfg->min_client_subnet_ipv4 = 0;
7283150e5f6Ssthen 		else cfg_parser->cfg->min_client_subnet_ipv4 = (uint8_t)atoi($2);
7293150e5f6Ssthen 	#else
7303150e5f6Ssthen 		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
7313150e5f6Ssthen 	#endif
7323150e5f6Ssthen 		free($2);
7333150e5f6Ssthen 	}
7343150e5f6Ssthen 	;
7353150e5f6Ssthen server_min_client_subnet_ipv6: VAR_MIN_CLIENT_SUBNET_IPV6 STRING_ARG
7363150e5f6Ssthen 	{
7373150e5f6Ssthen 	#ifdef CLIENT_SUBNET
7383150e5f6Ssthen 		OUTYY(("P(min_client_subnet_ipv6:%s)\n", $2));
7393150e5f6Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
7403150e5f6Ssthen 			yyerror("Ipv6 subnet length expected");
7413150e5f6Ssthen 		else if (atoi($2) > 128)
7423150e5f6Ssthen 			cfg_parser->cfg->min_client_subnet_ipv6 = 128;
7433150e5f6Ssthen 		else if (atoi($2) < 0)
7443150e5f6Ssthen 			cfg_parser->cfg->min_client_subnet_ipv6 = 0;
7453150e5f6Ssthen 		else cfg_parser->cfg->min_client_subnet_ipv6 = (uint8_t)atoi($2);
7463150e5f6Ssthen 	#else
7473150e5f6Ssthen 		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
7483150e5f6Ssthen 	#endif
7493150e5f6Ssthen 		free($2);
7503150e5f6Ssthen 	}
7513150e5f6Ssthen 	;
7523150e5f6Ssthen server_max_ecs_tree_size_ipv4: VAR_MAX_ECS_TREE_SIZE_IPV4 STRING_ARG
7533150e5f6Ssthen 	{
7543150e5f6Ssthen 	#ifdef CLIENT_SUBNET
7553150e5f6Ssthen 		OUTYY(("P(max_ecs_tree_size_ipv4:%s)\n", $2));
7563150e5f6Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
7573150e5f6Ssthen 			yyerror("IPv4 ECS tree size expected");
7583150e5f6Ssthen 		else if (atoi($2) < 0)
7593150e5f6Ssthen 			cfg_parser->cfg->max_ecs_tree_size_ipv4 = 0;
7603150e5f6Ssthen 		else cfg_parser->cfg->max_ecs_tree_size_ipv4 = (uint32_t)atoi($2);
7613150e5f6Ssthen 	#else
7623150e5f6Ssthen 		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
7633150e5f6Ssthen 	#endif
7643150e5f6Ssthen 		free($2);
7653150e5f6Ssthen 	}
7663150e5f6Ssthen 	;
7673150e5f6Ssthen server_max_ecs_tree_size_ipv6: VAR_MAX_ECS_TREE_SIZE_IPV6 STRING_ARG
7683150e5f6Ssthen 	{
7693150e5f6Ssthen 	#ifdef CLIENT_SUBNET
7703150e5f6Ssthen 		OUTYY(("P(max_ecs_tree_size_ipv6:%s)\n", $2));
7713150e5f6Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
7723150e5f6Ssthen 			yyerror("IPv6 ECS tree size expected");
7733150e5f6Ssthen 		else if (atoi($2) < 0)
7743150e5f6Ssthen 			cfg_parser->cfg->max_ecs_tree_size_ipv6 = 0;
7753150e5f6Ssthen 		else cfg_parser->cfg->max_ecs_tree_size_ipv6 = (uint32_t)atoi($2);
7763150e5f6Ssthen 	#else
7773150e5f6Ssthen 		OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
7783150e5f6Ssthen 	#endif
7793150e5f6Ssthen 		free($2);
7803150e5f6Ssthen 	}
7813150e5f6Ssthen 	;
782933707f3Ssthen server_interface: VAR_INTERFACE STRING_ARG
783933707f3Ssthen 	{
784933707f3Ssthen 		OUTYY(("P(server_interface:%s)\n", $2));
785933707f3Ssthen 		if(cfg_parser->cfg->num_ifs == 0)
786933707f3Ssthen 			cfg_parser->cfg->ifs = calloc(1, sizeof(char*));
787933707f3Ssthen 		else cfg_parser->cfg->ifs = realloc(cfg_parser->cfg->ifs,
788933707f3Ssthen 				(cfg_parser->cfg->num_ifs+1)*sizeof(char*));
789933707f3Ssthen 		if(!cfg_parser->cfg->ifs)
790933707f3Ssthen 			yyerror("out of memory");
791933707f3Ssthen 		else
792933707f3Ssthen 			cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = $2;
793933707f3Ssthen 	}
794933707f3Ssthen 	;
795933707f3Ssthen server_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG
796933707f3Ssthen 	{
797933707f3Ssthen 		OUTYY(("P(server_outgoing_interface:%s)\n", $2));
798933707f3Ssthen 		if(cfg_parser->cfg->num_out_ifs == 0)
799933707f3Ssthen 			cfg_parser->cfg->out_ifs = calloc(1, sizeof(char*));
800933707f3Ssthen 		else cfg_parser->cfg->out_ifs = realloc(
801933707f3Ssthen 			cfg_parser->cfg->out_ifs,
802933707f3Ssthen 			(cfg_parser->cfg->num_out_ifs+1)*sizeof(char*));
803933707f3Ssthen 		if(!cfg_parser->cfg->out_ifs)
804933707f3Ssthen 			yyerror("out of memory");
805933707f3Ssthen 		else
806933707f3Ssthen 			cfg_parser->cfg->out_ifs[
807933707f3Ssthen 				cfg_parser->cfg->num_out_ifs++] = $2;
808933707f3Ssthen 	}
809933707f3Ssthen 	;
810933707f3Ssthen server_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG
811933707f3Ssthen 	{
812933707f3Ssthen 		OUTYY(("P(server_outgoing_range:%s)\n", $2));
813933707f3Ssthen 		if(atoi($2) == 0)
814933707f3Ssthen 			yyerror("number expected");
815933707f3Ssthen 		else cfg_parser->cfg->outgoing_num_ports = atoi($2);
816933707f3Ssthen 		free($2);
817933707f3Ssthen 	}
818933707f3Ssthen 	;
819933707f3Ssthen server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG
820933707f3Ssthen 	{
821933707f3Ssthen 		OUTYY(("P(server_outgoing_port_permit:%s)\n", $2));
822933707f3Ssthen 		if(!cfg_mark_ports($2, 1,
823933707f3Ssthen 			cfg_parser->cfg->outgoing_avail_ports, 65536))
824933707f3Ssthen 			yyerror("port number or range (\"low-high\") expected");
825933707f3Ssthen 		free($2);
826933707f3Ssthen 	}
827933707f3Ssthen 	;
828933707f3Ssthen server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG
829933707f3Ssthen 	{
830933707f3Ssthen 		OUTYY(("P(server_outgoing_port_avoid:%s)\n", $2));
831933707f3Ssthen 		if(!cfg_mark_ports($2, 0,
832933707f3Ssthen 			cfg_parser->cfg->outgoing_avail_ports, 65536))
833933707f3Ssthen 			yyerror("port number or range (\"low-high\") expected");
834933707f3Ssthen 		free($2);
835933707f3Ssthen 	}
836933707f3Ssthen 	;
837933707f3Ssthen server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG
838933707f3Ssthen 	{
839933707f3Ssthen 		OUTYY(("P(server_outgoing_num_tcp:%s)\n", $2));
840933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
841933707f3Ssthen 			yyerror("number expected");
842933707f3Ssthen 		else cfg_parser->cfg->outgoing_num_tcp = atoi($2);
843933707f3Ssthen 		free($2);
844933707f3Ssthen 	}
845933707f3Ssthen 	;
846933707f3Ssthen server_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG
847933707f3Ssthen 	{
848933707f3Ssthen 		OUTYY(("P(server_incoming_num_tcp:%s)\n", $2));
849933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
850933707f3Ssthen 			yyerror("number expected");
851933707f3Ssthen 		else cfg_parser->cfg->incoming_num_tcp = atoi($2);
852933707f3Ssthen 		free($2);
853933707f3Ssthen 	}
854933707f3Ssthen 	;
855933707f3Ssthen server_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG
856933707f3Ssthen 	{
857933707f3Ssthen 		OUTYY(("P(server_interface_automatic:%s)\n", $2));
858933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
859933707f3Ssthen 			yyerror("expected yes or no.");
860933707f3Ssthen 		else cfg_parser->cfg->if_automatic = (strcmp($2, "yes")==0);
861933707f3Ssthen 		free($2);
862933707f3Ssthen 	}
863933707f3Ssthen 	;
8640bdb4f62Ssthen server_interface_automatic_ports: VAR_INTERFACE_AUTOMATIC_PORTS STRING_ARG
8650bdb4f62Ssthen 	{
8660bdb4f62Ssthen 		OUTYY(("P(server_interface_automatic_ports:%s)\n", $2));
8670bdb4f62Ssthen 		free(cfg_parser->cfg->if_automatic_ports);
8680bdb4f62Ssthen 		cfg_parser->cfg->if_automatic_ports = $2;
8690bdb4f62Ssthen 	}
8700bdb4f62Ssthen 	;
871933707f3Ssthen server_do_ip4: VAR_DO_IP4 STRING_ARG
872933707f3Ssthen 	{
873933707f3Ssthen 		OUTYY(("P(server_do_ip4:%s)\n", $2));
874933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
875933707f3Ssthen 			yyerror("expected yes or no.");
876933707f3Ssthen 		else cfg_parser->cfg->do_ip4 = (strcmp($2, "yes")==0);
877933707f3Ssthen 		free($2);
878933707f3Ssthen 	}
879933707f3Ssthen 	;
880933707f3Ssthen server_do_ip6: VAR_DO_IP6 STRING_ARG
881933707f3Ssthen 	{
882933707f3Ssthen 		OUTYY(("P(server_do_ip6:%s)\n", $2));
883933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
884933707f3Ssthen 			yyerror("expected yes or no.");
885933707f3Ssthen 		else cfg_parser->cfg->do_ip6 = (strcmp($2, "yes")==0);
886933707f3Ssthen 		free($2);
887933707f3Ssthen 	}
888933707f3Ssthen 	;
8898b7325afSsthen server_do_nat64: VAR_DO_NAT64 STRING_ARG
8908b7325afSsthen 	{
8918b7325afSsthen 		OUTYY(("P(server_do_nat64:%s)\n", $2));
8928b7325afSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
8938b7325afSsthen 			yyerror("expected yes or no.");
8948b7325afSsthen 		else cfg_parser->cfg->do_nat64 = (strcmp($2, "yes")==0);
8958b7325afSsthen 		free($2);
8968b7325afSsthen 	}
8978b7325afSsthen 	;
898933707f3Ssthen server_do_udp: VAR_DO_UDP STRING_ARG
899933707f3Ssthen 	{
900933707f3Ssthen 		OUTYY(("P(server_do_udp:%s)\n", $2));
901933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
902933707f3Ssthen 			yyerror("expected yes or no.");
903933707f3Ssthen 		else cfg_parser->cfg->do_udp = (strcmp($2, "yes")==0);
904933707f3Ssthen 		free($2);
905933707f3Ssthen 	}
906933707f3Ssthen 	;
907933707f3Ssthen server_do_tcp: VAR_DO_TCP STRING_ARG
908933707f3Ssthen 	{
909933707f3Ssthen 		OUTYY(("P(server_do_tcp:%s)\n", $2));
910933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
911933707f3Ssthen 			yyerror("expected yes or no.");
912933707f3Ssthen 		else cfg_parser->cfg->do_tcp = (strcmp($2, "yes")==0);
913933707f3Ssthen 		free($2);
914933707f3Ssthen 	}
915933707f3Ssthen 	;
916a3167c07Ssthen server_prefer_ip4: VAR_PREFER_IP4 STRING_ARG
917a3167c07Ssthen 	{
918a3167c07Ssthen 		OUTYY(("P(server_prefer_ip4:%s)\n", $2));
919a3167c07Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
920a3167c07Ssthen 			yyerror("expected yes or no.");
921a3167c07Ssthen 		else cfg_parser->cfg->prefer_ip4 = (strcmp($2, "yes")==0);
922a3167c07Ssthen 		free($2);
923a3167c07Ssthen 	}
924a3167c07Ssthen 	;
92577079be7Ssthen server_prefer_ip6: VAR_PREFER_IP6 STRING_ARG
92677079be7Ssthen 	{
92777079be7Ssthen 		OUTYY(("P(server_prefer_ip6:%s)\n", $2));
92877079be7Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
92977079be7Ssthen 			yyerror("expected yes or no.");
93077079be7Ssthen 		else cfg_parser->cfg->prefer_ip6 = (strcmp($2, "yes")==0);
93177079be7Ssthen 		free($2);
93277079be7Ssthen 	}
93377079be7Ssthen 	;
93432e31f52Ssthen server_tcp_mss: VAR_TCP_MSS STRING_ARG
93532e31f52Ssthen 	{
93632e31f52Ssthen 		OUTYY(("P(server_tcp_mss:%s)\n", $2));
93732e31f52Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
93832e31f52Ssthen 				yyerror("number expected");
93932e31f52Ssthen 		else cfg_parser->cfg->tcp_mss = atoi($2);
94032e31f52Ssthen 		free($2);
94132e31f52Ssthen 	}
94232e31f52Ssthen 	;
94332e31f52Ssthen server_outgoing_tcp_mss: VAR_OUTGOING_TCP_MSS STRING_ARG
94432e31f52Ssthen 	{
94532e31f52Ssthen 		OUTYY(("P(server_outgoing_tcp_mss:%s)\n", $2));
94632e31f52Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
94732e31f52Ssthen 			yyerror("number expected");
94832e31f52Ssthen 		else cfg_parser->cfg->outgoing_tcp_mss = atoi($2);
94932e31f52Ssthen 		free($2);
95032e31f52Ssthen 	}
95132e31f52Ssthen 	;
9522308e98cSsthen server_tcp_idle_timeout: VAR_TCP_IDLE_TIMEOUT STRING_ARG
9532308e98cSsthen 	{
9542308e98cSsthen 		OUTYY(("P(server_tcp_idle_timeout:%s)\n", $2));
9552308e98cSsthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
9562308e98cSsthen 			yyerror("number expected");
9572308e98cSsthen 		else if (atoi($2) > 120000)
9582308e98cSsthen 			cfg_parser->cfg->tcp_idle_timeout = 120000;
9592308e98cSsthen 		else if (atoi($2) < 1)
9602308e98cSsthen 			cfg_parser->cfg->tcp_idle_timeout = 1;
9612308e98cSsthen 		else cfg_parser->cfg->tcp_idle_timeout = atoi($2);
9622308e98cSsthen 		free($2);
9632308e98cSsthen 	}
9642308e98cSsthen 	;
965191f22c6Ssthen server_max_reuse_tcp_queries: VAR_MAX_REUSE_TCP_QUERIES STRING_ARG
966191f22c6Ssthen 	{
967191f22c6Ssthen 		OUTYY(("P(server_max_reuse_tcp_queries:%s)\n", $2));
968191f22c6Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
969191f22c6Ssthen 			yyerror("number expected");
970191f22c6Ssthen 		else if (atoi($2) < 1)
971191f22c6Ssthen 			cfg_parser->cfg->max_reuse_tcp_queries = 0;
972191f22c6Ssthen 		else cfg_parser->cfg->max_reuse_tcp_queries = atoi($2);
973191f22c6Ssthen 		free($2);
974191f22c6Ssthen 	}
975191f22c6Ssthen 	;
976191f22c6Ssthen server_tcp_reuse_timeout: VAR_TCP_REUSE_TIMEOUT STRING_ARG
977191f22c6Ssthen 	{
978191f22c6Ssthen 		OUTYY(("P(server_tcp_reuse_timeout:%s)\n", $2));
979191f22c6Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
980191f22c6Ssthen 			yyerror("number expected");
981191f22c6Ssthen 		else if (atoi($2) < 1)
982191f22c6Ssthen 			cfg_parser->cfg->tcp_reuse_timeout = 0;
983191f22c6Ssthen 		else cfg_parser->cfg->tcp_reuse_timeout = atoi($2);
984191f22c6Ssthen 		free($2);
985191f22c6Ssthen 	}
986191f22c6Ssthen 	;
987191f22c6Ssthen server_tcp_auth_query_timeout: VAR_TCP_AUTH_QUERY_TIMEOUT STRING_ARG
988191f22c6Ssthen 	{
989191f22c6Ssthen 		OUTYY(("P(server_tcp_auth_query_timeout:%s)\n", $2));
990191f22c6Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
991191f22c6Ssthen 			yyerror("number expected");
992191f22c6Ssthen 		else if (atoi($2) < 1)
993191f22c6Ssthen 			cfg_parser->cfg->tcp_auth_query_timeout = 0;
994191f22c6Ssthen 		else cfg_parser->cfg->tcp_auth_query_timeout = atoi($2);
995191f22c6Ssthen 		free($2);
996191f22c6Ssthen 	}
997191f22c6Ssthen 	;
9982308e98cSsthen server_tcp_keepalive: VAR_EDNS_TCP_KEEPALIVE STRING_ARG
9992308e98cSsthen 	{
10002308e98cSsthen 		OUTYY(("P(server_tcp_keepalive:%s)\n", $2));
10012308e98cSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
10022308e98cSsthen 			yyerror("expected yes or no.");
10032308e98cSsthen 		else cfg_parser->cfg->do_tcp_keepalive = (strcmp($2, "yes")==0);
10042308e98cSsthen 		free($2);
10052308e98cSsthen 	}
10062308e98cSsthen 	;
10072308e98cSsthen server_tcp_keepalive_timeout: VAR_EDNS_TCP_KEEPALIVE_TIMEOUT STRING_ARG
10082308e98cSsthen 	{
10092308e98cSsthen 		OUTYY(("P(server_tcp_keepalive_timeout:%s)\n", $2));
10102308e98cSsthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
10112308e98cSsthen 			yyerror("number expected");
10122308e98cSsthen 		else if (atoi($2) > 6553500)
10132308e98cSsthen 			cfg_parser->cfg->tcp_keepalive_timeout = 6553500;
10142308e98cSsthen 		else if (atoi($2) < 1)
10152308e98cSsthen 			cfg_parser->cfg->tcp_keepalive_timeout = 0;
10162308e98cSsthen 		else cfg_parser->cfg->tcp_keepalive_timeout = atoi($2);
10172308e98cSsthen 		free($2);
10182308e98cSsthen 	}
10192308e98cSsthen 	;
10208b7325afSsthen server_sock_queue_timeout: VAR_SOCK_QUEUE_TIMEOUT STRING_ARG
10218b7325afSsthen 	{
10228b7325afSsthen 		OUTYY(("P(server_sock_queue_timeout:%s)\n", $2));
10238b7325afSsthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
10248b7325afSsthen 			yyerror("number expected");
10258b7325afSsthen 		else if (atoi($2) > 6553500)
10268b7325afSsthen 			cfg_parser->cfg->sock_queue_timeout = 6553500;
10278b7325afSsthen 		else if (atoi($2) < 1)
10288b7325afSsthen 			cfg_parser->cfg->sock_queue_timeout = 0;
10298b7325afSsthen 		else cfg_parser->cfg->sock_queue_timeout = atoi($2);
10308b7325afSsthen 		free($2);
10318b7325afSsthen 	}
10328b7325afSsthen 	;
1033933707f3Ssthen server_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG
1034933707f3Ssthen 	{
1035933707f3Ssthen 		OUTYY(("P(server_tcp_upstream:%s)\n", $2));
1036933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1037933707f3Ssthen 			yyerror("expected yes or no.");
1038933707f3Ssthen 		else cfg_parser->cfg->tcp_upstream = (strcmp($2, "yes")==0);
1039933707f3Ssthen 		free($2);
1040933707f3Ssthen 	}
1041933707f3Ssthen 	;
1042bdfc4d55Sflorian server_udp_upstream_without_downstream: VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM STRING_ARG
1043bdfc4d55Sflorian 	{
1044bdfc4d55Sflorian 		OUTYY(("P(server_udp_upstream_without_downstream:%s)\n", $2));
1045bdfc4d55Sflorian 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1046bdfc4d55Sflorian 			yyerror("expected yes or no.");
1047bdfc4d55Sflorian 		else cfg_parser->cfg->udp_upstream_without_downstream = (strcmp($2, "yes")==0);
1048bdfc4d55Sflorian 		free($2);
1049bdfc4d55Sflorian 	}
1050bdfc4d55Sflorian 	;
1051933707f3Ssthen server_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG
1052933707f3Ssthen 	{
1053933707f3Ssthen 		OUTYY(("P(server_ssl_upstream:%s)\n", $2));
1054933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1055933707f3Ssthen 			yyerror("expected yes or no.");
1056933707f3Ssthen 		else cfg_parser->cfg->ssl_upstream = (strcmp($2, "yes")==0);
1057933707f3Ssthen 		free($2);
1058933707f3Ssthen 	}
1059933707f3Ssthen 	;
1060933707f3Ssthen server_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG
1061933707f3Ssthen 	{
1062933707f3Ssthen 		OUTYY(("P(server_ssl_service_key:%s)\n", $2));
1063933707f3Ssthen 		free(cfg_parser->cfg->ssl_service_key);
1064933707f3Ssthen 		cfg_parser->cfg->ssl_service_key = $2;
1065933707f3Ssthen 	}
1066933707f3Ssthen 	;
1067933707f3Ssthen server_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG
1068933707f3Ssthen 	{
1069933707f3Ssthen 		OUTYY(("P(server_ssl_service_pem:%s)\n", $2));
1070933707f3Ssthen 		free(cfg_parser->cfg->ssl_service_pem);
1071933707f3Ssthen 		cfg_parser->cfg->ssl_service_pem = $2;
1072933707f3Ssthen 	}
1073933707f3Ssthen 	;
1074933707f3Ssthen server_ssl_port: VAR_SSL_PORT STRING_ARG
1075933707f3Ssthen 	{
1076933707f3Ssthen 		OUTYY(("P(server_ssl_port:%s)\n", $2));
1077933707f3Ssthen 		if(atoi($2) == 0)
1078933707f3Ssthen 			yyerror("port number expected");
1079933707f3Ssthen 		else cfg_parser->cfg->ssl_port = atoi($2);
1080933707f3Ssthen 		free($2);
1081933707f3Ssthen 	}
1082933707f3Ssthen 	;
1083938a3a5eSflorian server_tls_cert_bundle: VAR_TLS_CERT_BUNDLE STRING_ARG
1084938a3a5eSflorian 	{
1085938a3a5eSflorian 		OUTYY(("P(server_tls_cert_bundle:%s)\n", $2));
1086938a3a5eSflorian 		free(cfg_parser->cfg->tls_cert_bundle);
1087938a3a5eSflorian 		cfg_parser->cfg->tls_cert_bundle = $2;
1088938a3a5eSflorian 	}
1089938a3a5eSflorian 	;
109020237c55Ssthen server_tls_win_cert: VAR_TLS_WIN_CERT STRING_ARG
109120237c55Ssthen 	{
109220237c55Ssthen 		OUTYY(("P(server_tls_win_cert:%s)\n", $2));
109320237c55Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
109420237c55Ssthen 			yyerror("expected yes or no.");
109520237c55Ssthen 		else cfg_parser->cfg->tls_win_cert = (strcmp($2, "yes")==0);
109620237c55Ssthen 		free($2);
109720237c55Ssthen 	}
109820237c55Ssthen 	;
109920237c55Ssthen server_tls_additional_port: VAR_TLS_ADDITIONAL_PORT STRING_ARG
110020237c55Ssthen 	{
110120237c55Ssthen 		OUTYY(("P(server_tls_additional_port:%s)\n", $2));
110220237c55Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->tls_additional_port,
110320237c55Ssthen 			$2))
110420237c55Ssthen 			yyerror("out of memory");
110520237c55Ssthen 	}
110620237c55Ssthen 	;
1107f6b99bafSsthen server_tls_ciphers: VAR_TLS_CIPHERS STRING_ARG
1108f6b99bafSsthen 	{
1109f6b99bafSsthen 		OUTYY(("P(server_tls_ciphers:%s)\n", $2));
1110f6b99bafSsthen 		free(cfg_parser->cfg->tls_ciphers);
1111f6b99bafSsthen 		cfg_parser->cfg->tls_ciphers = $2;
1112f6b99bafSsthen 	}
1113f6b99bafSsthen 	;
1114f6b99bafSsthen server_tls_ciphersuites: VAR_TLS_CIPHERSUITES STRING_ARG
1115f6b99bafSsthen 	{
1116f6b99bafSsthen 		OUTYY(("P(server_tls_ciphersuites:%s)\n", $2));
1117f6b99bafSsthen 		free(cfg_parser->cfg->tls_ciphersuites);
1118f6b99bafSsthen 		cfg_parser->cfg->tls_ciphersuites = $2;
1119f6b99bafSsthen 	}
1120f6b99bafSsthen 	;
1121f6b99bafSsthen server_tls_session_ticket_keys: VAR_TLS_SESSION_TICKET_KEYS STRING_ARG
1122f6b99bafSsthen 	{
1123f6b99bafSsthen 		OUTYY(("P(server_tls_session_ticket_keys:%s)\n", $2));
1124f6b99bafSsthen 		if(!cfg_strlist_append(&cfg_parser->cfg->tls_session_ticket_keys,
1125f6b99bafSsthen 			$2))
1126f6b99bafSsthen 			yyerror("out of memory");
1127f6b99bafSsthen 	}
1128f6b99bafSsthen 	;
1129a3167c07Ssthen server_tls_use_sni: VAR_TLS_USE_SNI STRING_ARG
1130a3167c07Ssthen 	{
1131a3167c07Ssthen 		OUTYY(("P(server_tls_use_sni:%s)\n", $2));
1132a3167c07Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1133a3167c07Ssthen 			yyerror("expected yes or no.");
1134a3167c07Ssthen 		else cfg_parser->cfg->tls_use_sni = (strcmp($2, "yes")==0);
1135a3167c07Ssthen 		free($2);
1136a3167c07Ssthen 	}
1137a3167c07Ssthen 	;
11382c144df0Ssthen server_https_port: VAR_HTTPS_PORT STRING_ARG
11392c144df0Ssthen 	{
11402c144df0Ssthen 		OUTYY(("P(server_https_port:%s)\n", $2));
11412c144df0Ssthen 		if(atoi($2) == 0)
11422c144df0Ssthen 			yyerror("port number expected");
11432c144df0Ssthen 		else cfg_parser->cfg->https_port = atoi($2);
1144eba819a2Ssthen 		free($2);
11452c144df0Ssthen 	};
11462c144df0Ssthen server_http_endpoint: VAR_HTTP_ENDPOINT STRING_ARG
11472c144df0Ssthen 	{
11482c144df0Ssthen 		OUTYY(("P(server_http_endpoint:%s)\n", $2));
11492c144df0Ssthen 		free(cfg_parser->cfg->http_endpoint);
11502c144df0Ssthen 		if($2 && $2[0] != '/') {
11512c144df0Ssthen 			cfg_parser->cfg->http_endpoint = malloc(strlen($2)+2);
11522c144df0Ssthen 			if(!cfg_parser->cfg->http_endpoint)
11532c144df0Ssthen 				yyerror("out of memory");
11542c144df0Ssthen 			cfg_parser->cfg->http_endpoint[0] = '/';
11552c144df0Ssthen 			memmove(cfg_parser->cfg->http_endpoint+1, $2,
11562c144df0Ssthen 				strlen($2)+1);
11572c144df0Ssthen 			free($2);
11582c144df0Ssthen 		} else {
11592c144df0Ssthen 			cfg_parser->cfg->http_endpoint = $2;
11602c144df0Ssthen 		}
11612c144df0Ssthen 	};
11622c144df0Ssthen server_http_max_streams: VAR_HTTP_MAX_STREAMS STRING_ARG
11632c144df0Ssthen 	{
11642c144df0Ssthen 		OUTYY(("P(server_http_max_streams:%s)\n", $2));
11652c144df0Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
11662c144df0Ssthen 			yyerror("number expected");
11672c144df0Ssthen 		else cfg_parser->cfg->http_max_streams = atoi($2);
11682c144df0Ssthen 		free($2);
11692c144df0Ssthen 	};
11702c144df0Ssthen server_http_query_buffer_size: VAR_HTTP_QUERY_BUFFER_SIZE STRING_ARG
11712c144df0Ssthen 	{
11722c144df0Ssthen 		OUTYY(("P(server_http_query_buffer_size:%s)\n", $2));
11732c144df0Ssthen 		if(!cfg_parse_memsize($2,
11742c144df0Ssthen 			&cfg_parser->cfg->http_query_buffer_size))
11752c144df0Ssthen 			yyerror("memory size expected");
11762c144df0Ssthen 		free($2);
11772c144df0Ssthen 	};
11782c144df0Ssthen server_http_response_buffer_size: VAR_HTTP_RESPONSE_BUFFER_SIZE STRING_ARG
11792c144df0Ssthen 	{
11802c144df0Ssthen 		OUTYY(("P(server_http_response_buffer_size:%s)\n", $2));
11812c144df0Ssthen 		if(!cfg_parse_memsize($2,
11822c144df0Ssthen 			&cfg_parser->cfg->http_response_buffer_size))
11832c144df0Ssthen 			yyerror("memory size expected");
11842c144df0Ssthen 		free($2);
11852c144df0Ssthen 	};
11862c144df0Ssthen server_http_nodelay: VAR_HTTP_NODELAY STRING_ARG
11872c144df0Ssthen 	{
11882c144df0Ssthen 		OUTYY(("P(server_http_nodelay:%s)\n", $2));
11892c144df0Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
11902c144df0Ssthen 			yyerror("expected yes or no.");
11912c144df0Ssthen 		else cfg_parser->cfg->http_nodelay = (strcmp($2, "yes")==0);
11922c144df0Ssthen 		free($2);
11938b7325afSsthen 	};
1194eba819a2Ssthen server_http_notls_downstream: VAR_HTTP_NOTLS_DOWNSTREAM STRING_ARG
1195eba819a2Ssthen 	{
1196eba819a2Ssthen 		OUTYY(("P(server_http_notls_downstream:%s)\n", $2));
1197eba819a2Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1198eba819a2Ssthen 			yyerror("expected yes or no.");
1199eba819a2Ssthen 		else cfg_parser->cfg->http_notls_downstream = (strcmp($2, "yes")==0);
1200eba819a2Ssthen 		free($2);
12012c144df0Ssthen 	};
120277079be7Ssthen server_use_systemd: VAR_USE_SYSTEMD STRING_ARG
120377079be7Ssthen 	{
120477079be7Ssthen 		OUTYY(("P(server_use_systemd:%s)\n", $2));
120577079be7Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
120677079be7Ssthen 			yyerror("expected yes or no.");
120777079be7Ssthen 		else cfg_parser->cfg->use_systemd = (strcmp($2, "yes")==0);
120877079be7Ssthen 		free($2);
120977079be7Ssthen 	}
121077079be7Ssthen 	;
1211933707f3Ssthen server_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG
1212933707f3Ssthen 	{
1213933707f3Ssthen 		OUTYY(("P(server_do_daemonize:%s)\n", $2));
1214933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1215933707f3Ssthen 			yyerror("expected yes or no.");
1216933707f3Ssthen 		else cfg_parser->cfg->do_daemonize = (strcmp($2, "yes")==0);
1217933707f3Ssthen 		free($2);
1218933707f3Ssthen 	}
1219933707f3Ssthen 	;
1220933707f3Ssthen server_use_syslog: VAR_USE_SYSLOG STRING_ARG
1221933707f3Ssthen 	{
1222933707f3Ssthen 		OUTYY(("P(server_use_syslog:%s)\n", $2));
1223933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1224933707f3Ssthen 			yyerror("expected yes or no.");
1225933707f3Ssthen 		else cfg_parser->cfg->use_syslog = (strcmp($2, "yes")==0);
1226933707f3Ssthen #if !defined(HAVE_SYSLOG_H) && !defined(UB_ON_WINDOWS)
1227933707f3Ssthen 		if(strcmp($2, "yes") == 0)
1228933707f3Ssthen 			yyerror("no syslog services are available. "
1229933707f3Ssthen 				"(reconfigure and compile to add)");
1230933707f3Ssthen #endif
1231933707f3Ssthen 		free($2);
1232933707f3Ssthen 	}
1233933707f3Ssthen 	;
1234933707f3Ssthen server_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG
1235933707f3Ssthen 	{
1236933707f3Ssthen 		OUTYY(("P(server_log_time_ascii:%s)\n", $2));
1237933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1238933707f3Ssthen 			yyerror("expected yes or no.");
1239933707f3Ssthen 		else cfg_parser->cfg->log_time_ascii = (strcmp($2, "yes")==0);
1240933707f3Ssthen 		free($2);
1241933707f3Ssthen 	}
1242933707f3Ssthen 	;
1243933707f3Ssthen server_log_queries: VAR_LOG_QUERIES STRING_ARG
1244933707f3Ssthen 	{
1245933707f3Ssthen 		OUTYY(("P(server_log_queries:%s)\n", $2));
1246933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1247933707f3Ssthen 			yyerror("expected yes or no.");
1248933707f3Ssthen 		else cfg_parser->cfg->log_queries = (strcmp($2, "yes")==0);
1249933707f3Ssthen 		free($2);
1250933707f3Ssthen 	}
1251933707f3Ssthen 	;
125277079be7Ssthen server_log_replies: VAR_LOG_REPLIES STRING_ARG
125377079be7Ssthen 	{
125477079be7Ssthen 		OUTYY(("P(server_log_replies:%s)\n", $2));
125577079be7Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
125677079be7Ssthen 			yyerror("expected yes or no.");
125777079be7Ssthen 		else cfg_parser->cfg->log_replies = (strcmp($2, "yes")==0);
125877079be7Ssthen 		free($2);
125977079be7Ssthen 	}
126077079be7Ssthen 	;
1261f6b99bafSsthen server_log_tag_queryreply: VAR_LOG_TAG_QUERYREPLY STRING_ARG
1262f6b99bafSsthen 	{
1263f6b99bafSsthen 		OUTYY(("P(server_log_tag_queryreply:%s)\n", $2));
1264f6b99bafSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1265f6b99bafSsthen 			yyerror("expected yes or no.");
1266f6b99bafSsthen 		else cfg_parser->cfg->log_tag_queryreply = (strcmp($2, "yes")==0);
1267f6b99bafSsthen 		free($2);
1268f6b99bafSsthen 	}
1269f6b99bafSsthen 	;
12702308e98cSsthen server_log_servfail: VAR_LOG_SERVFAIL STRING_ARG
12712308e98cSsthen 	{
12722308e98cSsthen 		OUTYY(("P(server_log_servfail:%s)\n", $2));
12732308e98cSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
12742308e98cSsthen 			yyerror("expected yes or no.");
12752308e98cSsthen 		else cfg_parser->cfg->log_servfail = (strcmp($2, "yes")==0);
12762308e98cSsthen 		free($2);
12772308e98cSsthen 	}
12782308e98cSsthen 	;
1279f46c52bfSsthen server_log_destaddr: VAR_LOG_DESTADDR STRING_ARG
1280f46c52bfSsthen 	{
1281f46c52bfSsthen 		OUTYY(("P(server_log_destaddr:%s)\n", $2));
1282f46c52bfSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1283f46c52bfSsthen 			yyerror("expected yes or no.");
1284f46c52bfSsthen 		else cfg_parser->cfg->log_destaddr = (strcmp($2, "yes")==0);
1285f46c52bfSsthen 		free($2);
1286f46c52bfSsthen 	}
1287f46c52bfSsthen 	;
12882308e98cSsthen server_log_local_actions: VAR_LOG_LOCAL_ACTIONS STRING_ARG
12892308e98cSsthen 	{
12902308e98cSsthen 		OUTYY(("P(server_log_local_actions:%s)\n", $2));
12912308e98cSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
12922308e98cSsthen 			yyerror("expected yes or no.");
12932308e98cSsthen 		else cfg_parser->cfg->log_local_actions = (strcmp($2, "yes")==0);
12942308e98cSsthen 		free($2);
12952308e98cSsthen 	}
12962308e98cSsthen 	;
1297933707f3Ssthen server_chroot: VAR_CHROOT STRING_ARG
1298933707f3Ssthen 	{
1299933707f3Ssthen 		OUTYY(("P(server_chroot:%s)\n", $2));
1300933707f3Ssthen 		free(cfg_parser->cfg->chrootdir);
1301933707f3Ssthen 		cfg_parser->cfg->chrootdir = $2;
1302933707f3Ssthen 	}
1303933707f3Ssthen 	;
1304933707f3Ssthen server_username: VAR_USERNAME STRING_ARG
1305933707f3Ssthen 	{
1306933707f3Ssthen 		OUTYY(("P(server_username:%s)\n", $2));
1307933707f3Ssthen 		free(cfg_parser->cfg->username);
1308933707f3Ssthen 		cfg_parser->cfg->username = $2;
1309933707f3Ssthen 	}
1310933707f3Ssthen 	;
1311933707f3Ssthen server_directory: VAR_DIRECTORY STRING_ARG
1312933707f3Ssthen 	{
1313933707f3Ssthen 		OUTYY(("P(server_directory:%s)\n", $2));
1314933707f3Ssthen 		free(cfg_parser->cfg->directory);
1315933707f3Ssthen 		cfg_parser->cfg->directory = $2;
131677079be7Ssthen 		/* change there right away for includes relative to this */
131777079be7Ssthen 		if($2[0]) {
131877079be7Ssthen 			char* d;
131977079be7Ssthen #ifdef UB_ON_WINDOWS
132077079be7Ssthen 			w_config_adjust_directory(cfg_parser->cfg);
132177079be7Ssthen #endif
132277079be7Ssthen 			d = cfg_parser->cfg->directory;
132377079be7Ssthen 			/* adjust directory if we have already chroot,
132477079be7Ssthen 			 * like, we reread after sighup */
132577079be7Ssthen 			if(cfg_parser->chroot && cfg_parser->chroot[0] &&
132677079be7Ssthen 				strncmp(d, cfg_parser->chroot, strlen(
132777079be7Ssthen 				cfg_parser->chroot)) == 0)
132877079be7Ssthen 				d += strlen(cfg_parser->chroot);
132977079be7Ssthen 			if(d[0]) {
133077079be7Ssthen 				if(chdir(d))
133177079be7Ssthen 				log_err("cannot chdir to directory: %s (%s)",
133277079be7Ssthen 					d, strerror(errno));
133377079be7Ssthen 			}
133477079be7Ssthen 		}
1335933707f3Ssthen 	}
1336933707f3Ssthen 	;
1337933707f3Ssthen server_logfile: VAR_LOGFILE STRING_ARG
1338933707f3Ssthen 	{
1339933707f3Ssthen 		OUTYY(("P(server_logfile:%s)\n", $2));
1340933707f3Ssthen 		free(cfg_parser->cfg->logfile);
1341933707f3Ssthen 		cfg_parser->cfg->logfile = $2;
1342933707f3Ssthen 		cfg_parser->cfg->use_syslog = 0;
1343933707f3Ssthen 	}
1344933707f3Ssthen 	;
1345933707f3Ssthen server_pidfile: VAR_PIDFILE STRING_ARG
1346933707f3Ssthen 	{
1347933707f3Ssthen 		OUTYY(("P(server_pidfile:%s)\n", $2));
1348933707f3Ssthen 		free(cfg_parser->cfg->pidfile);
1349933707f3Ssthen 		cfg_parser->cfg->pidfile = $2;
1350933707f3Ssthen 	}
1351933707f3Ssthen 	;
1352933707f3Ssthen server_root_hints: VAR_ROOT_HINTS STRING_ARG
1353933707f3Ssthen 	{
1354933707f3Ssthen 		OUTYY(("P(server_root_hints:%s)\n", $2));
1355933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, $2))
1356933707f3Ssthen 			yyerror("out of memory");
1357933707f3Ssthen 	}
1358933707f3Ssthen 	;
1359933707f3Ssthen server_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG
1360933707f3Ssthen 	{
1361933707f3Ssthen 		OUTYY(("P(server_dlv_anchor_file:%s)\n", $2));
13622c144df0Ssthen 		log_warn("option dlv-anchor-file ignored: DLV is decommissioned");
13632c144df0Ssthen 		free($2);
1364933707f3Ssthen 	}
1365933707f3Ssthen 	;
1366933707f3Ssthen server_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG
1367933707f3Ssthen 	{
1368933707f3Ssthen 		OUTYY(("P(server_dlv_anchor:%s)\n", $2));
13692c144df0Ssthen 		log_warn("option dlv-anchor ignored: DLV is decommissioned");
13702c144df0Ssthen 		free($2);
1371933707f3Ssthen 	}
1372933707f3Ssthen 	;
1373933707f3Ssthen server_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG
1374933707f3Ssthen 	{
1375933707f3Ssthen 		OUTYY(("P(server_auto_trust_anchor_file:%s)\n", $2));
1376933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->
1377933707f3Ssthen 			auto_trust_anchor_file_list, $2))
1378933707f3Ssthen 			yyerror("out of memory");
1379933707f3Ssthen 	}
1380933707f3Ssthen 	;
1381933707f3Ssthen server_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG
1382933707f3Ssthen 	{
1383933707f3Ssthen 		OUTYY(("P(server_trust_anchor_file:%s)\n", $2));
1384933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->
1385933707f3Ssthen 			trust_anchor_file_list, $2))
1386933707f3Ssthen 			yyerror("out of memory");
1387933707f3Ssthen 	}
1388933707f3Ssthen 	;
1389933707f3Ssthen server_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG
1390933707f3Ssthen 	{
1391933707f3Ssthen 		OUTYY(("P(server_trusted_keys_file:%s)\n", $2));
1392933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->
1393933707f3Ssthen 			trusted_keys_file_list, $2))
1394933707f3Ssthen 			yyerror("out of memory");
1395933707f3Ssthen 	}
1396933707f3Ssthen 	;
1397933707f3Ssthen server_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG
1398933707f3Ssthen 	{
1399933707f3Ssthen 		OUTYY(("P(server_trust_anchor:%s)\n", $2));
1400933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, $2))
1401933707f3Ssthen 			yyerror("out of memory");
1402933707f3Ssthen 	}
1403933707f3Ssthen 	;
14042be9e038Ssthen server_trust_anchor_signaling: VAR_TRUST_ANCHOR_SIGNALING STRING_ARG
14052be9e038Ssthen 	{
14062be9e038Ssthen 		OUTYY(("P(server_trust_anchor_signaling:%s)\n", $2));
14072be9e038Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
14082be9e038Ssthen 			yyerror("expected yes or no.");
14092be9e038Ssthen 		else
14102be9e038Ssthen 			cfg_parser->cfg->trust_anchor_signaling =
14112be9e038Ssthen 				(strcmp($2, "yes")==0);
14122be9e038Ssthen 		free($2);
14132be9e038Ssthen 	}
14142be9e038Ssthen 	;
141520237c55Ssthen server_root_key_sentinel: VAR_ROOT_KEY_SENTINEL STRING_ARG
141620237c55Ssthen 	{
141720237c55Ssthen 		OUTYY(("P(server_root_key_sentinel:%s)\n", $2));
141820237c55Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
141920237c55Ssthen 			yyerror("expected yes or no.");
142020237c55Ssthen 		else
142120237c55Ssthen 			cfg_parser->cfg->root_key_sentinel =
142220237c55Ssthen 				(strcmp($2, "yes")==0);
142320237c55Ssthen 		free($2);
142420237c55Ssthen 	}
142520237c55Ssthen 	;
1426933707f3Ssthen server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG
1427933707f3Ssthen 	{
1428933707f3Ssthen 		OUTYY(("P(server_domain_insecure:%s)\n", $2));
1429933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, $2))
1430933707f3Ssthen 			yyerror("out of memory");
1431933707f3Ssthen 	}
1432933707f3Ssthen 	;
1433933707f3Ssthen server_hide_identity: VAR_HIDE_IDENTITY STRING_ARG
1434933707f3Ssthen 	{
1435933707f3Ssthen 		OUTYY(("P(server_hide_identity:%s)\n", $2));
1436933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1437933707f3Ssthen 			yyerror("expected yes or no.");
1438933707f3Ssthen 		else cfg_parser->cfg->hide_identity = (strcmp($2, "yes")==0);
1439933707f3Ssthen 		free($2);
1440933707f3Ssthen 	}
1441933707f3Ssthen 	;
1442933707f3Ssthen server_hide_version: VAR_HIDE_VERSION STRING_ARG
1443933707f3Ssthen 	{
1444933707f3Ssthen 		OUTYY(("P(server_hide_version:%s)\n", $2));
1445933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1446933707f3Ssthen 			yyerror("expected yes or no.");
1447933707f3Ssthen 		else cfg_parser->cfg->hide_version = (strcmp($2, "yes")==0);
1448933707f3Ssthen 		free($2);
1449933707f3Ssthen 	}
1450933707f3Ssthen 	;
14512be9e038Ssthen server_hide_trustanchor: VAR_HIDE_TRUSTANCHOR STRING_ARG
14522be9e038Ssthen 	{
14532be9e038Ssthen 		OUTYY(("P(server_hide_trustanchor:%s)\n", $2));
14542be9e038Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
14552be9e038Ssthen 			yyerror("expected yes or no.");
14562be9e038Ssthen 		else cfg_parser->cfg->hide_trustanchor = (strcmp($2, "yes")==0);
14572be9e038Ssthen 		free($2);
14582be9e038Ssthen 	}
14592be9e038Ssthen 	;
1460191f22c6Ssthen server_hide_http_user_agent: VAR_HIDE_HTTP_USER_AGENT STRING_ARG
1461191f22c6Ssthen 	{
1462191f22c6Ssthen 		OUTYY(("P(server_hide_user_agent:%s)\n", $2));
1463191f22c6Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1464191f22c6Ssthen 			yyerror("expected yes or no.");
1465191f22c6Ssthen 		else cfg_parser->cfg->hide_http_user_agent = (strcmp($2, "yes")==0);
1466191f22c6Ssthen 		free($2);
1467191f22c6Ssthen 	}
1468191f22c6Ssthen 	;
1469933707f3Ssthen server_identity: VAR_IDENTITY STRING_ARG
1470933707f3Ssthen 	{
1471933707f3Ssthen 		OUTYY(("P(server_identity:%s)\n", $2));
1472933707f3Ssthen 		free(cfg_parser->cfg->identity);
1473933707f3Ssthen 		cfg_parser->cfg->identity = $2;
1474933707f3Ssthen 	}
1475933707f3Ssthen 	;
1476933707f3Ssthen server_version: VAR_VERSION STRING_ARG
1477933707f3Ssthen 	{
1478933707f3Ssthen 		OUTYY(("P(server_version:%s)\n", $2));
1479933707f3Ssthen 		free(cfg_parser->cfg->version);
1480933707f3Ssthen 		cfg_parser->cfg->version = $2;
1481933707f3Ssthen 	}
1482933707f3Ssthen 	;
1483191f22c6Ssthen server_http_user_agent: VAR_HTTP_USER_AGENT STRING_ARG
1484191f22c6Ssthen 	{
1485191f22c6Ssthen 		OUTYY(("P(server_http_user_agent:%s)\n", $2));
1486191f22c6Ssthen 		free(cfg_parser->cfg->http_user_agent);
1487191f22c6Ssthen 		cfg_parser->cfg->http_user_agent = $2;
1488191f22c6Ssthen 	}
1489191f22c6Ssthen 	;
14909982a05dSsthen server_nsid: VAR_NSID STRING_ARG
14919982a05dSsthen 	{
14929982a05dSsthen 		OUTYY(("P(server_nsid:%s)\n", $2));
14939982a05dSsthen 		free(cfg_parser->cfg->nsid_cfg_str);
14949982a05dSsthen 		cfg_parser->cfg->nsid_cfg_str = $2;
14959982a05dSsthen 		free(cfg_parser->cfg->nsid);
14969982a05dSsthen 		cfg_parser->cfg->nsid = NULL;
14979982a05dSsthen 		cfg_parser->cfg->nsid_len = 0;
14989982a05dSsthen 		if (*$2 == 0)
14999982a05dSsthen 			; /* pass; empty string is not setting nsid */
15009982a05dSsthen 		else if (!(cfg_parser->cfg->nsid = cfg_parse_nsid(
15019982a05dSsthen 					$2, &cfg_parser->cfg->nsid_len)))
15029982a05dSsthen 			yyerror("the NSID must be either a hex string or an "
15039982a05dSsthen 			    "ascii character string prepended with ascii_.");
15049982a05dSsthen 	}
15059982a05dSsthen 	;
1506933707f3Ssthen server_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG
1507933707f3Ssthen 	{
1508933707f3Ssthen 		OUTYY(("P(server_so_rcvbuf:%s)\n", $2));
1509933707f3Ssthen 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_rcvbuf))
1510933707f3Ssthen 			yyerror("buffer size expected");
1511933707f3Ssthen 		free($2);
1512933707f3Ssthen 	}
1513933707f3Ssthen 	;
1514933707f3Ssthen server_so_sndbuf: VAR_SO_SNDBUF STRING_ARG
1515933707f3Ssthen 	{
1516933707f3Ssthen 		OUTYY(("P(server_so_sndbuf:%s)\n", $2));
1517933707f3Ssthen 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_sndbuf))
1518933707f3Ssthen 			yyerror("buffer size expected");
1519933707f3Ssthen 		free($2);
1520933707f3Ssthen 	}
1521933707f3Ssthen 	;
15225d76a658Ssthen server_so_reuseport: VAR_SO_REUSEPORT STRING_ARG
15235d76a658Ssthen 	{
15245d76a658Ssthen 		OUTYY(("P(server_so_reuseport:%s)\n", $2));
15255d76a658Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
15265d76a658Ssthen 			yyerror("expected yes or no.");
15275d76a658Ssthen 		else cfg_parser->cfg->so_reuseport =
15285d76a658Ssthen 			(strcmp($2, "yes")==0);
15295d76a658Ssthen 		free($2);
15305d76a658Ssthen 	}
15315d76a658Ssthen 	;
1532fdfb4ba6Ssthen server_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG
1533fdfb4ba6Ssthen 	{
1534fdfb4ba6Ssthen 		OUTYY(("P(server_ip_transparent:%s)\n", $2));
1535fdfb4ba6Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1536fdfb4ba6Ssthen 			yyerror("expected yes or no.");
1537fdfb4ba6Ssthen 		else cfg_parser->cfg->ip_transparent =
1538fdfb4ba6Ssthen 			(strcmp($2, "yes")==0);
1539fdfb4ba6Ssthen 		free($2);
1540fdfb4ba6Ssthen 	}
1541fdfb4ba6Ssthen 	;
15422ee382b6Ssthen server_ip_freebind: VAR_IP_FREEBIND STRING_ARG
15432ee382b6Ssthen 	{
15442ee382b6Ssthen 		OUTYY(("P(server_ip_freebind:%s)\n", $2));
15452ee382b6Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
15462ee382b6Ssthen 			yyerror("expected yes or no.");
15472ee382b6Ssthen 		else cfg_parser->cfg->ip_freebind =
15482ee382b6Ssthen 			(strcmp($2, "yes")==0);
15492ee382b6Ssthen 		free($2);
15502ee382b6Ssthen 	}
15512ee382b6Ssthen 	;
1552a3167c07Ssthen server_ip_dscp: VAR_IP_DSCP STRING_ARG
1553a3167c07Ssthen 	{
1554a3167c07Ssthen 		OUTYY(("P(server_ip_dscp:%s)\n", $2));
1555a3167c07Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1556a3167c07Ssthen 			yyerror("number expected");
1557a3167c07Ssthen 		else if (atoi($2) > 63)
1558a3167c07Ssthen 			yyerror("value too large (max 63)");
1559a3167c07Ssthen 		else if (atoi($2) < 0)
1560a3167c07Ssthen 			yyerror("value too small (min 0)");
1561a3167c07Ssthen 		else
1562a3167c07Ssthen 			cfg_parser->cfg->ip_dscp = atoi($2);
1563a3167c07Ssthen 		free($2);
1564a3167c07Ssthen 	}
1565a3167c07Ssthen 	;
1566f6b99bafSsthen server_stream_wait_size: VAR_STREAM_WAIT_SIZE STRING_ARG
1567f6b99bafSsthen 	{
1568f6b99bafSsthen 		OUTYY(("P(server_stream_wait_size:%s)\n", $2));
1569f6b99bafSsthen 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->stream_wait_size))
1570f6b99bafSsthen 			yyerror("memory size expected");
1571f6b99bafSsthen 		free($2);
1572f6b99bafSsthen 	}
1573f6b99bafSsthen 	;
1574933707f3Ssthen server_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG
1575933707f3Ssthen 	{
1576933707f3Ssthen 		OUTYY(("P(server_edns_buffer_size:%s)\n", $2));
1577933707f3Ssthen 		if(atoi($2) == 0)
1578933707f3Ssthen 			yyerror("number expected");
1579933707f3Ssthen 		else if (atoi($2) < 12)
1580933707f3Ssthen 			yyerror("edns buffer size too small");
1581933707f3Ssthen 		else if (atoi($2) > 65535)
1582933707f3Ssthen 			cfg_parser->cfg->edns_buffer_size = 65535;
1583933707f3Ssthen 		else cfg_parser->cfg->edns_buffer_size = atoi($2);
1584933707f3Ssthen 		free($2);
1585933707f3Ssthen 	}
1586933707f3Ssthen 	;
1587933707f3Ssthen server_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG
1588933707f3Ssthen 	{
1589933707f3Ssthen 		OUTYY(("P(server_msg_buffer_size:%s)\n", $2));
1590933707f3Ssthen 		if(atoi($2) == 0)
1591933707f3Ssthen 			yyerror("number expected");
1592933707f3Ssthen 		else if (atoi($2) < 4096)
1593933707f3Ssthen 			yyerror("message buffer size too small (use 4096)");
1594933707f3Ssthen 		else cfg_parser->cfg->msg_buffer_size = atoi($2);
1595933707f3Ssthen 		free($2);
1596933707f3Ssthen 	}
1597933707f3Ssthen 	;
1598933707f3Ssthen server_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG
1599933707f3Ssthen 	{
1600933707f3Ssthen 		OUTYY(("P(server_msg_cache_size:%s)\n", $2));
1601933707f3Ssthen 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->msg_cache_size))
1602933707f3Ssthen 			yyerror("memory size expected");
1603933707f3Ssthen 		free($2);
1604933707f3Ssthen 	}
1605933707f3Ssthen 	;
1606933707f3Ssthen server_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG
1607933707f3Ssthen 	{
1608933707f3Ssthen 		OUTYY(("P(server_msg_cache_slabs:%s)\n", $2));
1609e21c60efSsthen 		if(atoi($2) == 0) {
1610933707f3Ssthen 			yyerror("number expected");
1611e21c60efSsthen 		} else {
1612933707f3Ssthen 			cfg_parser->cfg->msg_cache_slabs = atoi($2);
1613933707f3Ssthen 			if(!is_pow2(cfg_parser->cfg->msg_cache_slabs))
1614933707f3Ssthen 				yyerror("must be a power of 2");
1615933707f3Ssthen 		}
1616933707f3Ssthen 		free($2);
1617933707f3Ssthen 	}
1618933707f3Ssthen 	;
1619933707f3Ssthen server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG
1620933707f3Ssthen 	{
1621933707f3Ssthen 		OUTYY(("P(server_num_queries_per_thread:%s)\n", $2));
1622933707f3Ssthen 		if(atoi($2) == 0)
1623933707f3Ssthen 			yyerror("number expected");
1624933707f3Ssthen 		else cfg_parser->cfg->num_queries_per_thread = atoi($2);
1625933707f3Ssthen 		free($2);
1626933707f3Ssthen 	}
1627933707f3Ssthen 	;
1628933707f3Ssthen server_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG
1629933707f3Ssthen 	{
1630933707f3Ssthen 		OUTYY(("P(server_jostle_timeout:%s)\n", $2));
1631933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1632933707f3Ssthen 			yyerror("number expected");
1633933707f3Ssthen 		else cfg_parser->cfg->jostle_time = atoi($2);
1634933707f3Ssthen 		free($2);
1635933707f3Ssthen 	}
1636933707f3Ssthen 	;
16375d76a658Ssthen server_delay_close: VAR_DELAY_CLOSE STRING_ARG
16385d76a658Ssthen 	{
16395d76a658Ssthen 		OUTYY(("P(server_delay_close:%s)\n", $2));
16405d76a658Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
16415d76a658Ssthen 			yyerror("number expected");
16425d76a658Ssthen 		else cfg_parser->cfg->delay_close = atoi($2);
16435d76a658Ssthen 		free($2);
16445d76a658Ssthen 	}
16455d76a658Ssthen 	;
1646eba819a2Ssthen server_udp_connect: VAR_UDP_CONNECT STRING_ARG
1647eba819a2Ssthen 	{
1648eba819a2Ssthen 		OUTYY(("P(server_udp_connect:%s)\n", $2));
1649eba819a2Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1650eba819a2Ssthen 			yyerror("expected yes or no.");
1651eba819a2Ssthen 		else cfg_parser->cfg->udp_connect = (strcmp($2, "yes")==0);
1652eba819a2Ssthen 		free($2);
1653eba819a2Ssthen 	}
1654eba819a2Ssthen 	;
165598f3ca02Sbrad server_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG
165698f3ca02Sbrad 	{
165798f3ca02Sbrad 		OUTYY(("P(server_unblock_lan_zones:%s)\n", $2));
165898f3ca02Sbrad 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
165998f3ca02Sbrad 			yyerror("expected yes or no.");
166098f3ca02Sbrad 		else cfg_parser->cfg->unblock_lan_zones =
166198f3ca02Sbrad 			(strcmp($2, "yes")==0);
166298f3ca02Sbrad 		free($2);
166398f3ca02Sbrad 	}
166498f3ca02Sbrad 	;
166532e31f52Ssthen server_insecure_lan_zones: VAR_INSECURE_LAN_ZONES STRING_ARG
166632e31f52Ssthen 	{
166732e31f52Ssthen 		OUTYY(("P(server_insecure_lan_zones:%s)\n", $2));
166832e31f52Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
166932e31f52Ssthen 			yyerror("expected yes or no.");
167032e31f52Ssthen 		else cfg_parser->cfg->insecure_lan_zones =
167132e31f52Ssthen 			(strcmp($2, "yes")==0);
167232e31f52Ssthen 		free($2);
167332e31f52Ssthen 	}
167432e31f52Ssthen 	;
1675933707f3Ssthen server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG
1676933707f3Ssthen 	{
1677933707f3Ssthen 		OUTYY(("P(server_rrset_cache_size:%s)\n", $2));
1678933707f3Ssthen 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->rrset_cache_size))
1679933707f3Ssthen 			yyerror("memory size expected");
1680933707f3Ssthen 		free($2);
1681933707f3Ssthen 	}
1682933707f3Ssthen 	;
1683933707f3Ssthen server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG
1684933707f3Ssthen 	{
1685933707f3Ssthen 		OUTYY(("P(server_rrset_cache_slabs:%s)\n", $2));
1686e21c60efSsthen 		if(atoi($2) == 0) {
1687933707f3Ssthen 			yyerror("number expected");
1688e21c60efSsthen 		} else {
1689933707f3Ssthen 			cfg_parser->cfg->rrset_cache_slabs = atoi($2);
1690933707f3Ssthen 			if(!is_pow2(cfg_parser->cfg->rrset_cache_slabs))
1691933707f3Ssthen 				yyerror("must be a power of 2");
1692933707f3Ssthen 		}
1693933707f3Ssthen 		free($2);
1694933707f3Ssthen 	}
1695933707f3Ssthen 	;
1696933707f3Ssthen server_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG
1697933707f3Ssthen 	{
1698933707f3Ssthen 		OUTYY(("P(server_infra_host_ttl:%s)\n", $2));
1699933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1700933707f3Ssthen 			yyerror("number expected");
1701933707f3Ssthen 		else cfg_parser->cfg->host_ttl = atoi($2);
1702933707f3Ssthen 		free($2);
1703933707f3Ssthen 	}
1704933707f3Ssthen 	;
1705933707f3Ssthen server_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG
1706933707f3Ssthen 	{
1707933707f3Ssthen 		OUTYY(("P(server_infra_lame_ttl:%s)\n", $2));
1708933707f3Ssthen 		verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option "
1709933707f3Ssthen 			"removed, use infra-host-ttl)", $2);
1710933707f3Ssthen 		free($2);
1711933707f3Ssthen 	}
1712933707f3Ssthen 	;
1713933707f3Ssthen server_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG
1714933707f3Ssthen 	{
1715933707f3Ssthen 		OUTYY(("P(server_infra_cache_numhosts:%s)\n", $2));
1716933707f3Ssthen 		if(atoi($2) == 0)
1717933707f3Ssthen 			yyerror("number expected");
1718933707f3Ssthen 		else cfg_parser->cfg->infra_cache_numhosts = atoi($2);
1719933707f3Ssthen 		free($2);
1720933707f3Ssthen 	}
1721933707f3Ssthen 	;
1722933707f3Ssthen server_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG
1723933707f3Ssthen 	{
1724933707f3Ssthen 		OUTYY(("P(server_infra_cache_lame_size:%s)\n", $2));
1725933707f3Ssthen 		verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s "
1726933707f3Ssthen 			"(option removed, use infra-cache-numhosts)", $2);
1727933707f3Ssthen 		free($2);
1728933707f3Ssthen 	}
1729933707f3Ssthen 	;
1730933707f3Ssthen server_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG
1731933707f3Ssthen 	{
1732933707f3Ssthen 		OUTYY(("P(server_infra_cache_slabs:%s)\n", $2));
1733e21c60efSsthen 		if(atoi($2) == 0) {
1734933707f3Ssthen 			yyerror("number expected");
1735e21c60efSsthen 		} else {
1736933707f3Ssthen 			cfg_parser->cfg->infra_cache_slabs = atoi($2);
1737933707f3Ssthen 			if(!is_pow2(cfg_parser->cfg->infra_cache_slabs))
1738933707f3Ssthen 				yyerror("must be a power of 2");
1739933707f3Ssthen 		}
1740933707f3Ssthen 		free($2);
1741933707f3Ssthen 	}
1742933707f3Ssthen 	;
1743b2cdf21fSsthen server_infra_cache_min_rtt: VAR_INFRA_CACHE_MIN_RTT STRING_ARG
1744b2cdf21fSsthen 	{
1745b2cdf21fSsthen 		OUTYY(("P(server_infra_cache_min_rtt:%s)\n", $2));
1746b2cdf21fSsthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1747b2cdf21fSsthen 			yyerror("number expected");
1748b2cdf21fSsthen 		else cfg_parser->cfg->infra_cache_min_rtt = atoi($2);
1749b2cdf21fSsthen 		free($2);
1750b2cdf21fSsthen 	}
1751b2cdf21fSsthen 	;
1752d1e2768aSsthen server_infra_cache_max_rtt: VAR_INFRA_CACHE_MAX_RTT STRING_ARG
1753d1e2768aSsthen 	{
1754d1e2768aSsthen 		OUTYY(("P(server_infra_cache_max_rtt:%s)\n", $2));
1755d1e2768aSsthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1756d1e2768aSsthen 			yyerror("number expected");
1757d1e2768aSsthen 		else cfg_parser->cfg->infra_cache_max_rtt = atoi($2);
1758d1e2768aSsthen 		free($2);
1759d1e2768aSsthen 	}
1760d1e2768aSsthen 	;
1761eba819a2Ssthen server_infra_keep_probing: VAR_INFRA_KEEP_PROBING STRING_ARG
1762eba819a2Ssthen 	{
1763eba819a2Ssthen 		OUTYY(("P(server_infra_keep_probing:%s)\n", $2));
1764eba819a2Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1765eba819a2Ssthen 			yyerror("expected yes or no.");
1766eba819a2Ssthen 		else cfg_parser->cfg->infra_keep_probing =
1767eba819a2Ssthen 			(strcmp($2, "yes")==0);
1768eba819a2Ssthen 		free($2);
1769eba819a2Ssthen 	}
1770eba819a2Ssthen 	;
1771933707f3Ssthen server_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG
1772933707f3Ssthen 	{
1773933707f3Ssthen 		OUTYY(("P(server_target_fetch_policy:%s)\n", $2));
1774933707f3Ssthen 		free(cfg_parser->cfg->target_fetch_policy);
1775933707f3Ssthen 		cfg_parser->cfg->target_fetch_policy = $2;
1776933707f3Ssthen 	}
1777933707f3Ssthen 	;
1778933707f3Ssthen server_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG
1779933707f3Ssthen 	{
1780933707f3Ssthen 		OUTYY(("P(server_harden_short_bufsize:%s)\n", $2));
1781933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1782933707f3Ssthen 			yyerror("expected yes or no.");
1783933707f3Ssthen 		else cfg_parser->cfg->harden_short_bufsize =
1784933707f3Ssthen 			(strcmp($2, "yes")==0);
1785933707f3Ssthen 		free($2);
1786933707f3Ssthen 	}
1787933707f3Ssthen 	;
1788933707f3Ssthen server_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG
1789933707f3Ssthen 	{
1790933707f3Ssthen 		OUTYY(("P(server_harden_large_queries:%s)\n", $2));
1791933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1792933707f3Ssthen 			yyerror("expected yes or no.");
1793933707f3Ssthen 		else cfg_parser->cfg->harden_large_queries =
1794933707f3Ssthen 			(strcmp($2, "yes")==0);
1795933707f3Ssthen 		free($2);
1796933707f3Ssthen 	}
1797933707f3Ssthen 	;
1798933707f3Ssthen server_harden_glue: VAR_HARDEN_GLUE STRING_ARG
1799933707f3Ssthen 	{
1800933707f3Ssthen 		OUTYY(("P(server_harden_glue:%s)\n", $2));
1801933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1802933707f3Ssthen 			yyerror("expected yes or no.");
1803933707f3Ssthen 		else cfg_parser->cfg->harden_glue =
1804933707f3Ssthen 			(strcmp($2, "yes")==0);
1805933707f3Ssthen 		free($2);
1806933707f3Ssthen 	}
1807933707f3Ssthen 	;
1808933707f3Ssthen server_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG
1809933707f3Ssthen 	{
1810933707f3Ssthen 		OUTYY(("P(server_harden_dnssec_stripped:%s)\n", $2));
1811933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1812933707f3Ssthen 			yyerror("expected yes or no.");
1813933707f3Ssthen 		else cfg_parser->cfg->harden_dnssec_stripped =
1814933707f3Ssthen 			(strcmp($2, "yes")==0);
1815933707f3Ssthen 		free($2);
1816933707f3Ssthen 	}
1817933707f3Ssthen 	;
1818933707f3Ssthen server_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG
1819933707f3Ssthen 	{
1820933707f3Ssthen 		OUTYY(("P(server_harden_below_nxdomain:%s)\n", $2));
1821933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1822933707f3Ssthen 			yyerror("expected yes or no.");
1823933707f3Ssthen 		else cfg_parser->cfg->harden_below_nxdomain =
1824933707f3Ssthen 			(strcmp($2, "yes")==0);
1825933707f3Ssthen 		free($2);
1826933707f3Ssthen 	}
1827933707f3Ssthen 	;
1828933707f3Ssthen server_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG
1829933707f3Ssthen 	{
1830933707f3Ssthen 		OUTYY(("P(server_harden_referral_path:%s)\n", $2));
1831933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1832933707f3Ssthen 			yyerror("expected yes or no.");
1833933707f3Ssthen 		else cfg_parser->cfg->harden_referral_path =
1834933707f3Ssthen 			(strcmp($2, "yes")==0);
1835933707f3Ssthen 		free($2);
1836933707f3Ssthen 	}
1837933707f3Ssthen 	;
1838fdfb4ba6Ssthen server_harden_algo_downgrade: VAR_HARDEN_ALGO_DOWNGRADE STRING_ARG
1839fdfb4ba6Ssthen 	{
1840fdfb4ba6Ssthen 		OUTYY(("P(server_harden_algo_downgrade:%s)\n", $2));
1841fdfb4ba6Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1842fdfb4ba6Ssthen 			yyerror("expected yes or no.");
1843fdfb4ba6Ssthen 		else cfg_parser->cfg->harden_algo_downgrade =
1844fdfb4ba6Ssthen 			(strcmp($2, "yes")==0);
1845fdfb4ba6Ssthen 		free($2);
1846fdfb4ba6Ssthen 	}
1847fdfb4ba6Ssthen 	;
18488b7325afSsthen server_harden_unknown_additional: VAR_HARDEN_UNKNOWN_ADDITIONAL STRING_ARG
18498b7325afSsthen 	{
18508b7325afSsthen 		OUTYY(("P(server_harden_unknown_additional:%s)\n", $2));
18518b7325afSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
18528b7325afSsthen 			yyerror("expected yes or no.");
18538b7325afSsthen 		else cfg_parser->cfg->harden_unknown_additional =
18548b7325afSsthen 			(strcmp($2, "yes")==0);
18558b7325afSsthen 		free($2);
18568b7325afSsthen 	}
18578b7325afSsthen 	;
1858933707f3Ssthen server_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG
1859933707f3Ssthen 	{
1860933707f3Ssthen 		OUTYY(("P(server_use_caps_for_id:%s)\n", $2));
1861933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1862933707f3Ssthen 			yyerror("expected yes or no.");
1863933707f3Ssthen 		else cfg_parser->cfg->use_caps_bits_for_id =
1864933707f3Ssthen 			(strcmp($2, "yes")==0);
1865933707f3Ssthen 		free($2);
1866933707f3Ssthen 	}
1867933707f3Ssthen 	;
1868fdfb4ba6Ssthen server_caps_whitelist: VAR_CAPS_WHITELIST STRING_ARG
1869fdfb4ba6Ssthen 	{
1870fdfb4ba6Ssthen 		OUTYY(("P(server_caps_whitelist:%s)\n", $2));
1871fdfb4ba6Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, $2))
1872fdfb4ba6Ssthen 			yyerror("out of memory");
1873fdfb4ba6Ssthen 	}
1874fdfb4ba6Ssthen 	;
1875933707f3Ssthen server_private_address: VAR_PRIVATE_ADDRESS STRING_ARG
1876933707f3Ssthen 	{
1877933707f3Ssthen 		OUTYY(("P(server_private_address:%s)\n", $2));
1878933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, $2))
1879933707f3Ssthen 			yyerror("out of memory");
1880933707f3Ssthen 	}
1881933707f3Ssthen 	;
1882933707f3Ssthen server_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG
1883933707f3Ssthen 	{
1884933707f3Ssthen 		OUTYY(("P(server_private_domain:%s)\n", $2));
1885933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, $2))
1886933707f3Ssthen 			yyerror("out of memory");
1887933707f3Ssthen 	}
1888933707f3Ssthen 	;
1889933707f3Ssthen server_prefetch: VAR_PREFETCH STRING_ARG
1890933707f3Ssthen 	{
1891933707f3Ssthen 		OUTYY(("P(server_prefetch:%s)\n", $2));
1892933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1893933707f3Ssthen 			yyerror("expected yes or no.");
1894933707f3Ssthen 		else cfg_parser->cfg->prefetch = (strcmp($2, "yes")==0);
1895933707f3Ssthen 		free($2);
1896933707f3Ssthen 	}
1897933707f3Ssthen 	;
1898933707f3Ssthen server_prefetch_key: VAR_PREFETCH_KEY STRING_ARG
1899933707f3Ssthen 	{
1900933707f3Ssthen 		OUTYY(("P(server_prefetch_key:%s)\n", $2));
1901933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1902933707f3Ssthen 			yyerror("expected yes or no.");
1903933707f3Ssthen 		else cfg_parser->cfg->prefetch_key = (strcmp($2, "yes")==0);
1904933707f3Ssthen 		free($2);
1905933707f3Ssthen 	}
1906933707f3Ssthen 	;
19073150e5f6Ssthen server_deny_any: VAR_DENY_ANY STRING_ARG
19083150e5f6Ssthen 	{
19093150e5f6Ssthen 		OUTYY(("P(server_deny_any:%s)\n", $2));
19103150e5f6Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
19113150e5f6Ssthen 			yyerror("expected yes or no.");
19123150e5f6Ssthen 		else cfg_parser->cfg->deny_any = (strcmp($2, "yes")==0);
19133150e5f6Ssthen 		free($2);
19143150e5f6Ssthen 	}
19153150e5f6Ssthen 	;
1916933707f3Ssthen server_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG
1917933707f3Ssthen 	{
1918933707f3Ssthen 		OUTYY(("P(server_unwanted_reply_threshold:%s)\n", $2));
1919933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1920933707f3Ssthen 			yyerror("number expected");
1921933707f3Ssthen 		else cfg_parser->cfg->unwanted_threshold = atoi($2);
1922933707f3Ssthen 		free($2);
1923933707f3Ssthen 	}
1924933707f3Ssthen 	;
1925933707f3Ssthen server_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG
1926933707f3Ssthen 	{
1927933707f3Ssthen 		OUTYY(("P(server_do_not_query_address:%s)\n", $2));
1928933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, $2))
1929933707f3Ssthen 			yyerror("out of memory");
1930933707f3Ssthen 	}
1931933707f3Ssthen 	;
1932933707f3Ssthen server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG
1933933707f3Ssthen 	{
1934933707f3Ssthen 		OUTYY(("P(server_do_not_query_localhost:%s)\n", $2));
1935933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1936933707f3Ssthen 			yyerror("expected yes or no.");
1937933707f3Ssthen 		else cfg_parser->cfg->donotquery_localhost =
1938933707f3Ssthen 			(strcmp($2, "yes")==0);
1939933707f3Ssthen 		free($2);
1940933707f3Ssthen 	}
1941933707f3Ssthen 	;
1942933707f3Ssthen server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG
1943933707f3Ssthen 	{
1944933707f3Ssthen 		OUTYY(("P(server_access_control:%s %s)\n", $2, $3));
194545872187Ssthen 		validate_acl_action($3);
1946933707f3Ssthen 		if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3))
1947933707f3Ssthen 			fatal_exit("out of memory adding acl");
1948933707f3Ssthen 	}
194945872187Ssthen 	;
195045872187Ssthen server_interface_action: VAR_INTERFACE_ACTION STRING_ARG STRING_ARG
195145872187Ssthen 	{
195245872187Ssthen 		OUTYY(("P(server_interface_action:%s %s)\n", $2, $3));
195345872187Ssthen 		validate_acl_action($3);
195445872187Ssthen 		if(!cfg_str2list_insert(
195545872187Ssthen 			&cfg_parser->cfg->interface_actions, $2, $3))
195645872187Ssthen 			fatal_exit("out of memory adding acl");
1957933707f3Ssthen 	}
1958933707f3Ssthen 	;
1959933707f3Ssthen server_module_conf: VAR_MODULE_CONF STRING_ARG
1960933707f3Ssthen 	{
1961933707f3Ssthen 		OUTYY(("P(server_module_conf:%s)\n", $2));
1962933707f3Ssthen 		free(cfg_parser->cfg->module_conf);
1963933707f3Ssthen 		cfg_parser->cfg->module_conf = $2;
1964933707f3Ssthen 	}
1965933707f3Ssthen 	;
1966933707f3Ssthen server_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG
1967933707f3Ssthen 	{
1968933707f3Ssthen 		OUTYY(("P(server_val_override_date:%s)\n", $2));
196932e31f52Ssthen 		if(*$2 == '\0' || strcmp($2, "0") == 0) {
1970933707f3Ssthen 			cfg_parser->cfg->val_date_override = 0;
1971933707f3Ssthen 		} else if(strlen($2) == 14) {
1972933707f3Ssthen 			cfg_parser->cfg->val_date_override =
1973933707f3Ssthen 				cfg_convert_timeval($2);
1974933707f3Ssthen 			if(!cfg_parser->cfg->val_date_override)
1975933707f3Ssthen 				yyerror("bad date/time specification");
1976933707f3Ssthen 		} else {
1977933707f3Ssthen 			if(atoi($2) == 0)
1978933707f3Ssthen 				yyerror("number expected");
1979933707f3Ssthen 			cfg_parser->cfg->val_date_override = atoi($2);
1980933707f3Ssthen 		}
1981933707f3Ssthen 		free($2);
1982933707f3Ssthen 	}
1983933707f3Ssthen 	;
1984933707f3Ssthen server_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG
1985933707f3Ssthen 	{
1986933707f3Ssthen 		OUTYY(("P(server_val_sig_skew_min:%s)\n", $2));
198732e31f52Ssthen 		if(*$2 == '\0' || strcmp($2, "0") == 0) {
1988933707f3Ssthen 			cfg_parser->cfg->val_sig_skew_min = 0;
1989933707f3Ssthen 		} else {
1990933707f3Ssthen 			cfg_parser->cfg->val_sig_skew_min = atoi($2);
1991933707f3Ssthen 			if(!cfg_parser->cfg->val_sig_skew_min)
1992933707f3Ssthen 				yyerror("number expected");
1993933707f3Ssthen 		}
1994933707f3Ssthen 		free($2);
1995933707f3Ssthen 	}
1996933707f3Ssthen 	;
1997933707f3Ssthen server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG
1998933707f3Ssthen 	{
1999933707f3Ssthen 		OUTYY(("P(server_val_sig_skew_max:%s)\n", $2));
200032e31f52Ssthen 		if(*$2 == '\0' || strcmp($2, "0") == 0) {
2001933707f3Ssthen 			cfg_parser->cfg->val_sig_skew_max = 0;
2002933707f3Ssthen 		} else {
2003933707f3Ssthen 			cfg_parser->cfg->val_sig_skew_max = atoi($2);
2004933707f3Ssthen 			if(!cfg_parser->cfg->val_sig_skew_max)
2005933707f3Ssthen 				yyerror("number expected");
2006933707f3Ssthen 		}
2007933707f3Ssthen 		free($2);
2008933707f3Ssthen 	}
2009933707f3Ssthen 	;
2010191f22c6Ssthen server_val_max_restart: VAR_VAL_MAX_RESTART STRING_ARG
2011191f22c6Ssthen 	{
2012191f22c6Ssthen 		OUTYY(("P(server_val_max_restart:%s)\n", $2));
2013191f22c6Ssthen 		if(*$2 == '\0' || strcmp($2, "0") == 0) {
2014191f22c6Ssthen 			cfg_parser->cfg->val_max_restart = 0;
2015191f22c6Ssthen 		} else {
2016191f22c6Ssthen 			cfg_parser->cfg->val_max_restart = atoi($2);
2017191f22c6Ssthen 			if(!cfg_parser->cfg->val_max_restart)
2018191f22c6Ssthen 				yyerror("number expected");
2019191f22c6Ssthen 		}
2020191f22c6Ssthen 		free($2);
2021191f22c6Ssthen 	}
2022191f22c6Ssthen 	;
2023933707f3Ssthen server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG
2024933707f3Ssthen 	{
2025933707f3Ssthen 		OUTYY(("P(server_cache_max_ttl:%s)\n", $2));
2026933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2027933707f3Ssthen 			yyerror("number expected");
2028933707f3Ssthen 		else cfg_parser->cfg->max_ttl = atoi($2);
2029933707f3Ssthen 		free($2);
2030933707f3Ssthen 	}
2031933707f3Ssthen 	;
2032fdfb4ba6Ssthen server_cache_max_negative_ttl: VAR_CACHE_MAX_NEGATIVE_TTL STRING_ARG
2033fdfb4ba6Ssthen 	{
2034fdfb4ba6Ssthen 		OUTYY(("P(server_cache_max_negative_ttl:%s)\n", $2));
2035fdfb4ba6Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2036fdfb4ba6Ssthen 			yyerror("number expected");
2037fdfb4ba6Ssthen 		else cfg_parser->cfg->max_negative_ttl = atoi($2);
2038fdfb4ba6Ssthen 		free($2);
2039fdfb4ba6Ssthen 	}
2040fdfb4ba6Ssthen 	;
20412bdc0ed1Ssthen server_cache_min_negative_ttl: VAR_CACHE_MIN_NEGATIVE_TTL STRING_ARG
20422bdc0ed1Ssthen 	{
20432bdc0ed1Ssthen 		OUTYY(("P(server_cache_min_negative_ttl:%s)\n", $2));
20442bdc0ed1Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
20452bdc0ed1Ssthen 			yyerror("number expected");
20462bdc0ed1Ssthen 		else cfg_parser->cfg->min_negative_ttl = atoi($2);
20472bdc0ed1Ssthen 		free($2);
20482bdc0ed1Ssthen 	}
20492bdc0ed1Ssthen 	;
2050933707f3Ssthen server_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG
2051933707f3Ssthen 	{
2052933707f3Ssthen 		OUTYY(("P(server_cache_min_ttl:%s)\n", $2));
2053933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2054933707f3Ssthen 			yyerror("number expected");
2055933707f3Ssthen 		else cfg_parser->cfg->min_ttl = atoi($2);
2056933707f3Ssthen 		free($2);
2057933707f3Ssthen 	}
2058933707f3Ssthen 	;
2059933707f3Ssthen server_bogus_ttl: VAR_BOGUS_TTL STRING_ARG
2060933707f3Ssthen 	{
2061933707f3Ssthen 		OUTYY(("P(server_bogus_ttl:%s)\n", $2));
2062933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2063933707f3Ssthen 			yyerror("number expected");
2064933707f3Ssthen 		else cfg_parser->cfg->bogus_ttl = atoi($2);
2065933707f3Ssthen 		free($2);
2066933707f3Ssthen 	}
2067933707f3Ssthen 	;
2068933707f3Ssthen server_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG
2069933707f3Ssthen 	{
2070933707f3Ssthen 		OUTYY(("P(server_val_clean_additional:%s)\n", $2));
2071933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2072933707f3Ssthen 			yyerror("expected yes or no.");
2073933707f3Ssthen 		else cfg_parser->cfg->val_clean_additional =
2074933707f3Ssthen 			(strcmp($2, "yes")==0);
2075933707f3Ssthen 		free($2);
2076933707f3Ssthen 	}
2077933707f3Ssthen 	;
2078933707f3Ssthen server_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG
2079933707f3Ssthen 	{
2080933707f3Ssthen 		OUTYY(("P(server_val_permissive_mode:%s)\n", $2));
2081933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2082933707f3Ssthen 			yyerror("expected yes or no.");
2083933707f3Ssthen 		else cfg_parser->cfg->val_permissive_mode =
2084933707f3Ssthen 			(strcmp($2, "yes")==0);
2085933707f3Ssthen 		free($2);
2086933707f3Ssthen 	}
2087933707f3Ssthen 	;
2088938a3a5eSflorian server_aggressive_nsec: VAR_AGGRESSIVE_NSEC STRING_ARG
2089938a3a5eSflorian 	{
2090938a3a5eSflorian 		OUTYY(("P(server_aggressive_nsec:%s)\n", $2));
2091938a3a5eSflorian 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2092938a3a5eSflorian 			yyerror("expected yes or no.");
2093938a3a5eSflorian 		else
2094938a3a5eSflorian 			cfg_parser->cfg->aggressive_nsec =
2095938a3a5eSflorian 				(strcmp($2, "yes")==0);
2096938a3a5eSflorian 		free($2);
2097938a3a5eSflorian 	}
2098938a3a5eSflorian 	;
2099933707f3Ssthen server_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG
2100933707f3Ssthen 	{
2101933707f3Ssthen 		OUTYY(("P(server_ignore_cd_flag:%s)\n", $2));
2102933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2103933707f3Ssthen 			yyerror("expected yes or no.");
2104933707f3Ssthen 		else cfg_parser->cfg->ignore_cd = (strcmp($2, "yes")==0);
2105933707f3Ssthen 		free($2);
2106933707f3Ssthen 	}
2107933707f3Ssthen 	;
2108d896b962Ssthen server_disable_edns_do: VAR_DISABLE_EDNS_DO STRING_ARG
2109d896b962Ssthen 	{
2110d896b962Ssthen 		OUTYY(("P(server_disable_edns_do:%s)\n", $2));
2111d896b962Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2112d896b962Ssthen 			yyerror("expected yes or no.");
2113d896b962Ssthen 		else cfg_parser->cfg->disable_edns_do = (strcmp($2, "yes")==0);
2114d896b962Ssthen 		free($2);
2115d896b962Ssthen 	}
2116d896b962Ssthen 	;
211777079be7Ssthen server_serve_expired: VAR_SERVE_EXPIRED STRING_ARG
211877079be7Ssthen 	{
211977079be7Ssthen 		OUTYY(("P(server_serve_expired:%s)\n", $2));
212077079be7Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
212177079be7Ssthen 			yyerror("expected yes or no.");
212277079be7Ssthen 		else cfg_parser->cfg->serve_expired = (strcmp($2, "yes")==0);
212377079be7Ssthen 		free($2);
212477079be7Ssthen 	}
212577079be7Ssthen 	;
21262308e98cSsthen server_serve_expired_ttl: VAR_SERVE_EXPIRED_TTL STRING_ARG
21272308e98cSsthen 	{
21282308e98cSsthen 		OUTYY(("P(server_serve_expired_ttl:%s)\n", $2));
21292308e98cSsthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
21302308e98cSsthen 			yyerror("number expected");
21312308e98cSsthen 		else cfg_parser->cfg->serve_expired_ttl = atoi($2);
21322308e98cSsthen 		free($2);
21332308e98cSsthen 	}
21342308e98cSsthen 	;
21352308e98cSsthen server_serve_expired_ttl_reset: VAR_SERVE_EXPIRED_TTL_RESET STRING_ARG
21362308e98cSsthen 	{
21372308e98cSsthen 		OUTYY(("P(server_serve_expired_ttl_reset:%s)\n", $2));
21382308e98cSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
21392308e98cSsthen 			yyerror("expected yes or no.");
21402308e98cSsthen 		else cfg_parser->cfg->serve_expired_ttl_reset = (strcmp($2, "yes")==0);
21412308e98cSsthen 		free($2);
21422308e98cSsthen 	}
21432308e98cSsthen 	;
2144eaf2578eSsthen server_serve_expired_reply_ttl: VAR_SERVE_EXPIRED_REPLY_TTL STRING_ARG
2145eaf2578eSsthen 	{
2146eaf2578eSsthen 		OUTYY(("P(server_serve_expired_reply_ttl:%s)\n", $2));
2147eaf2578eSsthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2148eaf2578eSsthen 			yyerror("number expected");
2149eaf2578eSsthen 		else cfg_parser->cfg->serve_expired_reply_ttl = atoi($2);
2150eaf2578eSsthen 		free($2);
2151eaf2578eSsthen 	}
2152eaf2578eSsthen 	;
2153eaf2578eSsthen server_serve_expired_client_timeout: VAR_SERVE_EXPIRED_CLIENT_TIMEOUT STRING_ARG
2154eaf2578eSsthen 	{
2155eaf2578eSsthen 		OUTYY(("P(server_serve_expired_client_timeout:%s)\n", $2));
2156eaf2578eSsthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2157eaf2578eSsthen 			yyerror("number expected");
2158eaf2578eSsthen 		else cfg_parser->cfg->serve_expired_client_timeout = atoi($2);
2159eaf2578eSsthen 		free($2);
2160eaf2578eSsthen 	}
2161eaf2578eSsthen 	;
21620bdb4f62Ssthen server_ede_serve_expired: VAR_EDE_SERVE_EXPIRED STRING_ARG
21630bdb4f62Ssthen 	{
21640bdb4f62Ssthen 		OUTYY(("P(server_ede_serve_expired:%s)\n", $2));
21650bdb4f62Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
21660bdb4f62Ssthen 			yyerror("expected yes or no.");
21670bdb4f62Ssthen 		else cfg_parser->cfg->ede_serve_expired = (strcmp($2, "yes")==0);
21680bdb4f62Ssthen 		free($2);
21690bdb4f62Ssthen 	}
21700bdb4f62Ssthen 	;
21719982a05dSsthen server_serve_original_ttl: VAR_SERVE_ORIGINAL_TTL STRING_ARG
21729982a05dSsthen 	{
21739982a05dSsthen 		OUTYY(("P(server_serve_original_ttl:%s)\n", $2));
21749982a05dSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
21759982a05dSsthen 			yyerror("expected yes or no.");
21769982a05dSsthen 		else cfg_parser->cfg->serve_original_ttl = (strcmp($2, "yes")==0);
21779982a05dSsthen 		free($2);
21789982a05dSsthen 	}
21799982a05dSsthen 	;
218077079be7Ssthen server_fake_dsa: VAR_FAKE_DSA STRING_ARG
218177079be7Ssthen 	{
218277079be7Ssthen 		OUTYY(("P(server_fake_dsa:%s)\n", $2));
218377079be7Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
218477079be7Ssthen 			yyerror("expected yes or no.");
2185eaf2578eSsthen #if defined(HAVE_SSL) || defined(HAVE_NETTLE)
218677079be7Ssthen 		else fake_dsa = (strcmp($2, "yes")==0);
218777079be7Ssthen 		if(fake_dsa)
218877079be7Ssthen 			log_warn("test option fake_dsa is enabled");
218977079be7Ssthen #endif
219077079be7Ssthen 		free($2);
219177079be7Ssthen 	}
219277079be7Ssthen 	;
21932be9e038Ssthen server_fake_sha1: VAR_FAKE_SHA1 STRING_ARG
21942be9e038Ssthen 	{
21952be9e038Ssthen 		OUTYY(("P(server_fake_sha1:%s)\n", $2));
21962be9e038Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
21972be9e038Ssthen 			yyerror("expected yes or no.");
2198eaf2578eSsthen #if defined(HAVE_SSL) || defined(HAVE_NETTLE)
21992be9e038Ssthen 		else fake_sha1 = (strcmp($2, "yes")==0);
22002be9e038Ssthen 		if(fake_sha1)
22012be9e038Ssthen 			log_warn("test option fake_sha1 is enabled");
22022be9e038Ssthen #endif
22032be9e038Ssthen 		free($2);
22042be9e038Ssthen 	}
22052be9e038Ssthen 	;
2206933707f3Ssthen server_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG
2207933707f3Ssthen 	{
2208933707f3Ssthen 		OUTYY(("P(server_val_log_level:%s)\n", $2));
2209933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2210933707f3Ssthen 			yyerror("number expected");
2211933707f3Ssthen 		else cfg_parser->cfg->val_log_level = atoi($2);
2212933707f3Ssthen 		free($2);
2213933707f3Ssthen 	}
2214933707f3Ssthen 	;
2215933707f3Ssthen server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG
2216933707f3Ssthen 	{
2217933707f3Ssthen 		OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", $2));
2218933707f3Ssthen 		free(cfg_parser->cfg->val_nsec3_key_iterations);
2219933707f3Ssthen 		cfg_parser->cfg->val_nsec3_key_iterations = $2;
2220933707f3Ssthen 	}
2221933707f3Ssthen 	;
2222191f22c6Ssthen server_zonemd_permissive_mode: VAR_ZONEMD_PERMISSIVE_MODE STRING_ARG
2223191f22c6Ssthen 	{
2224191f22c6Ssthen 		OUTYY(("P(server_zonemd_permissive_mode:%s)\n", $2));
2225191f22c6Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2226191f22c6Ssthen 			yyerror("expected yes or no.");
2227191f22c6Ssthen 		else	cfg_parser->cfg->zonemd_permissive_mode = (strcmp($2, "yes")==0);
2228191f22c6Ssthen 		free($2);
2229191f22c6Ssthen 	}
2230191f22c6Ssthen 	;
2231933707f3Ssthen server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG
2232933707f3Ssthen 	{
2233933707f3Ssthen 		OUTYY(("P(server_add_holddown:%s)\n", $2));
2234933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2235933707f3Ssthen 			yyerror("number expected");
2236933707f3Ssthen 		else cfg_parser->cfg->add_holddown = atoi($2);
2237933707f3Ssthen 		free($2);
2238933707f3Ssthen 	}
2239933707f3Ssthen 	;
2240933707f3Ssthen server_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG
2241933707f3Ssthen 	{
2242933707f3Ssthen 		OUTYY(("P(server_del_holddown:%s)\n", $2));
2243933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2244933707f3Ssthen 			yyerror("number expected");
2245933707f3Ssthen 		else cfg_parser->cfg->del_holddown = atoi($2);
2246933707f3Ssthen 		free($2);
2247933707f3Ssthen 	}
2248933707f3Ssthen 	;
2249933707f3Ssthen server_keep_missing: VAR_KEEP_MISSING STRING_ARG
2250933707f3Ssthen 	{
2251933707f3Ssthen 		OUTYY(("P(server_keep_missing:%s)\n", $2));
2252933707f3Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2253933707f3Ssthen 			yyerror("number expected");
2254933707f3Ssthen 		else cfg_parser->cfg->keep_missing = atoi($2);
2255933707f3Ssthen 		free($2);
2256933707f3Ssthen 	}
2257933707f3Ssthen 	;
2258a961b961Ssthen server_permit_small_holddown: VAR_PERMIT_SMALL_HOLDDOWN STRING_ARG
2259a961b961Ssthen 	{
2260a961b961Ssthen 		OUTYY(("P(server_permit_small_holddown:%s)\n", $2));
2261a961b961Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2262a961b961Ssthen 			yyerror("expected yes or no.");
2263a961b961Ssthen 		else cfg_parser->cfg->permit_small_holddown =
2264a961b961Ssthen 			(strcmp($2, "yes")==0);
2265a961b961Ssthen 		free($2);
2266a961b961Ssthen 	}
22678b7325afSsthen 	;
2268933707f3Ssthen server_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG
2269933707f3Ssthen 	{
2270933707f3Ssthen 		OUTYY(("P(server_key_cache_size:%s)\n", $2));
2271933707f3Ssthen 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->key_cache_size))
2272933707f3Ssthen 			yyerror("memory size expected");
2273933707f3Ssthen 		free($2);
2274933707f3Ssthen 	}
2275933707f3Ssthen 	;
2276933707f3Ssthen server_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG
2277933707f3Ssthen 	{
2278933707f3Ssthen 		OUTYY(("P(server_key_cache_slabs:%s)\n", $2));
2279e21c60efSsthen 		if(atoi($2) == 0) {
2280933707f3Ssthen 			yyerror("number expected");
2281e21c60efSsthen 		} else {
2282933707f3Ssthen 			cfg_parser->cfg->key_cache_slabs = atoi($2);
2283933707f3Ssthen 			if(!is_pow2(cfg_parser->cfg->key_cache_slabs))
2284933707f3Ssthen 				yyerror("must be a power of 2");
2285933707f3Ssthen 		}
2286933707f3Ssthen 		free($2);
2287933707f3Ssthen 	}
2288933707f3Ssthen 	;
2289933707f3Ssthen server_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG
2290933707f3Ssthen 	{
2291933707f3Ssthen 		OUTYY(("P(server_neg_cache_size:%s)\n", $2));
2292933707f3Ssthen 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->neg_cache_size))
2293933707f3Ssthen 			yyerror("memory size expected");
2294933707f3Ssthen 		free($2);
2295933707f3Ssthen 	}
2296933707f3Ssthen 	;
2297933707f3Ssthen server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
2298933707f3Ssthen 	{
2299933707f3Ssthen 		OUTYY(("P(server_local_zone:%s %s)\n", $2, $3));
2300933707f3Ssthen 		if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 &&
2301933707f3Ssthen 		   strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 &&
2302933707f3Ssthen 		   strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0
230377079be7Ssthen 		   && strcmp($3, "typetransparent")!=0
230477079be7Ssthen 		   && strcmp($3, "always_transparent")!=0
23058b7325afSsthen 		   && strcmp($3, "block_a")!=0
230677079be7Ssthen 		   && strcmp($3, "always_refuse")!=0
230777079be7Ssthen 		   && strcmp($3, "always_nxdomain")!=0
23089982a05dSsthen 		   && strcmp($3, "always_nodata")!=0
23099982a05dSsthen 		   && strcmp($3, "always_deny")!=0
23109982a05dSsthen 		   && strcmp($3, "always_null")!=0
2311938a3a5eSflorian 		   && strcmp($3, "noview")!=0
2312c3b38330Ssthen 		   && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0
23138240c1b9Ssthen 		   && strcmp($3, "inform_redirect") != 0
23148240c1b9Ssthen 		   && strcmp($3, "ipset") != 0) {
2315933707f3Ssthen 			yyerror("local-zone type: expected static, deny, "
2316933707f3Ssthen 				"refuse, redirect, transparent, "
231777079be7Ssthen 				"typetransparent, inform, inform_deny, "
23188b7325afSsthen 				"inform_redirect, always_transparent, block_a,"
23199982a05dSsthen 				"always_refuse, always_nxdomain, "
23209982a05dSsthen 				"always_nodata, always_deny, always_null, "
23219982a05dSsthen 				"noview, nodefault or ipset");
2322f6b99bafSsthen 			free($2);
2323f6b99bafSsthen 			free($3);
2324f6b99bafSsthen 		} else if(strcmp($3, "nodefault")==0) {
2325933707f3Ssthen 			if(!cfg_strlist_insert(&cfg_parser->cfg->
2326933707f3Ssthen 				local_zones_nodefault, $2))
2327933707f3Ssthen 				fatal_exit("out of memory adding local-zone");
2328933707f3Ssthen 			free($3);
23298240c1b9Ssthen #ifdef USE_IPSET
23308240c1b9Ssthen 		} else if(strcmp($3, "ipset")==0) {
23310bdb4f62Ssthen 			size_t len = strlen($2);
23320bdb4f62Ssthen 			/* Make sure to add the trailing dot.
23330bdb4f62Ssthen 			 * These are str compared to domain names. */
23340bdb4f62Ssthen 			if($2[len-1] != '.') {
23350bdb4f62Ssthen 				if(!($2 = realloc($2, len+2))) {
23360bdb4f62Ssthen 					fatal_exit("out of memory adding local-zone");
23370bdb4f62Ssthen 				}
23380bdb4f62Ssthen 				$2[len] = '.';
23390bdb4f62Ssthen 				$2[len+1] = 0;
23400bdb4f62Ssthen 			}
23418240c1b9Ssthen 			if(!cfg_strlist_insert(&cfg_parser->cfg->
23428240c1b9Ssthen 				local_zones_ipset, $2))
23438240c1b9Ssthen 				fatal_exit("out of memory adding local-zone");
23448240c1b9Ssthen 			free($3);
23458240c1b9Ssthen #endif
2346933707f3Ssthen 		} else {
2347933707f3Ssthen 			if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones,
2348933707f3Ssthen 				$2, $3))
2349933707f3Ssthen 				fatal_exit("out of memory adding local-zone");
2350933707f3Ssthen 		}
2351933707f3Ssthen 	}
2352933707f3Ssthen 	;
2353933707f3Ssthen server_local_data: VAR_LOCAL_DATA STRING_ARG
2354933707f3Ssthen 	{
2355933707f3Ssthen 		OUTYY(("P(server_local_data:%s)\n", $2));
2356933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, $2))
2357933707f3Ssthen 			fatal_exit("out of memory adding local-data");
2358933707f3Ssthen 	}
2359933707f3Ssthen 	;
2360933707f3Ssthen server_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG
2361933707f3Ssthen 	{
2362933707f3Ssthen 		char* ptr;
2363933707f3Ssthen 		OUTYY(("P(server_local_data_ptr:%s)\n", $2));
2364933707f3Ssthen 		ptr = cfg_ptr_reverse($2);
2365933707f3Ssthen 		free($2);
2366933707f3Ssthen 		if(ptr) {
2367933707f3Ssthen 			if(!cfg_strlist_insert(&cfg_parser->cfg->
2368933707f3Ssthen 				local_data, ptr))
2369933707f3Ssthen 				fatal_exit("out of memory adding local-data");
2370933707f3Ssthen 		} else {
2371933707f3Ssthen 			yyerror("local-data-ptr could not be reversed");
2372933707f3Ssthen 		}
2373933707f3Ssthen 	}
2374933707f3Ssthen 	;
2375d8d14d0cSsthen server_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG
2376d8d14d0cSsthen 	{
2377d8d14d0cSsthen 		OUTYY(("P(server_minimal_responses:%s)\n", $2));
2378d8d14d0cSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2379d8d14d0cSsthen 			yyerror("expected yes or no.");
2380d8d14d0cSsthen 		else cfg_parser->cfg->minimal_responses =
2381d8d14d0cSsthen 			(strcmp($2, "yes")==0);
2382d8d14d0cSsthen 		free($2);
2383d8d14d0cSsthen 	}
2384d8d14d0cSsthen 	;
2385d8d14d0cSsthen server_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG
2386d8d14d0cSsthen 	{
2387d8d14d0cSsthen 		OUTYY(("P(server_rrset_roundrobin:%s)\n", $2));
2388d8d14d0cSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2389d8d14d0cSsthen 			yyerror("expected yes or no.");
2390d8d14d0cSsthen 		else cfg_parser->cfg->rrset_roundrobin =
2391d8d14d0cSsthen 			(strcmp($2, "yes")==0);
2392d8d14d0cSsthen 		free($2);
2393d8d14d0cSsthen 	}
2394d8d14d0cSsthen 	;
23953150e5f6Ssthen server_unknown_server_time_limit: VAR_UNKNOWN_SERVER_TIME_LIMIT STRING_ARG
23963150e5f6Ssthen 	{
23973150e5f6Ssthen 		OUTYY(("P(server_unknown_server_time_limit:%s)\n", $2));
23983150e5f6Ssthen 		cfg_parser->cfg->unknown_server_time_limit = atoi($2);
23993150e5f6Ssthen 		free($2);
24003150e5f6Ssthen 	}
24013150e5f6Ssthen 	;
24022bdc0ed1Ssthen server_discard_timeout: VAR_DISCARD_TIMEOUT STRING_ARG
24032bdc0ed1Ssthen 	{
24042bdc0ed1Ssthen 		OUTYY(("P(server_discard_timeout:%s)\n", $2));
24052bdc0ed1Ssthen 		cfg_parser->cfg->discard_timeout = atoi($2);
24062bdc0ed1Ssthen 		free($2);
24072bdc0ed1Ssthen 	}
24082bdc0ed1Ssthen 	;
24092bdc0ed1Ssthen server_wait_limit: VAR_WAIT_LIMIT STRING_ARG
24102bdc0ed1Ssthen 	{
24112bdc0ed1Ssthen 		OUTYY(("P(server_wait_limit:%s)\n", $2));
24122bdc0ed1Ssthen 		cfg_parser->cfg->wait_limit = atoi($2);
24132bdc0ed1Ssthen 		free($2);
24142bdc0ed1Ssthen 	}
24152bdc0ed1Ssthen 	;
24162bdc0ed1Ssthen server_wait_limit_cookie: VAR_WAIT_LIMIT_COOKIE STRING_ARG
24172bdc0ed1Ssthen 	{
24182bdc0ed1Ssthen 		OUTYY(("P(server_wait_limit_cookie:%s)\n", $2));
24192bdc0ed1Ssthen 		cfg_parser->cfg->wait_limit_cookie = atoi($2);
24202bdc0ed1Ssthen 		free($2);
24212bdc0ed1Ssthen 	}
24222bdc0ed1Ssthen 	;
24232bdc0ed1Ssthen server_wait_limit_netblock: VAR_WAIT_LIMIT_NETBLOCK STRING_ARG STRING_ARG
24242bdc0ed1Ssthen 	{
24252bdc0ed1Ssthen 		OUTYY(("P(server_wait_limit_netblock:%s %s)\n", $2, $3));
24262bdc0ed1Ssthen 		if(atoi($3) == 0 && strcmp($3, "0") != 0) {
24272bdc0ed1Ssthen 			yyerror("number expected");
24282bdc0ed1Ssthen 			free($2);
24292bdc0ed1Ssthen 			free($3);
24302bdc0ed1Ssthen 		} else {
24312bdc0ed1Ssthen 			if(!cfg_str2list_insert(&cfg_parser->cfg->
24322bdc0ed1Ssthen 				wait_limit_netblock, $2, $3))
24332bdc0ed1Ssthen 				fatal_exit("out of memory adding "
24342bdc0ed1Ssthen 					"wait-limit-netblock");
24352bdc0ed1Ssthen 		}
24362bdc0ed1Ssthen 	}
24372bdc0ed1Ssthen 	;
24382bdc0ed1Ssthen server_wait_limit_cookie_netblock: VAR_WAIT_LIMIT_COOKIE_NETBLOCK STRING_ARG STRING_ARG
24392bdc0ed1Ssthen 	{
24402bdc0ed1Ssthen 		OUTYY(("P(server_wait_limit_cookie_netblock:%s %s)\n", $2, $3));
24412bdc0ed1Ssthen 		if(atoi($3) == 0 && strcmp($3, "0") != 0) {
24422bdc0ed1Ssthen 			yyerror("number expected");
24432bdc0ed1Ssthen 			free($2);
24442bdc0ed1Ssthen 			free($3);
24452bdc0ed1Ssthen 		} else {
24462bdc0ed1Ssthen 			if(!cfg_str2list_insert(&cfg_parser->cfg->
24472bdc0ed1Ssthen 				wait_limit_cookie_netblock, $2, $3))
24482bdc0ed1Ssthen 				fatal_exit("out of memory adding "
24492bdc0ed1Ssthen 					"wait-limit-cookie-netblock");
24502bdc0ed1Ssthen 		}
24512bdc0ed1Ssthen 	}
24522bdc0ed1Ssthen 	;
2453229e174cSsthen server_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG
2454229e174cSsthen 	{
2455229e174cSsthen 		OUTYY(("P(server_max_udp_size:%s)\n", $2));
2456229e174cSsthen 		cfg_parser->cfg->max_udp_size = atoi($2);
2457229e174cSsthen 		free($2);
2458229e174cSsthen 	}
2459229e174cSsthen 	;
246098f3ca02Sbrad server_dns64_prefix: VAR_DNS64_PREFIX STRING_ARG
246198f3ca02Sbrad 	{
246298f3ca02Sbrad 		OUTYY(("P(dns64_prefix:%s)\n", $2));
246398f3ca02Sbrad 		free(cfg_parser->cfg->dns64_prefix);
246498f3ca02Sbrad 		cfg_parser->cfg->dns64_prefix = $2;
246598f3ca02Sbrad 	}
246698f3ca02Sbrad 	;
246798f3ca02Sbrad server_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG
246898f3ca02Sbrad 	{
246998f3ca02Sbrad 		OUTYY(("P(server_dns64_synthall:%s)\n", $2));
247098f3ca02Sbrad 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
247198f3ca02Sbrad 			yyerror("expected yes or no.");
247298f3ca02Sbrad 		else cfg_parser->cfg->dns64_synthall = (strcmp($2, "yes")==0);
247398f3ca02Sbrad 		free($2);
247498f3ca02Sbrad 	}
247598f3ca02Sbrad 	;
24762308e98cSsthen server_dns64_ignore_aaaa: VAR_DNS64_IGNORE_AAAA STRING_ARG
24772308e98cSsthen 	{
24782308e98cSsthen 		OUTYY(("P(dns64_ignore_aaaa:%s)\n", $2));
24792308e98cSsthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->dns64_ignore_aaaa,
24802308e98cSsthen 			$2))
24812308e98cSsthen 			fatal_exit("out of memory adding dns64-ignore-aaaa");
24822308e98cSsthen 	}
24832308e98cSsthen 	;
24848b7325afSsthen server_nat64_prefix: VAR_NAT64_PREFIX STRING_ARG
24858b7325afSsthen 	{
24868b7325afSsthen 		OUTYY(("P(nat64_prefix:%s)\n", $2));
24878b7325afSsthen 		free(cfg_parser->cfg->nat64_prefix);
24888b7325afSsthen 		cfg_parser->cfg->nat64_prefix = $2;
24898b7325afSsthen 	}
24908b7325afSsthen 	;
24912ee382b6Ssthen server_define_tag: VAR_DEFINE_TAG STRING_ARG
24922ee382b6Ssthen 	{
24932ee382b6Ssthen 		char* p, *s = $2;
24942ee382b6Ssthen 		OUTYY(("P(server_define_tag:%s)\n", $2));
24952ee382b6Ssthen 		while((p=strsep(&s, " \t\n")) != NULL) {
24962ee382b6Ssthen 			if(*p) {
24972ee382b6Ssthen 				if(!config_add_tag(cfg_parser->cfg, p))
24982ee382b6Ssthen 					yyerror("could not define-tag, "
24992ee382b6Ssthen 						"out of memory");
25002ee382b6Ssthen 			}
25012ee382b6Ssthen 		}
25022ee382b6Ssthen 		free($2);
25032ee382b6Ssthen 	}
25042ee382b6Ssthen 	;
25052ee382b6Ssthen server_local_zone_tag: VAR_LOCAL_ZONE_TAG STRING_ARG STRING_ARG
25062ee382b6Ssthen 	{
25072ee382b6Ssthen 		size_t len = 0;
25082ee382b6Ssthen 		uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
25092ee382b6Ssthen 			&len);
25102ee382b6Ssthen 		free($3);
25112ee382b6Ssthen 		OUTYY(("P(server_local_zone_tag:%s)\n", $2));
2512f6b99bafSsthen 		if(!bitlist) {
25132ee382b6Ssthen 			yyerror("could not parse tags, (define-tag them first)");
2514f6b99bafSsthen 			free($2);
2515f6b99bafSsthen 		}
25162ee382b6Ssthen 		if(bitlist) {
25172ee382b6Ssthen 			if(!cfg_strbytelist_insert(
25182ee382b6Ssthen 				&cfg_parser->cfg->local_zone_tags,
25192ee382b6Ssthen 				$2, bitlist, len)) {
25202ee382b6Ssthen 				yyerror("out of memory");
25212ee382b6Ssthen 				free($2);
25222ee382b6Ssthen 			}
25232ee382b6Ssthen 		}
25242ee382b6Ssthen 	}
25252ee382b6Ssthen 	;
252677079be7Ssthen server_access_control_tag: VAR_ACCESS_CONTROL_TAG STRING_ARG STRING_ARG
252777079be7Ssthen 	{
252877079be7Ssthen 		size_t len = 0;
252977079be7Ssthen 		uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
253077079be7Ssthen 			&len);
253177079be7Ssthen 		free($3);
253277079be7Ssthen 		OUTYY(("P(server_access_control_tag:%s)\n", $2));
2533f6b99bafSsthen 		if(!bitlist) {
253477079be7Ssthen 			yyerror("could not parse tags, (define-tag them first)");
2535f6b99bafSsthen 			free($2);
2536f6b99bafSsthen 		}
253777079be7Ssthen 		if(bitlist) {
253877079be7Ssthen 			if(!cfg_strbytelist_insert(
253977079be7Ssthen 				&cfg_parser->cfg->acl_tags,
254077079be7Ssthen 				$2, bitlist, len)) {
254177079be7Ssthen 				yyerror("out of memory");
254277079be7Ssthen 				free($2);
254377079be7Ssthen 			}
254477079be7Ssthen 		}
254577079be7Ssthen 	}
254677079be7Ssthen 	;
254777079be7Ssthen server_access_control_tag_action: VAR_ACCESS_CONTROL_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG
254877079be7Ssthen 	{
254977079be7Ssthen 		OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", $2, $3, $4));
255077079be7Ssthen 		if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions,
255177079be7Ssthen 			$2, $3, $4)) {
255277079be7Ssthen 			yyerror("out of memory");
255377079be7Ssthen 			free($2);
255477079be7Ssthen 			free($3);
255577079be7Ssthen 			free($4);
255677079be7Ssthen 		}
255777079be7Ssthen 	}
255877079be7Ssthen 	;
255977079be7Ssthen server_access_control_tag_data: VAR_ACCESS_CONTROL_TAG_DATA STRING_ARG STRING_ARG STRING_ARG
256077079be7Ssthen 	{
256177079be7Ssthen 		OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", $2, $3, $4));
256277079be7Ssthen 		if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas,
256377079be7Ssthen 			$2, $3, $4)) {
256477079be7Ssthen 			yyerror("out of memory");
256577079be7Ssthen 			free($2);
256677079be7Ssthen 			free($3);
256777079be7Ssthen 			free($4);
256877079be7Ssthen 		}
256977079be7Ssthen 	}
257077079be7Ssthen 	;
257177079be7Ssthen server_local_zone_override: VAR_LOCAL_ZONE_OVERRIDE STRING_ARG STRING_ARG STRING_ARG
257277079be7Ssthen 	{
257377079be7Ssthen 		OUTYY(("P(server_local_zone_override:%s %s %s)\n", $2, $3, $4));
257477079be7Ssthen 		if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides,
257577079be7Ssthen 			$2, $3, $4)) {
257677079be7Ssthen 			yyerror("out of memory");
257777079be7Ssthen 			free($2);
257877079be7Ssthen 			free($3);
257977079be7Ssthen 			free($4);
258077079be7Ssthen 		}
258177079be7Ssthen 	}
258277079be7Ssthen 	;
258377079be7Ssthen server_access_control_view: VAR_ACCESS_CONTROL_VIEW STRING_ARG STRING_ARG
258477079be7Ssthen 	{
258577079be7Ssthen 		OUTYY(("P(server_access_control_view:%s %s)\n", $2, $3));
258677079be7Ssthen 		if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view,
258777079be7Ssthen 			$2, $3)) {
258877079be7Ssthen 			yyerror("out of memory");
258977079be7Ssthen 		}
259077079be7Ssthen 	}
259177079be7Ssthen 	;
259245872187Ssthen server_interface_tag: VAR_INTERFACE_TAG STRING_ARG STRING_ARG
259345872187Ssthen 	{
259445872187Ssthen 		size_t len = 0;
259545872187Ssthen 		uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
259645872187Ssthen 			&len);
259745872187Ssthen 		free($3);
259845872187Ssthen 		OUTYY(("P(server_interface_tag:%s)\n", $2));
259945872187Ssthen 		if(!bitlist) {
260045872187Ssthen 			yyerror("could not parse tags, (define-tag them first)");
260145872187Ssthen 			free($2);
260245872187Ssthen 		}
260345872187Ssthen 		if(bitlist) {
260445872187Ssthen 			if(!cfg_strbytelist_insert(
260545872187Ssthen 				&cfg_parser->cfg->interface_tags,
260645872187Ssthen 				$2, bitlist, len)) {
260745872187Ssthen 				yyerror("out of memory");
260845872187Ssthen 				free($2);
260945872187Ssthen 			}
261045872187Ssthen 		}
261145872187Ssthen 	}
261245872187Ssthen 	;
261345872187Ssthen server_interface_tag_action: VAR_INTERFACE_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG
261445872187Ssthen 	{
261545872187Ssthen 		OUTYY(("P(server_interface_tag_action:%s %s %s)\n", $2, $3, $4));
261645872187Ssthen 		if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_actions,
261745872187Ssthen 			$2, $3, $4)) {
261845872187Ssthen 			yyerror("out of memory");
261945872187Ssthen 			free($2);
262045872187Ssthen 			free($3);
262145872187Ssthen 			free($4);
262245872187Ssthen 		}
262345872187Ssthen 	}
262445872187Ssthen 	;
262545872187Ssthen server_interface_tag_data: VAR_INTERFACE_TAG_DATA STRING_ARG STRING_ARG STRING_ARG
262645872187Ssthen 	{
262745872187Ssthen 		OUTYY(("P(server_interface_tag_data:%s %s %s)\n", $2, $3, $4));
262845872187Ssthen 		if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_datas,
262945872187Ssthen 			$2, $3, $4)) {
263045872187Ssthen 			yyerror("out of memory");
263145872187Ssthen 			free($2);
263245872187Ssthen 			free($3);
263345872187Ssthen 			free($4);
263445872187Ssthen 		}
263545872187Ssthen 	}
263645872187Ssthen 	;
263745872187Ssthen server_interface_view: VAR_INTERFACE_VIEW STRING_ARG STRING_ARG
263845872187Ssthen 	{
263945872187Ssthen 		OUTYY(("P(server_interface_view:%s %s)\n", $2, $3));
264045872187Ssthen 		if(!cfg_str2list_insert(&cfg_parser->cfg->interface_view,
264145872187Ssthen 			$2, $3)) {
264245872187Ssthen 			yyerror("out of memory");
264345872187Ssthen 		}
264445872187Ssthen 	}
264545872187Ssthen 	;
26462be9e038Ssthen server_response_ip_tag: VAR_RESPONSE_IP_TAG STRING_ARG STRING_ARG
26472be9e038Ssthen 	{
26482be9e038Ssthen 		size_t len = 0;
26492be9e038Ssthen 		uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
26502be9e038Ssthen 			&len);
26512be9e038Ssthen 		free($3);
26522be9e038Ssthen 		OUTYY(("P(response_ip_tag:%s)\n", $2));
2653f6b99bafSsthen 		if(!bitlist) {
26542be9e038Ssthen 			yyerror("could not parse tags, (define-tag them first)");
2655f6b99bafSsthen 			free($2);
2656f6b99bafSsthen 		}
26572be9e038Ssthen 		if(bitlist) {
26582be9e038Ssthen 			if(!cfg_strbytelist_insert(
26592be9e038Ssthen 				&cfg_parser->cfg->respip_tags,
26602be9e038Ssthen 				$2, bitlist, len)) {
26612be9e038Ssthen 				yyerror("out of memory");
26622be9e038Ssthen 				free($2);
26632be9e038Ssthen 			}
26642be9e038Ssthen 		}
26652be9e038Ssthen 	}
26662be9e038Ssthen 	;
266777079be7Ssthen server_ip_ratelimit: VAR_IP_RATELIMIT STRING_ARG
266877079be7Ssthen 	{
266977079be7Ssthen 		OUTYY(("P(server_ip_ratelimit:%s)\n", $2));
267077079be7Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
267177079be7Ssthen 			yyerror("number expected");
267277079be7Ssthen 		else cfg_parser->cfg->ip_ratelimit = atoi($2);
267377079be7Ssthen 		free($2);
267477079be7Ssthen 	}
267577079be7Ssthen 	;
26768b7325afSsthen server_ip_ratelimit_cookie: VAR_IP_RATELIMIT_COOKIE STRING_ARG
26778b7325afSsthen 	{
26788b7325afSsthen 		OUTYY(("P(server_ip_ratelimit_cookie:%s)\n", $2));
26798b7325afSsthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
26808b7325afSsthen 			yyerror("number expected");
26818b7325afSsthen 		else cfg_parser->cfg->ip_ratelimit_cookie = atoi($2);
26828b7325afSsthen 		free($2);
26838b7325afSsthen 	}
26848b7325afSsthen 	;
2685fdfb4ba6Ssthen server_ratelimit: VAR_RATELIMIT STRING_ARG
2686fdfb4ba6Ssthen 	{
2687fdfb4ba6Ssthen 		OUTYY(("P(server_ratelimit:%s)\n", $2));
2688fdfb4ba6Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2689fdfb4ba6Ssthen 			yyerror("number expected");
2690fdfb4ba6Ssthen 		else cfg_parser->cfg->ratelimit = atoi($2);
2691fdfb4ba6Ssthen 		free($2);
2692fdfb4ba6Ssthen 	}
2693fdfb4ba6Ssthen 	;
269477079be7Ssthen server_ip_ratelimit_size: VAR_IP_RATELIMIT_SIZE STRING_ARG
269577079be7Ssthen 	{
269677079be7Ssthen 		OUTYY(("P(server_ip_ratelimit_size:%s)\n", $2));
269777079be7Ssthen 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->ip_ratelimit_size))
269877079be7Ssthen 			yyerror("memory size expected");
269977079be7Ssthen 		free($2);
270077079be7Ssthen 	}
270177079be7Ssthen 	;
2702fdfb4ba6Ssthen server_ratelimit_size: VAR_RATELIMIT_SIZE STRING_ARG
2703fdfb4ba6Ssthen 	{
2704fdfb4ba6Ssthen 		OUTYY(("P(server_ratelimit_size:%s)\n", $2));
2705fdfb4ba6Ssthen 		if(!cfg_parse_memsize($2, &cfg_parser->cfg->ratelimit_size))
2706fdfb4ba6Ssthen 			yyerror("memory size expected");
2707fdfb4ba6Ssthen 		free($2);
2708fdfb4ba6Ssthen 	}
2709fdfb4ba6Ssthen 	;
271077079be7Ssthen server_ip_ratelimit_slabs: VAR_IP_RATELIMIT_SLABS STRING_ARG
271177079be7Ssthen 	{
271277079be7Ssthen 		OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", $2));
2713e21c60efSsthen 		if(atoi($2) == 0) {
271477079be7Ssthen 			yyerror("number expected");
2715e21c60efSsthen 		} else {
271677079be7Ssthen 			cfg_parser->cfg->ip_ratelimit_slabs = atoi($2);
271777079be7Ssthen 			if(!is_pow2(cfg_parser->cfg->ip_ratelimit_slabs))
271877079be7Ssthen 				yyerror("must be a power of 2");
271977079be7Ssthen 		}
272077079be7Ssthen 		free($2);
272177079be7Ssthen 	}
272277079be7Ssthen 	;
2723fdfb4ba6Ssthen server_ratelimit_slabs: VAR_RATELIMIT_SLABS STRING_ARG
2724fdfb4ba6Ssthen 	{
2725fdfb4ba6Ssthen 		OUTYY(("P(server_ratelimit_slabs:%s)\n", $2));
2726e21c60efSsthen 		if(atoi($2) == 0) {
2727fdfb4ba6Ssthen 			yyerror("number expected");
2728e21c60efSsthen 		} else {
2729fdfb4ba6Ssthen 			cfg_parser->cfg->ratelimit_slabs = atoi($2);
2730fdfb4ba6Ssthen 			if(!is_pow2(cfg_parser->cfg->ratelimit_slabs))
2731fdfb4ba6Ssthen 				yyerror("must be a power of 2");
2732fdfb4ba6Ssthen 		}
2733fdfb4ba6Ssthen 		free($2);
2734fdfb4ba6Ssthen 	}
2735fdfb4ba6Ssthen 	;
2736fdfb4ba6Ssthen server_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG
2737fdfb4ba6Ssthen 	{
2738fdfb4ba6Ssthen 		OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", $2, $3));
2739fdfb4ba6Ssthen 		if(atoi($3) == 0 && strcmp($3, "0") != 0) {
2740fdfb4ba6Ssthen 			yyerror("number expected");
2741f6b99bafSsthen 			free($2);
2742f6b99bafSsthen 			free($3);
2743fdfb4ba6Ssthen 		} else {
2744fdfb4ba6Ssthen 			if(!cfg_str2list_insert(&cfg_parser->cfg->
2745fdfb4ba6Ssthen 				ratelimit_for_domain, $2, $3))
2746fdfb4ba6Ssthen 				fatal_exit("out of memory adding "
2747fdfb4ba6Ssthen 					"ratelimit-for-domain");
2748fdfb4ba6Ssthen 		}
2749fdfb4ba6Ssthen 	}
2750fdfb4ba6Ssthen 	;
2751fdfb4ba6Ssthen server_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG
2752fdfb4ba6Ssthen 	{
2753fdfb4ba6Ssthen 		OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", $2, $3));
2754fdfb4ba6Ssthen 		if(atoi($3) == 0 && strcmp($3, "0") != 0) {
2755fdfb4ba6Ssthen 			yyerror("number expected");
2756f6b99bafSsthen 			free($2);
2757f6b99bafSsthen 			free($3);
2758fdfb4ba6Ssthen 		} else {
2759fdfb4ba6Ssthen 			if(!cfg_str2list_insert(&cfg_parser->cfg->
2760fdfb4ba6Ssthen 				ratelimit_below_domain, $2, $3))
2761fdfb4ba6Ssthen 				fatal_exit("out of memory adding "
2762fdfb4ba6Ssthen 					"ratelimit-below-domain");
2763fdfb4ba6Ssthen 		}
2764fdfb4ba6Ssthen 	}
2765fdfb4ba6Ssthen 	;
276677079be7Ssthen server_ip_ratelimit_factor: VAR_IP_RATELIMIT_FACTOR STRING_ARG
276777079be7Ssthen 	{
276877079be7Ssthen 		OUTYY(("P(server_ip_ratelimit_factor:%s)\n", $2));
276977079be7Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
277077079be7Ssthen 			yyerror("number expected");
277177079be7Ssthen 		else cfg_parser->cfg->ip_ratelimit_factor = atoi($2);
277277079be7Ssthen 		free($2);
277377079be7Ssthen 	}
277477079be7Ssthen 	;
2775fdfb4ba6Ssthen server_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG
2776fdfb4ba6Ssthen 	{
2777fdfb4ba6Ssthen 		OUTYY(("P(server_ratelimit_factor:%s)\n", $2));
2778fdfb4ba6Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2779fdfb4ba6Ssthen 			yyerror("number expected");
2780fdfb4ba6Ssthen 		else cfg_parser->cfg->ratelimit_factor = atoi($2);
2781fdfb4ba6Ssthen 		free($2);
2782fdfb4ba6Ssthen 	}
2783fdfb4ba6Ssthen 	;
2784e21c60efSsthen server_ip_ratelimit_backoff: VAR_IP_RATELIMIT_BACKOFF STRING_ARG
2785e21c60efSsthen 	{
2786e21c60efSsthen 		OUTYY(("P(server_ip_ratelimit_backoff:%s)\n", $2));
2787e21c60efSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2788e21c60efSsthen 			yyerror("expected yes or no.");
2789e21c60efSsthen 		else cfg_parser->cfg->ip_ratelimit_backoff =
2790e21c60efSsthen 			(strcmp($2, "yes")==0);
2791e21c60efSsthen 		free($2);
2792e21c60efSsthen 	}
2793e21c60efSsthen 	;
2794e21c60efSsthen server_ratelimit_backoff: VAR_RATELIMIT_BACKOFF STRING_ARG
2795e21c60efSsthen 	{
2796e21c60efSsthen 		OUTYY(("P(server_ratelimit_backoff:%s)\n", $2));
2797e21c60efSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
2798e21c60efSsthen 			yyerror("expected yes or no.");
2799e21c60efSsthen 		else cfg_parser->cfg->ratelimit_backoff =
2800e21c60efSsthen 			(strcmp($2, "yes")==0);
2801e21c60efSsthen 		free($2);
2802e21c60efSsthen 	}
2803e21c60efSsthen 	;
2804e21c60efSsthen server_outbound_msg_retry: VAR_OUTBOUND_MSG_RETRY STRING_ARG
2805e21c60efSsthen 	{
2806e21c60efSsthen 		OUTYY(("P(server_outbound_msg_retry:%s)\n", $2));
2807e21c60efSsthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
2808e21c60efSsthen 			yyerror("number expected");
2809e21c60efSsthen 		else cfg_parser->cfg->outbound_msg_retry = atoi($2);
2810e21c60efSsthen 		free($2);
2811e21c60efSsthen 	}
2812e21c60efSsthen 	;
28138b7325afSsthen server_max_sent_count: VAR_MAX_SENT_COUNT STRING_ARG
28148b7325afSsthen 	{
28158b7325afSsthen 		OUTYY(("P(server_max_sent_count:%s)\n", $2));
28168b7325afSsthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
28178b7325afSsthen 			yyerror("number expected");
28188b7325afSsthen 		else cfg_parser->cfg->max_sent_count = atoi($2);
28198b7325afSsthen 		free($2);
28208b7325afSsthen 	}
28218b7325afSsthen 	;
28228b7325afSsthen server_max_query_restarts: VAR_MAX_QUERY_RESTARTS STRING_ARG
28238b7325afSsthen 	{
28248b7325afSsthen 		OUTYY(("P(server_max_query_restarts:%s)\n", $2));
28258b7325afSsthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
28268b7325afSsthen 			yyerror("number expected");
28278b7325afSsthen 		else cfg_parser->cfg->max_query_restarts = atoi($2);
28288b7325afSsthen 		free($2);
28298b7325afSsthen 	}
28308b7325afSsthen 	;
283120237c55Ssthen server_low_rtt: VAR_LOW_RTT STRING_ARG
283220237c55Ssthen 	{
28333150e5f6Ssthen 		OUTYY(("P(low-rtt option is deprecated, use fast-server-num instead)\n"));
283420237c55Ssthen 		free($2);
283520237c55Ssthen 	}
283620237c55Ssthen 	;
28373150e5f6Ssthen server_fast_server_num: VAR_FAST_SERVER_NUM STRING_ARG
283820237c55Ssthen 	{
28393150e5f6Ssthen 		OUTYY(("P(server_fast_server_num:%s)\n", $2));
28403150e5f6Ssthen 		if(atoi($2) <= 0)
28413150e5f6Ssthen 			yyerror("number expected");
28423150e5f6Ssthen 		else cfg_parser->cfg->fast_server_num = atoi($2);
28433150e5f6Ssthen 		free($2);
28443150e5f6Ssthen 	}
28453150e5f6Ssthen 	;
28463150e5f6Ssthen server_fast_server_permil: VAR_FAST_SERVER_PERMIL STRING_ARG
28473150e5f6Ssthen 	{
28483150e5f6Ssthen 		OUTYY(("P(server_fast_server_permil:%s)\n", $2));
284920237c55Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
285020237c55Ssthen 			yyerror("number expected");
28513150e5f6Ssthen 		else cfg_parser->cfg->fast_server_permil = atoi($2);
285220237c55Ssthen 		free($2);
285320237c55Ssthen 	}
285420237c55Ssthen 	;
285524893edcSsthen server_qname_minimisation: VAR_QNAME_MINIMISATION STRING_ARG
285624893edcSsthen 	{
285724893edcSsthen 		OUTYY(("P(server_qname_minimisation:%s)\n", $2));
285824893edcSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
285924893edcSsthen 			yyerror("expected yes or no.");
286024893edcSsthen 		else cfg_parser->cfg->qname_minimisation =
286124893edcSsthen 			(strcmp($2, "yes")==0);
286224893edcSsthen 		free($2);
286324893edcSsthen 	}
286424893edcSsthen 	;
286577079be7Ssthen server_qname_minimisation_strict: VAR_QNAME_MINIMISATION_STRICT STRING_ARG
286677079be7Ssthen 	{
286777079be7Ssthen 		OUTYY(("P(server_qname_minimisation_strict:%s)\n", $2));
286877079be7Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
286977079be7Ssthen 			yyerror("expected yes or no.");
287077079be7Ssthen 		else cfg_parser->cfg->qname_minimisation_strict =
287177079be7Ssthen 			(strcmp($2, "yes")==0);
287277079be7Ssthen 		free($2);
287377079be7Ssthen 	}
287477079be7Ssthen 	;
28759982a05dSsthen server_pad_responses: VAR_PAD_RESPONSES STRING_ARG
28769982a05dSsthen 	{
28779982a05dSsthen 		OUTYY(("P(server_pad_responses:%s)\n", $2));
28789982a05dSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
28799982a05dSsthen 			yyerror("expected yes or no.");
28809982a05dSsthen 		else cfg_parser->cfg->pad_responses =
28819982a05dSsthen 			(strcmp($2, "yes")==0);
28829982a05dSsthen 		free($2);
28839982a05dSsthen 	}
28849982a05dSsthen 	;
28859982a05dSsthen server_pad_responses_block_size: VAR_PAD_RESPONSES_BLOCK_SIZE STRING_ARG
28869982a05dSsthen 	{
28879982a05dSsthen 		OUTYY(("P(server_pad_responses_block_size:%s)\n", $2));
28889982a05dSsthen 		if(atoi($2) == 0)
28899982a05dSsthen 			yyerror("number expected");
28909982a05dSsthen 		else cfg_parser->cfg->pad_responses_block_size = atoi($2);
28919982a05dSsthen 		free($2);
28929982a05dSsthen 	}
28939982a05dSsthen 	;
28949982a05dSsthen server_pad_queries: VAR_PAD_QUERIES STRING_ARG
28959982a05dSsthen 	{
28969982a05dSsthen 		OUTYY(("P(server_pad_queries:%s)\n", $2));
28979982a05dSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
28989982a05dSsthen 			yyerror("expected yes or no.");
28999982a05dSsthen 		else cfg_parser->cfg->pad_queries =
29009982a05dSsthen 			(strcmp($2, "yes")==0);
29019982a05dSsthen 		free($2);
29029982a05dSsthen 	}
29039982a05dSsthen 	;
29049982a05dSsthen server_pad_queries_block_size: VAR_PAD_QUERIES_BLOCK_SIZE STRING_ARG
29059982a05dSsthen 	{
29069982a05dSsthen 		OUTYY(("P(server_pad_queries_block_size:%s)\n", $2));
29079982a05dSsthen 		if(atoi($2) == 0)
29089982a05dSsthen 			yyerror("number expected");
29099982a05dSsthen 		else cfg_parser->cfg->pad_queries_block_size = atoi($2);
29109982a05dSsthen 		free($2);
29119982a05dSsthen 	}
29129982a05dSsthen 	;
29132be9e038Ssthen server_ipsecmod_enabled: VAR_IPSECMOD_ENABLED STRING_ARG
29142be9e038Ssthen 	{
29152be9e038Ssthen 	#ifdef USE_IPSECMOD
29162be9e038Ssthen 		OUTYY(("P(server_ipsecmod_enabled:%s)\n", $2));
29172be9e038Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
29182be9e038Ssthen 			yyerror("expected yes or no.");
29192be9e038Ssthen 		else cfg_parser->cfg->ipsecmod_enabled = (strcmp($2, "yes")==0);
29202be9e038Ssthen 	#else
29212be9e038Ssthen 		OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
29222be9e038Ssthen 	#endif
2923f6b99bafSsthen 		free($2);
29242be9e038Ssthen 	}
29252be9e038Ssthen 	;
29262be9e038Ssthen server_ipsecmod_ignore_bogus: VAR_IPSECMOD_IGNORE_BOGUS STRING_ARG
29272be9e038Ssthen 	{
29282be9e038Ssthen 	#ifdef USE_IPSECMOD
29292be9e038Ssthen 		OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", $2));
29302be9e038Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
29312be9e038Ssthen 			yyerror("expected yes or no.");
29322be9e038Ssthen 		else cfg_parser->cfg->ipsecmod_ignore_bogus = (strcmp($2, "yes")==0);
29332be9e038Ssthen 	#else
29342be9e038Ssthen 		OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
29352be9e038Ssthen 	#endif
2936f6b99bafSsthen 		free($2);
29372be9e038Ssthen 	}
29382be9e038Ssthen 	;
29392be9e038Ssthen server_ipsecmod_hook: VAR_IPSECMOD_HOOK STRING_ARG
29402be9e038Ssthen 	{
29412be9e038Ssthen 	#ifdef USE_IPSECMOD
29422be9e038Ssthen 		OUTYY(("P(server_ipsecmod_hook:%s)\n", $2));
29432be9e038Ssthen 		free(cfg_parser->cfg->ipsecmod_hook);
29442be9e038Ssthen 		cfg_parser->cfg->ipsecmod_hook = $2;
29452be9e038Ssthen 	#else
29462be9e038Ssthen 		OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
2947f6b99bafSsthen 		free($2);
29482be9e038Ssthen 	#endif
29492be9e038Ssthen 	}
29502be9e038Ssthen 	;
29512be9e038Ssthen server_ipsecmod_max_ttl: VAR_IPSECMOD_MAX_TTL STRING_ARG
29522be9e038Ssthen 	{
29532be9e038Ssthen 	#ifdef USE_IPSECMOD
29542be9e038Ssthen 		OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", $2));
29552be9e038Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
29562be9e038Ssthen 			yyerror("number expected");
29572be9e038Ssthen 		else cfg_parser->cfg->ipsecmod_max_ttl = atoi($2);
29582be9e038Ssthen 		free($2);
29592be9e038Ssthen 	#else
29602be9e038Ssthen 		OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
2961f6b99bafSsthen 		free($2);
29622be9e038Ssthen 	#endif
29632be9e038Ssthen 	}
29642be9e038Ssthen 	;
29652be9e038Ssthen server_ipsecmod_whitelist: VAR_IPSECMOD_WHITELIST STRING_ARG
29662be9e038Ssthen 	{
29672be9e038Ssthen 	#ifdef USE_IPSECMOD
29682be9e038Ssthen 		OUTYY(("P(server_ipsecmod_whitelist:%s)\n", $2));
29692be9e038Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->ipsecmod_whitelist, $2))
29702be9e038Ssthen 			yyerror("out of memory");
29712be9e038Ssthen 	#else
29722be9e038Ssthen 		OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
2973f6b99bafSsthen 		free($2);
29742be9e038Ssthen 	#endif
29752be9e038Ssthen 	}
29762be9e038Ssthen 	;
29772be9e038Ssthen server_ipsecmod_strict: VAR_IPSECMOD_STRICT STRING_ARG
29782be9e038Ssthen 	{
29792be9e038Ssthen 	#ifdef USE_IPSECMOD
29802be9e038Ssthen 		OUTYY(("P(server_ipsecmod_strict:%s)\n", $2));
29812be9e038Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
29822be9e038Ssthen 			yyerror("expected yes or no.");
29832be9e038Ssthen 		else cfg_parser->cfg->ipsecmod_strict = (strcmp($2, "yes")==0);
29842be9e038Ssthen 		free($2);
29852be9e038Ssthen 	#else
29862be9e038Ssthen 		OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
2987f6b99bafSsthen 		free($2);
29882be9e038Ssthen 	#endif
29892be9e038Ssthen 	}
29902be9e038Ssthen 	;
2991eba819a2Ssthen server_edns_client_string: VAR_EDNS_CLIENT_STRING STRING_ARG STRING_ARG
29922c144df0Ssthen 	{
2993eba819a2Ssthen 		OUTYY(("P(server_edns_client_string:%s %s)\n", $2, $3));
29942c144df0Ssthen 		if(!cfg_str2list_insert(
2995eba819a2Ssthen 			&cfg_parser->cfg->edns_client_strings, $2, $3))
29962c144df0Ssthen 			fatal_exit("out of memory adding "
2997eba819a2Ssthen 				"edns-client-string");
29982c144df0Ssthen 	}
29992c144df0Ssthen 	;
3000eba819a2Ssthen server_edns_client_string_opcode: VAR_EDNS_CLIENT_STRING_OPCODE STRING_ARG
30012c144df0Ssthen 	{
3002eba819a2Ssthen 		OUTYY(("P(edns_client_string_opcode:%s)\n", $2));
30032c144df0Ssthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
30042c144df0Ssthen 			yyerror("option code expected");
30052c144df0Ssthen 		else if(atoi($2) > 65535 || atoi($2) < 0)
30062c144df0Ssthen 			yyerror("option code must be in interval [0, 65535]");
3007eba819a2Ssthen 		else cfg_parser->cfg->edns_client_string_opcode = atoi($2);
3008eba819a2Ssthen 		free($2);
30090bdb4f62Ssthen 	}
30100bdb4f62Ssthen 	;
30110bdb4f62Ssthen server_ede: VAR_EDE STRING_ARG
30120bdb4f62Ssthen 	{
30130bdb4f62Ssthen 		OUTYY(("P(server_ede:%s)\n", $2));
30140bdb4f62Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
30150bdb4f62Ssthen 			yyerror("expected yes or no.");
30160bdb4f62Ssthen 		else cfg_parser->cfg->ede = (strcmp($2, "yes")==0);
30170bdb4f62Ssthen 		free($2);
30182c144df0Ssthen 	}
30192c144df0Ssthen 	;
302045872187Ssthen server_proxy_protocol_port: VAR_PROXY_PROTOCOL_PORT STRING_ARG
302145872187Ssthen 	{
302245872187Ssthen 		OUTYY(("P(server_proxy_protocol_port:%s)\n", $2));
302345872187Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->proxy_protocol_port, $2))
302445872187Ssthen 			yyerror("out of memory");
302545872187Ssthen 	}
302645872187Ssthen 	;
3027933707f3Ssthen stub_name: VAR_NAME STRING_ARG
3028933707f3Ssthen 	{
3029933707f3Ssthen 		OUTYY(("P(name:%s)\n", $2));
3030933707f3Ssthen 		if(cfg_parser->cfg->stubs->name)
3031933707f3Ssthen 			yyerror("stub name override, there must be one name "
3032933707f3Ssthen 				"for one stub-zone");
3033933707f3Ssthen 		free(cfg_parser->cfg->stubs->name);
3034933707f3Ssthen 		cfg_parser->cfg->stubs->name = $2;
3035933707f3Ssthen 	}
3036933707f3Ssthen 	;
3037933707f3Ssthen stub_host: VAR_STUB_HOST STRING_ARG
3038933707f3Ssthen 	{
3039933707f3Ssthen 		OUTYY(("P(stub-host:%s)\n", $2));
3040933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, $2))
3041933707f3Ssthen 			yyerror("out of memory");
3042933707f3Ssthen 	}
3043933707f3Ssthen 	;
3044933707f3Ssthen stub_addr: VAR_STUB_ADDR STRING_ARG
3045933707f3Ssthen 	{
3046933707f3Ssthen 		OUTYY(("P(stub-addr:%s)\n", $2));
3047933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, $2))
3048933707f3Ssthen 			yyerror("out of memory");
3049933707f3Ssthen 	}
3050933707f3Ssthen 	;
3051d8d14d0cSsthen stub_first: VAR_STUB_FIRST STRING_ARG
3052d8d14d0cSsthen 	{
3053d8d14d0cSsthen 		OUTYY(("P(stub-first:%s)\n", $2));
3054d8d14d0cSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3055d8d14d0cSsthen 			yyerror("expected yes or no.");
3056d8d14d0cSsthen 		else cfg_parser->cfg->stubs->isfirst=(strcmp($2, "yes")==0);
3057d8d14d0cSsthen 		free($2);
3058d8d14d0cSsthen 	}
3059d8d14d0cSsthen 	;
30602308e98cSsthen stub_no_cache: VAR_STUB_NO_CACHE STRING_ARG
30612308e98cSsthen 	{
30622308e98cSsthen 		OUTYY(("P(stub-no-cache:%s)\n", $2));
30632308e98cSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
30642308e98cSsthen 			yyerror("expected yes or no.");
30652308e98cSsthen 		else cfg_parser->cfg->stubs->no_cache=(strcmp($2, "yes")==0);
30662308e98cSsthen 		free($2);
30672308e98cSsthen 	}
30682308e98cSsthen 	;
306977079be7Ssthen stub_ssl_upstream: VAR_STUB_SSL_UPSTREAM STRING_ARG
307077079be7Ssthen 	{
307177079be7Ssthen 		OUTYY(("P(stub-ssl-upstream:%s)\n", $2));
307277079be7Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
307377079be7Ssthen 			yyerror("expected yes or no.");
307477079be7Ssthen 		else cfg_parser->cfg->stubs->ssl_upstream =
307577079be7Ssthen 			(strcmp($2, "yes")==0);
307677079be7Ssthen 		free($2);
307777079be7Ssthen 	}
307877079be7Ssthen 	;
3079e21c60efSsthen stub_tcp_upstream: VAR_STUB_TCP_UPSTREAM STRING_ARG
3080e21c60efSsthen         {
3081e21c60efSsthen                 OUTYY(("P(stub-tcp-upstream:%s)\n", $2));
3082e21c60efSsthen                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3083e21c60efSsthen                         yyerror("expected yes or no.");
3084e21c60efSsthen                 else cfg_parser->cfg->stubs->tcp_upstream =
3085e21c60efSsthen                         (strcmp($2, "yes")==0);
3086e21c60efSsthen                 free($2);
3087e21c60efSsthen         }
3088e21c60efSsthen         ;
3089933707f3Ssthen stub_prime: VAR_STUB_PRIME STRING_ARG
3090933707f3Ssthen 	{
3091933707f3Ssthen 		OUTYY(("P(stub-prime:%s)\n", $2));
3092933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3093933707f3Ssthen 			yyerror("expected yes or no.");
3094933707f3Ssthen 		else cfg_parser->cfg->stubs->isprime =
3095933707f3Ssthen 			(strcmp($2, "yes")==0);
3096933707f3Ssthen 		free($2);
3097933707f3Ssthen 	}
3098933707f3Ssthen 	;
3099933707f3Ssthen forward_name: VAR_NAME STRING_ARG
3100933707f3Ssthen 	{
3101933707f3Ssthen 		OUTYY(("P(name:%s)\n", $2));
3102933707f3Ssthen 		if(cfg_parser->cfg->forwards->name)
3103933707f3Ssthen 			yyerror("forward name override, there must be one "
3104933707f3Ssthen 				"name for one forward-zone");
3105933707f3Ssthen 		free(cfg_parser->cfg->forwards->name);
3106933707f3Ssthen 		cfg_parser->cfg->forwards->name = $2;
3107933707f3Ssthen 	}
3108933707f3Ssthen 	;
3109933707f3Ssthen forward_host: VAR_FORWARD_HOST STRING_ARG
3110933707f3Ssthen 	{
3111933707f3Ssthen 		OUTYY(("P(forward-host:%s)\n", $2));
3112933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, $2))
3113933707f3Ssthen 			yyerror("out of memory");
3114933707f3Ssthen 	}
3115933707f3Ssthen 	;
3116933707f3Ssthen forward_addr: VAR_FORWARD_ADDR STRING_ARG
3117933707f3Ssthen 	{
3118933707f3Ssthen 		OUTYY(("P(forward-addr:%s)\n", $2));
3119933707f3Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, $2))
3120933707f3Ssthen 			yyerror("out of memory");
3121933707f3Ssthen 	}
3122933707f3Ssthen 	;
3123d8d14d0cSsthen forward_first: VAR_FORWARD_FIRST STRING_ARG
3124d8d14d0cSsthen 	{
3125d8d14d0cSsthen 		OUTYY(("P(forward-first:%s)\n", $2));
3126d8d14d0cSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3127d8d14d0cSsthen 			yyerror("expected yes or no.");
3128d8d14d0cSsthen 		else cfg_parser->cfg->forwards->isfirst=(strcmp($2, "yes")==0);
3129d8d14d0cSsthen 		free($2);
3130d8d14d0cSsthen 	}
3131d8d14d0cSsthen 	;
31322308e98cSsthen forward_no_cache: VAR_FORWARD_NO_CACHE STRING_ARG
31332308e98cSsthen 	{
31342308e98cSsthen 		OUTYY(("P(forward-no-cache:%s)\n", $2));
31352308e98cSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
31362308e98cSsthen 			yyerror("expected yes or no.");
31372308e98cSsthen 		else cfg_parser->cfg->forwards->no_cache=(strcmp($2, "yes")==0);
31382308e98cSsthen 		free($2);
31392308e98cSsthen 	}
31402308e98cSsthen 	;
314177079be7Ssthen forward_ssl_upstream: VAR_FORWARD_SSL_UPSTREAM STRING_ARG
314277079be7Ssthen 	{
314377079be7Ssthen 		OUTYY(("P(forward-ssl-upstream:%s)\n", $2));
314477079be7Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
314577079be7Ssthen 			yyerror("expected yes or no.");
314677079be7Ssthen 		else cfg_parser->cfg->forwards->ssl_upstream =
314777079be7Ssthen 			(strcmp($2, "yes")==0);
314877079be7Ssthen 		free($2);
314977079be7Ssthen 	}
315077079be7Ssthen 	;
3151e21c60efSsthen forward_tcp_upstream: VAR_FORWARD_TCP_UPSTREAM STRING_ARG
3152e21c60efSsthen         {
3153e21c60efSsthen                 OUTYY(("P(forward-tcp-upstream:%s)\n", $2));
3154e21c60efSsthen                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3155e21c60efSsthen                         yyerror("expected yes or no.");
3156e21c60efSsthen                 else cfg_parser->cfg->forwards->tcp_upstream =
3157e21c60efSsthen                         (strcmp($2, "yes")==0);
3158e21c60efSsthen                 free($2);
3159e21c60efSsthen         }
3160e21c60efSsthen         ;
3161bdfc4d55Sflorian auth_name: VAR_NAME STRING_ARG
3162bdfc4d55Sflorian 	{
3163bdfc4d55Sflorian 		OUTYY(("P(name:%s)\n", $2));
3164bdfc4d55Sflorian 		if(cfg_parser->cfg->auths->name)
3165bdfc4d55Sflorian 			yyerror("auth name override, there must be one name "
3166bdfc4d55Sflorian 				"for one auth-zone");
3167bdfc4d55Sflorian 		free(cfg_parser->cfg->auths->name);
3168bdfc4d55Sflorian 		cfg_parser->cfg->auths->name = $2;
3169bdfc4d55Sflorian 	}
3170bdfc4d55Sflorian 	;
3171bdfc4d55Sflorian auth_zonefile: VAR_ZONEFILE STRING_ARG
3172bdfc4d55Sflorian 	{
3173bdfc4d55Sflorian 		OUTYY(("P(zonefile:%s)\n", $2));
3174bdfc4d55Sflorian 		free(cfg_parser->cfg->auths->zonefile);
3175bdfc4d55Sflorian 		cfg_parser->cfg->auths->zonefile = $2;
3176bdfc4d55Sflorian 	}
3177bdfc4d55Sflorian 	;
3178bdfc4d55Sflorian auth_master: VAR_MASTER STRING_ARG
3179bdfc4d55Sflorian 	{
3180bdfc4d55Sflorian 		OUTYY(("P(master:%s)\n", $2));
3181bdfc4d55Sflorian 		if(!cfg_strlist_insert(&cfg_parser->cfg->auths->masters, $2))
3182bdfc4d55Sflorian 			yyerror("out of memory");
3183bdfc4d55Sflorian 	}
3184bdfc4d55Sflorian 	;
3185bdfc4d55Sflorian auth_url: VAR_URL STRING_ARG
3186bdfc4d55Sflorian 	{
3187bdfc4d55Sflorian 		OUTYY(("P(url:%s)\n", $2));
3188bdfc4d55Sflorian 		if(!cfg_strlist_insert(&cfg_parser->cfg->auths->urls, $2))
3189bdfc4d55Sflorian 			yyerror("out of memory");
3190bdfc4d55Sflorian 	}
3191bdfc4d55Sflorian 	;
319220237c55Ssthen auth_allow_notify: VAR_ALLOW_NOTIFY STRING_ARG
319320237c55Ssthen 	{
319420237c55Ssthen 		OUTYY(("P(allow-notify:%s)\n", $2));
319520237c55Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->auths->allow_notify,
319620237c55Ssthen 			$2))
319720237c55Ssthen 			yyerror("out of memory");
319820237c55Ssthen 	}
319920237c55Ssthen 	;
3200191f22c6Ssthen auth_zonemd_check: VAR_ZONEMD_CHECK STRING_ARG
3201191f22c6Ssthen 	{
3202191f22c6Ssthen 		OUTYY(("P(zonemd-check:%s)\n", $2));
3203191f22c6Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3204191f22c6Ssthen 			yyerror("expected yes or no.");
3205191f22c6Ssthen 		else cfg_parser->cfg->auths->zonemd_check =
3206191f22c6Ssthen 			(strcmp($2, "yes")==0);
3207191f22c6Ssthen 		free($2);
3208191f22c6Ssthen 	}
3209191f22c6Ssthen 	;
3210191f22c6Ssthen auth_zonemd_reject_absence: VAR_ZONEMD_REJECT_ABSENCE STRING_ARG
3211191f22c6Ssthen 	{
3212191f22c6Ssthen 		OUTYY(("P(zonemd-reject-absence:%s)\n", $2));
3213191f22c6Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3214191f22c6Ssthen 			yyerror("expected yes or no.");
3215191f22c6Ssthen 		else cfg_parser->cfg->auths->zonemd_reject_absence =
3216191f22c6Ssthen 			(strcmp($2, "yes")==0);
3217191f22c6Ssthen 		free($2);
3218191f22c6Ssthen 	}
3219191f22c6Ssthen 	;
3220bdfc4d55Sflorian auth_for_downstream: VAR_FOR_DOWNSTREAM STRING_ARG
3221bdfc4d55Sflorian 	{
3222bdfc4d55Sflorian 		OUTYY(("P(for-downstream:%s)\n", $2));
3223bdfc4d55Sflorian 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3224bdfc4d55Sflorian 			yyerror("expected yes or no.");
3225bdfc4d55Sflorian 		else cfg_parser->cfg->auths->for_downstream =
3226bdfc4d55Sflorian 			(strcmp($2, "yes")==0);
3227bdfc4d55Sflorian 		free($2);
3228bdfc4d55Sflorian 	}
3229bdfc4d55Sflorian 	;
3230bdfc4d55Sflorian auth_for_upstream: VAR_FOR_UPSTREAM STRING_ARG
3231bdfc4d55Sflorian 	{
3232bdfc4d55Sflorian 		OUTYY(("P(for-upstream:%s)\n", $2));
3233bdfc4d55Sflorian 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3234bdfc4d55Sflorian 			yyerror("expected yes or no.");
3235bdfc4d55Sflorian 		else cfg_parser->cfg->auths->for_upstream =
3236bdfc4d55Sflorian 			(strcmp($2, "yes")==0);
3237bdfc4d55Sflorian 		free($2);
3238bdfc4d55Sflorian 	}
3239bdfc4d55Sflorian 	;
3240938a3a5eSflorian auth_fallback_enabled: VAR_FALLBACK_ENABLED STRING_ARG
3241938a3a5eSflorian 	{
3242938a3a5eSflorian 		OUTYY(("P(fallback-enabled:%s)\n", $2));
3243938a3a5eSflorian 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3244938a3a5eSflorian 			yyerror("expected yes or no.");
3245938a3a5eSflorian 		else cfg_parser->cfg->auths->fallback_enabled =
3246938a3a5eSflorian 			(strcmp($2, "yes")==0);
3247938a3a5eSflorian 		free($2);
3248938a3a5eSflorian 	}
3249938a3a5eSflorian 	;
325077079be7Ssthen view_name: VAR_NAME STRING_ARG
325177079be7Ssthen 	{
325277079be7Ssthen 		OUTYY(("P(name:%s)\n", $2));
325377079be7Ssthen 		if(cfg_parser->cfg->views->name)
325477079be7Ssthen 			yyerror("view name override, there must be one "
325577079be7Ssthen 				"name for one view");
325677079be7Ssthen 		free(cfg_parser->cfg->views->name);
325777079be7Ssthen 		cfg_parser->cfg->views->name = $2;
325877079be7Ssthen 	}
325977079be7Ssthen 	;
326077079be7Ssthen view_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
326177079be7Ssthen 	{
326277079be7Ssthen 		OUTYY(("P(view_local_zone:%s %s)\n", $2, $3));
326377079be7Ssthen 		if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 &&
326477079be7Ssthen 		   strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 &&
326577079be7Ssthen 		   strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0
326677079be7Ssthen 		   && strcmp($3, "typetransparent")!=0
326777079be7Ssthen 		   && strcmp($3, "always_transparent")!=0
326877079be7Ssthen 		   && strcmp($3, "always_refuse")!=0
326977079be7Ssthen 		   && strcmp($3, "always_nxdomain")!=0
3270191f22c6Ssthen 		   && strcmp($3, "always_nodata")!=0
3271191f22c6Ssthen 		   && strcmp($3, "always_deny")!=0
3272191f22c6Ssthen 		   && strcmp($3, "always_null")!=0
3273938a3a5eSflorian 		   && strcmp($3, "noview")!=0
3274191f22c6Ssthen 		   && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0
3275191f22c6Ssthen 		   && strcmp($3, "inform_redirect") != 0
3276191f22c6Ssthen 		   && strcmp($3, "ipset") != 0) {
327777079be7Ssthen 			yyerror("local-zone type: expected static, deny, "
327877079be7Ssthen 				"refuse, redirect, transparent, "
327977079be7Ssthen 				"typetransparent, inform, inform_deny, "
3280191f22c6Ssthen 				"inform_redirect, always_transparent, "
3281191f22c6Ssthen 				"always_refuse, always_nxdomain, "
3282191f22c6Ssthen 				"always_nodata, always_deny, always_null, "
3283191f22c6Ssthen 				"noview, nodefault or ipset");
3284f6b99bafSsthen 			free($2);
3285f6b99bafSsthen 			free($3);
3286f6b99bafSsthen 		} else if(strcmp($3, "nodefault")==0) {
328777079be7Ssthen 			if(!cfg_strlist_insert(&cfg_parser->cfg->views->
328877079be7Ssthen 				local_zones_nodefault, $2))
328977079be7Ssthen 				fatal_exit("out of memory adding local-zone");
329077079be7Ssthen 			free($3);
32918240c1b9Ssthen #ifdef USE_IPSET
32928240c1b9Ssthen 		} else if(strcmp($3, "ipset")==0) {
32930bdb4f62Ssthen 			size_t len = strlen($2);
32940bdb4f62Ssthen 			/* Make sure to add the trailing dot.
32950bdb4f62Ssthen 			 * These are str compared to domain names. */
32960bdb4f62Ssthen 			if($2[len-1] != '.') {
32970bdb4f62Ssthen 				if(!($2 = realloc($2, len+2))) {
32980bdb4f62Ssthen 					fatal_exit("out of memory adding local-zone");
32990bdb4f62Ssthen 				}
33000bdb4f62Ssthen 				$2[len] = '.';
33010bdb4f62Ssthen 				$2[len+1] = 0;
33020bdb4f62Ssthen 			}
33038240c1b9Ssthen 			if(!cfg_strlist_insert(&cfg_parser->cfg->views->
33048240c1b9Ssthen 				local_zones_ipset, $2))
33058240c1b9Ssthen 				fatal_exit("out of memory adding local-zone");
33068240c1b9Ssthen 			free($3);
33078240c1b9Ssthen #endif
330877079be7Ssthen 		} else {
330977079be7Ssthen 			if(!cfg_str2list_insert(
331077079be7Ssthen 				&cfg_parser->cfg->views->local_zones,
331177079be7Ssthen 				$2, $3))
331277079be7Ssthen 				fatal_exit("out of memory adding local-zone");
331377079be7Ssthen 		}
331477079be7Ssthen 	}
331577079be7Ssthen 	;
33162be9e038Ssthen view_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG
33172be9e038Ssthen 	{
33182be9e038Ssthen 		OUTYY(("P(view_response_ip:%s %s)\n", $2, $3));
33192be9e038Ssthen 		validate_respip_action($3);
33202be9e038Ssthen 		if(!cfg_str2list_insert(
33212be9e038Ssthen 			&cfg_parser->cfg->views->respip_actions, $2, $3))
33222be9e038Ssthen 			fatal_exit("out of memory adding per-view "
33232be9e038Ssthen 				"response-ip action");
33242be9e038Ssthen 	}
33252be9e038Ssthen 	;
33262be9e038Ssthen view_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG
33272be9e038Ssthen 	{
33282be9e038Ssthen 		OUTYY(("P(view_response_ip_data:%s)\n", $2));
33292be9e038Ssthen 		if(!cfg_str2list_insert(
33302be9e038Ssthen 			&cfg_parser->cfg->views->respip_data, $2, $3))
33312be9e038Ssthen 			fatal_exit("out of memory adding response-ip-data");
33322be9e038Ssthen 	}
33332be9e038Ssthen 	;
333477079be7Ssthen view_local_data: VAR_LOCAL_DATA STRING_ARG
333577079be7Ssthen 	{
333677079be7Ssthen 		OUTYY(("P(view_local_data:%s)\n", $2));
333777079be7Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, $2)) {
333877079be7Ssthen 			fatal_exit("out of memory adding local-data");
333977079be7Ssthen 		}
334077079be7Ssthen 	}
334177079be7Ssthen 	;
33422be9e038Ssthen view_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG
33432be9e038Ssthen 	{
33442be9e038Ssthen 		char* ptr;
33452be9e038Ssthen 		OUTYY(("P(view_local_data_ptr:%s)\n", $2));
33462be9e038Ssthen 		ptr = cfg_ptr_reverse($2);
33472be9e038Ssthen 		free($2);
33482be9e038Ssthen 		if(ptr) {
33492be9e038Ssthen 			if(!cfg_strlist_insert(&cfg_parser->cfg->views->
33502be9e038Ssthen 				local_data, ptr))
33512be9e038Ssthen 				fatal_exit("out of memory adding local-data");
33522be9e038Ssthen 		} else {
33532be9e038Ssthen 			yyerror("local-data-ptr could not be reversed");
33542be9e038Ssthen 		}
33552be9e038Ssthen 	}
33562be9e038Ssthen 	;
335777079be7Ssthen view_first: VAR_VIEW_FIRST STRING_ARG
335877079be7Ssthen 	{
335977079be7Ssthen 		OUTYY(("P(view-first:%s)\n", $2));
336077079be7Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
336177079be7Ssthen 			yyerror("expected yes or no.");
336277079be7Ssthen 		else cfg_parser->cfg->views->isfirst=(strcmp($2, "yes")==0);
336377079be7Ssthen 		free($2);
336477079be7Ssthen 	}
336577079be7Ssthen 	;
3366933707f3Ssthen rcstart: VAR_REMOTE_CONTROL
3367933707f3Ssthen 	{
3368933707f3Ssthen 		OUTYY(("\nP(remote-control:)\n"));
336945872187Ssthen 		cfg_parser->started_toplevel = 1;
3370933707f3Ssthen 	}
3371933707f3Ssthen 	;
3372933707f3Ssthen contents_rc: contents_rc content_rc
3373933707f3Ssthen 	| ;
3374933707f3Ssthen content_rc: rc_control_enable | rc_control_interface | rc_control_port |
3375933707f3Ssthen 	rc_server_key_file | rc_server_cert_file | rc_control_key_file |
3376b2cdf21fSsthen 	rc_control_cert_file | rc_control_use_cert
3377933707f3Ssthen 	;
3378933707f3Ssthen rc_control_enable: VAR_CONTROL_ENABLE STRING_ARG
3379933707f3Ssthen 	{
3380933707f3Ssthen 		OUTYY(("P(control_enable:%s)\n", $2));
3381933707f3Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3382933707f3Ssthen 			yyerror("expected yes or no.");
3383933707f3Ssthen 		else cfg_parser->cfg->remote_control_enable =
3384933707f3Ssthen 			(strcmp($2, "yes")==0);
3385933707f3Ssthen 		free($2);
3386933707f3Ssthen 	}
3387933707f3Ssthen 	;
3388933707f3Ssthen rc_control_port: VAR_CONTROL_PORT STRING_ARG
3389933707f3Ssthen 	{
3390933707f3Ssthen 		OUTYY(("P(control_port:%s)\n", $2));
3391933707f3Ssthen 		if(atoi($2) == 0)
3392933707f3Ssthen 			yyerror("control port number expected");
3393933707f3Ssthen 		else cfg_parser->cfg->control_port = atoi($2);
3394933707f3Ssthen 		free($2);
3395933707f3Ssthen 	}
3396933707f3Ssthen 	;
3397933707f3Ssthen rc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG
3398933707f3Ssthen 	{
3399933707f3Ssthen 		OUTYY(("P(control_interface:%s)\n", $2));
340020237c55Ssthen 		if(!cfg_strlist_append(&cfg_parser->cfg->control_ifs, $2))
3401933707f3Ssthen 			yyerror("out of memory");
3402933707f3Ssthen 	}
3403933707f3Ssthen 	;
3404b2cdf21fSsthen rc_control_use_cert: VAR_CONTROL_USE_CERT STRING_ARG
3405b2cdf21fSsthen 	{
3406b2cdf21fSsthen 		OUTYY(("P(control_use_cert:%s)\n", $2));
340720237c55Ssthen 		cfg_parser->cfg->control_use_cert = (strcmp($2, "yes")==0);
3408b2cdf21fSsthen 		free($2);
3409b2cdf21fSsthen 	}
3410b2cdf21fSsthen 	;
3411933707f3Ssthen rc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG
3412933707f3Ssthen 	{
3413933707f3Ssthen 		OUTYY(("P(rc_server_key_file:%s)\n", $2));
3414933707f3Ssthen 		free(cfg_parser->cfg->server_key_file);
3415933707f3Ssthen 		cfg_parser->cfg->server_key_file = $2;
3416933707f3Ssthen 	}
3417933707f3Ssthen 	;
3418933707f3Ssthen rc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG
3419933707f3Ssthen 	{
3420933707f3Ssthen 		OUTYY(("P(rc_server_cert_file:%s)\n", $2));
3421933707f3Ssthen 		free(cfg_parser->cfg->server_cert_file);
3422933707f3Ssthen 		cfg_parser->cfg->server_cert_file = $2;
3423933707f3Ssthen 	}
3424933707f3Ssthen 	;
3425933707f3Ssthen rc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG
3426933707f3Ssthen 	{
3427933707f3Ssthen 		OUTYY(("P(rc_control_key_file:%s)\n", $2));
3428933707f3Ssthen 		free(cfg_parser->cfg->control_key_file);
3429933707f3Ssthen 		cfg_parser->cfg->control_key_file = $2;
3430933707f3Ssthen 	}
3431933707f3Ssthen 	;
3432933707f3Ssthen rc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG
3433933707f3Ssthen 	{
3434933707f3Ssthen 		OUTYY(("P(rc_control_cert_file:%s)\n", $2));
3435933707f3Ssthen 		free(cfg_parser->cfg->control_cert_file);
3436933707f3Ssthen 		cfg_parser->cfg->control_cert_file = $2;
3437933707f3Ssthen 	}
3438933707f3Ssthen 	;
343998f3ca02Sbrad dtstart: VAR_DNSTAP
344098f3ca02Sbrad 	{
344198f3ca02Sbrad 		OUTYY(("\nP(dnstap:)\n"));
344245872187Ssthen 		cfg_parser->started_toplevel = 1;
344398f3ca02Sbrad 	}
344498f3ca02Sbrad 	;
344598f3ca02Sbrad contents_dt: contents_dt content_dt
344698f3ca02Sbrad 	| ;
3447a3167c07Ssthen content_dt: dt_dnstap_enable | dt_dnstap_socket_path | dt_dnstap_bidirectional |
3448a3167c07Ssthen 	dt_dnstap_ip | dt_dnstap_tls | dt_dnstap_tls_server_name |
3449a3167c07Ssthen 	dt_dnstap_tls_cert_bundle |
3450a3167c07Ssthen 	dt_dnstap_tls_client_key_file | dt_dnstap_tls_client_cert_file |
345198f3ca02Sbrad 	dt_dnstap_send_identity | dt_dnstap_send_version |
345298f3ca02Sbrad 	dt_dnstap_identity | dt_dnstap_version |
345398f3ca02Sbrad 	dt_dnstap_log_resolver_query_messages |
345498f3ca02Sbrad 	dt_dnstap_log_resolver_response_messages |
345598f3ca02Sbrad 	dt_dnstap_log_client_query_messages |
345698f3ca02Sbrad 	dt_dnstap_log_client_response_messages |
345798f3ca02Sbrad 	dt_dnstap_log_forwarder_query_messages |
3458*98bc733bSsthen 	dt_dnstap_log_forwarder_response_messages |
3459*98bc733bSsthen 	dt_dnstap_sample_rate
346098f3ca02Sbrad 	;
346198f3ca02Sbrad dt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG
346298f3ca02Sbrad 	{
346398f3ca02Sbrad 		OUTYY(("P(dt_dnstap_enable:%s)\n", $2));
346498f3ca02Sbrad 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
346598f3ca02Sbrad 			yyerror("expected yes or no.");
346698f3ca02Sbrad 		else cfg_parser->cfg->dnstap = (strcmp($2, "yes")==0);
3467f6b99bafSsthen 		free($2);
346898f3ca02Sbrad 	}
346998f3ca02Sbrad 	;
3470a3167c07Ssthen dt_dnstap_bidirectional: VAR_DNSTAP_BIDIRECTIONAL STRING_ARG
3471a3167c07Ssthen 	{
3472a3167c07Ssthen 		OUTYY(("P(dt_dnstap_bidirectional:%s)\n", $2));
3473a3167c07Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3474a3167c07Ssthen 			yyerror("expected yes or no.");
3475a3167c07Ssthen 		else cfg_parser->cfg->dnstap_bidirectional =
3476a3167c07Ssthen 			(strcmp($2, "yes")==0);
3477a3167c07Ssthen 		free($2);
3478a3167c07Ssthen 	}
3479a3167c07Ssthen 	;
348098f3ca02Sbrad dt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG
348198f3ca02Sbrad 	{
348298f3ca02Sbrad 		OUTYY(("P(dt_dnstap_socket_path:%s)\n", $2));
348398f3ca02Sbrad 		free(cfg_parser->cfg->dnstap_socket_path);
348498f3ca02Sbrad 		cfg_parser->cfg->dnstap_socket_path = $2;
348598f3ca02Sbrad 	}
348698f3ca02Sbrad 	;
3487a3167c07Ssthen dt_dnstap_ip: VAR_DNSTAP_IP STRING_ARG
3488a3167c07Ssthen 	{
3489a3167c07Ssthen 		OUTYY(("P(dt_dnstap_ip:%s)\n", $2));
3490a3167c07Ssthen 		free(cfg_parser->cfg->dnstap_ip);
3491a3167c07Ssthen 		cfg_parser->cfg->dnstap_ip = $2;
3492a3167c07Ssthen 	}
3493a3167c07Ssthen 	;
3494a3167c07Ssthen dt_dnstap_tls: VAR_DNSTAP_TLS STRING_ARG
3495a3167c07Ssthen 	{
3496a3167c07Ssthen 		OUTYY(("P(dt_dnstap_tls:%s)\n", $2));
3497a3167c07Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3498a3167c07Ssthen 			yyerror("expected yes or no.");
3499a3167c07Ssthen 		else cfg_parser->cfg->dnstap_tls = (strcmp($2, "yes")==0);
3500a3167c07Ssthen 		free($2);
3501a3167c07Ssthen 	}
3502a3167c07Ssthen 	;
3503a3167c07Ssthen dt_dnstap_tls_server_name: VAR_DNSTAP_TLS_SERVER_NAME STRING_ARG
3504a3167c07Ssthen 	{
3505a3167c07Ssthen 		OUTYY(("P(dt_dnstap_tls_server_name:%s)\n", $2));
3506a3167c07Ssthen 		free(cfg_parser->cfg->dnstap_tls_server_name);
3507a3167c07Ssthen 		cfg_parser->cfg->dnstap_tls_server_name = $2;
3508a3167c07Ssthen 	}
3509a3167c07Ssthen 	;
3510a3167c07Ssthen dt_dnstap_tls_cert_bundle: VAR_DNSTAP_TLS_CERT_BUNDLE STRING_ARG
3511a3167c07Ssthen 	{
3512a3167c07Ssthen 		OUTYY(("P(dt_dnstap_tls_cert_bundle:%s)\n", $2));
3513a3167c07Ssthen 		free(cfg_parser->cfg->dnstap_tls_cert_bundle);
3514a3167c07Ssthen 		cfg_parser->cfg->dnstap_tls_cert_bundle = $2;
3515a3167c07Ssthen 	}
3516a3167c07Ssthen 	;
3517a3167c07Ssthen dt_dnstap_tls_client_key_file: VAR_DNSTAP_TLS_CLIENT_KEY_FILE STRING_ARG
3518a3167c07Ssthen 	{
3519a3167c07Ssthen 		OUTYY(("P(dt_dnstap_tls_client_key_file:%s)\n", $2));
3520a3167c07Ssthen 		free(cfg_parser->cfg->dnstap_tls_client_key_file);
3521a3167c07Ssthen 		cfg_parser->cfg->dnstap_tls_client_key_file = $2;
3522a3167c07Ssthen 	}
3523a3167c07Ssthen 	;
3524a3167c07Ssthen dt_dnstap_tls_client_cert_file: VAR_DNSTAP_TLS_CLIENT_CERT_FILE STRING_ARG
3525a3167c07Ssthen 	{
3526a3167c07Ssthen 		OUTYY(("P(dt_dnstap_tls_client_cert_file:%s)\n", $2));
3527a3167c07Ssthen 		free(cfg_parser->cfg->dnstap_tls_client_cert_file);
3528a3167c07Ssthen 		cfg_parser->cfg->dnstap_tls_client_cert_file = $2;
3529a3167c07Ssthen 	}
3530a3167c07Ssthen 	;
353198f3ca02Sbrad dt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG
353298f3ca02Sbrad 	{
353398f3ca02Sbrad 		OUTYY(("P(dt_dnstap_send_identity:%s)\n", $2));
353498f3ca02Sbrad 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
353598f3ca02Sbrad 			yyerror("expected yes or no.");
353698f3ca02Sbrad 		else cfg_parser->cfg->dnstap_send_identity = (strcmp($2, "yes")==0);
3537f6b99bafSsthen 		free($2);
353898f3ca02Sbrad 	}
353998f3ca02Sbrad 	;
354098f3ca02Sbrad dt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG
354198f3ca02Sbrad 	{
354298f3ca02Sbrad 		OUTYY(("P(dt_dnstap_send_version:%s)\n", $2));
354398f3ca02Sbrad 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
354498f3ca02Sbrad 			yyerror("expected yes or no.");
354598f3ca02Sbrad 		else cfg_parser->cfg->dnstap_send_version = (strcmp($2, "yes")==0);
3546f6b99bafSsthen 		free($2);
354798f3ca02Sbrad 	}
354898f3ca02Sbrad 	;
354998f3ca02Sbrad dt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG
355098f3ca02Sbrad 	{
355198f3ca02Sbrad 		OUTYY(("P(dt_dnstap_identity:%s)\n", $2));
355298f3ca02Sbrad 		free(cfg_parser->cfg->dnstap_identity);
355398f3ca02Sbrad 		cfg_parser->cfg->dnstap_identity = $2;
355498f3ca02Sbrad 	}
355598f3ca02Sbrad 	;
355698f3ca02Sbrad dt_dnstap_version: VAR_DNSTAP_VERSION STRING_ARG
355798f3ca02Sbrad 	{
355898f3ca02Sbrad 		OUTYY(("P(dt_dnstap_version:%s)\n", $2));
355998f3ca02Sbrad 		free(cfg_parser->cfg->dnstap_version);
356098f3ca02Sbrad 		cfg_parser->cfg->dnstap_version = $2;
356198f3ca02Sbrad 	}
356298f3ca02Sbrad 	;
356398f3ca02Sbrad dt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES STRING_ARG
356498f3ca02Sbrad 	{
356598f3ca02Sbrad 		OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", $2));
356698f3ca02Sbrad 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
356798f3ca02Sbrad 			yyerror("expected yes or no.");
356898f3ca02Sbrad 		else cfg_parser->cfg->dnstap_log_resolver_query_messages =
356998f3ca02Sbrad 			(strcmp($2, "yes")==0);
3570f6b99bafSsthen 		free($2);
357198f3ca02Sbrad 	}
357298f3ca02Sbrad 	;
357398f3ca02Sbrad dt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG
357498f3ca02Sbrad 	{
357598f3ca02Sbrad 		OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", $2));
357698f3ca02Sbrad 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
357798f3ca02Sbrad 			yyerror("expected yes or no.");
357898f3ca02Sbrad 		else cfg_parser->cfg->dnstap_log_resolver_response_messages =
357998f3ca02Sbrad 			(strcmp($2, "yes")==0);
3580f6b99bafSsthen 		free($2);
358198f3ca02Sbrad 	}
358298f3ca02Sbrad 	;
358398f3ca02Sbrad dt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG
358498f3ca02Sbrad 	{
358598f3ca02Sbrad 		OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", $2));
358698f3ca02Sbrad 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
358798f3ca02Sbrad 			yyerror("expected yes or no.");
358898f3ca02Sbrad 		else cfg_parser->cfg->dnstap_log_client_query_messages =
358998f3ca02Sbrad 			(strcmp($2, "yes")==0);
3590f6b99bafSsthen 		free($2);
359198f3ca02Sbrad 	}
359298f3ca02Sbrad 	;
359398f3ca02Sbrad dt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG
359498f3ca02Sbrad 	{
359598f3ca02Sbrad 		OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", $2));
359698f3ca02Sbrad 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
359798f3ca02Sbrad 			yyerror("expected yes or no.");
359898f3ca02Sbrad 		else cfg_parser->cfg->dnstap_log_client_response_messages =
359998f3ca02Sbrad 			(strcmp($2, "yes")==0);
3600f6b99bafSsthen 		free($2);
360198f3ca02Sbrad 	}
360298f3ca02Sbrad 	;
360398f3ca02Sbrad dt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG
360498f3ca02Sbrad 	{
360598f3ca02Sbrad 		OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", $2));
360698f3ca02Sbrad 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
360798f3ca02Sbrad 			yyerror("expected yes or no.");
360898f3ca02Sbrad 		else cfg_parser->cfg->dnstap_log_forwarder_query_messages =
360998f3ca02Sbrad 			(strcmp($2, "yes")==0);
3610f6b99bafSsthen 		free($2);
361198f3ca02Sbrad 	}
361298f3ca02Sbrad 	;
361398f3ca02Sbrad dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG
361498f3ca02Sbrad 	{
361598f3ca02Sbrad 		OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", $2));
361698f3ca02Sbrad 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
361798f3ca02Sbrad 			yyerror("expected yes or no.");
361898f3ca02Sbrad 		else cfg_parser->cfg->dnstap_log_forwarder_response_messages =
361998f3ca02Sbrad 			(strcmp($2, "yes")==0);
3620f6b99bafSsthen 		free($2);
362198f3ca02Sbrad 	}
362298f3ca02Sbrad 	;
3623*98bc733bSsthen dt_dnstap_sample_rate: VAR_DNSTAP_SAMPLE_RATE STRING_ARG
3624*98bc733bSsthen 	{
3625*98bc733bSsthen 		OUTYY(("P(dt_dnstap_sample_rate:%s)\n", $2));
3626*98bc733bSsthen 		if(atoi($2) == 0 && strcmp($2, "0") != 0)
3627*98bc733bSsthen 			yyerror("number expected");
3628*98bc733bSsthen 		else if(atoi($2) < 0)
3629*98bc733bSsthen 			yyerror("dnstap sample rate too small");
3630*98bc733bSsthen 		else	cfg_parser->cfg->dnstap_sample_rate = atoi($2);
3631*98bc733bSsthen 		free($2);
3632*98bc733bSsthen 	}
3633*98bc733bSsthen 	;
3634933707f3Ssthen pythonstart: VAR_PYTHON
3635933707f3Ssthen 	{
3636933707f3Ssthen 		OUTYY(("\nP(python:)\n"));
363745872187Ssthen 		cfg_parser->started_toplevel = 1;
3638933707f3Ssthen 	}
3639933707f3Ssthen 	;
3640933707f3Ssthen contents_py: contents_py content_py
3641933707f3Ssthen 	| ;
3642933707f3Ssthen content_py: py_script
3643933707f3Ssthen 	;
3644933707f3Ssthen py_script: VAR_PYTHON_SCRIPT STRING_ARG
3645933707f3Ssthen 	{
3646933707f3Ssthen 		OUTYY(("P(python-script:%s)\n", $2));
36478240c1b9Ssthen 		if(!cfg_strlist_append_ex(&cfg_parser->cfg->python_script, $2))
36488240c1b9Ssthen 			yyerror("out of memory");
3649933707f3Ssthen 	}
36508b7325afSsthen 	;
3651a3167c07Ssthen dynlibstart: VAR_DYNLIB
3652a3167c07Ssthen 	{
3653a3167c07Ssthen 		OUTYY(("\nP(dynlib:)\n"));
365445872187Ssthen 		cfg_parser->started_toplevel = 1;
3655a3167c07Ssthen 	}
3656a3167c07Ssthen 	;
3657a3167c07Ssthen contents_dl: contents_dl content_dl
3658a3167c07Ssthen 	| ;
3659a3167c07Ssthen content_dl: dl_file
3660a3167c07Ssthen 	;
3661a3167c07Ssthen dl_file: VAR_DYNLIB_FILE STRING_ARG
3662a3167c07Ssthen 	{
3663a3167c07Ssthen 		OUTYY(("P(dynlib-file:%s)\n", $2));
3664a3167c07Ssthen 		if(!cfg_strlist_append_ex(&cfg_parser->cfg->dynlib_file, $2))
3665a3167c07Ssthen 			yyerror("out of memory");
3666a3167c07Ssthen 	}
36678b7325afSsthen 	;
36682ee382b6Ssthen server_disable_dnssec_lame_check: VAR_DISABLE_DNSSEC_LAME_CHECK STRING_ARG
36692ee382b6Ssthen 	{
36702ee382b6Ssthen 		OUTYY(("P(disable_dnssec_lame_check:%s)\n", $2));
36712ee382b6Ssthen 		if (strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
36722ee382b6Ssthen 			yyerror("expected yes or no.");
36732ee382b6Ssthen 		else cfg_parser->cfg->disable_dnssec_lame_check =
36742ee382b6Ssthen 			(strcmp($2, "yes")==0);
36752ee382b6Ssthen 		free($2);
36762ee382b6Ssthen 	}
367777079be7Ssthen 	;
367877079be7Ssthen server_log_identity: VAR_LOG_IDENTITY STRING_ARG
367977079be7Ssthen 	{
368077079be7Ssthen 		OUTYY(("P(server_log_identity:%s)\n", $2));
368177079be7Ssthen 		free(cfg_parser->cfg->log_identity);
368277079be7Ssthen 		cfg_parser->cfg->log_identity = $2;
368377079be7Ssthen 	}
368477079be7Ssthen 	;
36852be9e038Ssthen server_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG
36862be9e038Ssthen 	{
36872be9e038Ssthen 		OUTYY(("P(server_response_ip:%s %s)\n", $2, $3));
36882be9e038Ssthen 		validate_respip_action($3);
36892be9e038Ssthen 		if(!cfg_str2list_insert(&cfg_parser->cfg->respip_actions,
36902be9e038Ssthen 			$2, $3))
36912be9e038Ssthen 			fatal_exit("out of memory adding response-ip");
36922be9e038Ssthen 	}
36932be9e038Ssthen 	;
36942be9e038Ssthen server_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG
36952be9e038Ssthen 	{
36962be9e038Ssthen 		OUTYY(("P(server_response_ip_data:%s)\n", $2));
36972be9e038Ssthen 		if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data,
36982be9e038Ssthen 			$2, $3))
36992be9e038Ssthen 			fatal_exit("out of memory adding response-ip-data");
37002be9e038Ssthen 	}
37012be9e038Ssthen 	;
37022be9e038Ssthen dnscstart: VAR_DNSCRYPT
37032be9e038Ssthen 	{
37042be9e038Ssthen 		OUTYY(("\nP(dnscrypt:)\n"));
370545872187Ssthen 		cfg_parser->started_toplevel = 1;
37062be9e038Ssthen 	}
37072be9e038Ssthen 	;
37082be9e038Ssthen contents_dnsc: contents_dnsc content_dnsc
37092be9e038Ssthen 	| ;
37102be9e038Ssthen content_dnsc:
37112be9e038Ssthen 	dnsc_dnscrypt_enable | dnsc_dnscrypt_port | dnsc_dnscrypt_provider |
37127191de28Ssthen 	dnsc_dnscrypt_secret_key | dnsc_dnscrypt_provider_cert |
3713bdfc4d55Sflorian 	dnsc_dnscrypt_provider_cert_rotated |
37147191de28Ssthen 	dnsc_dnscrypt_shared_secret_cache_size |
3715bdfc4d55Sflorian 	dnsc_dnscrypt_shared_secret_cache_slabs |
3716bdfc4d55Sflorian 	dnsc_dnscrypt_nonce_cache_size |
3717bdfc4d55Sflorian 	dnsc_dnscrypt_nonce_cache_slabs
37182be9e038Ssthen 	;
37192be9e038Ssthen dnsc_dnscrypt_enable: VAR_DNSCRYPT_ENABLE STRING_ARG
37202be9e038Ssthen 	{
37212be9e038Ssthen 		OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", $2));
37222be9e038Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
37232be9e038Ssthen 			yyerror("expected yes or no.");
37242be9e038Ssthen 		else cfg_parser->cfg->dnscrypt = (strcmp($2, "yes")==0);
37252be9e038Ssthen 		free($2);
37262be9e038Ssthen 	}
37272be9e038Ssthen 	;
37282be9e038Ssthen dnsc_dnscrypt_port: VAR_DNSCRYPT_PORT STRING_ARG
37292be9e038Ssthen 	{
37302be9e038Ssthen 		OUTYY(("P(dnsc_dnscrypt_port:%s)\n", $2));
37312be9e038Ssthen 		if(atoi($2) == 0)
37322be9e038Ssthen 			yyerror("port number expected");
37332be9e038Ssthen 		else cfg_parser->cfg->dnscrypt_port = atoi($2);
37342be9e038Ssthen 		free($2);
37352be9e038Ssthen 	}
37362be9e038Ssthen 	;
37372be9e038Ssthen dnsc_dnscrypt_provider: VAR_DNSCRYPT_PROVIDER STRING_ARG
37382be9e038Ssthen 	{
37392be9e038Ssthen 		OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", $2));
37402be9e038Ssthen 		free(cfg_parser->cfg->dnscrypt_provider);
37412be9e038Ssthen 		cfg_parser->cfg->dnscrypt_provider = $2;
37422be9e038Ssthen 	}
37432be9e038Ssthen 	;
37442be9e038Ssthen dnsc_dnscrypt_provider_cert: VAR_DNSCRYPT_PROVIDER_CERT STRING_ARG
37452be9e038Ssthen 	{
37462be9e038Ssthen 		OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", $2));
3747bdfc4d55Sflorian 		if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_provider_cert, $2))
3748bdfc4d55Sflorian 			log_warn("dnscrypt-provider-cert %s is a duplicate", $2);
37492be9e038Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert, $2))
37502be9e038Ssthen 			fatal_exit("out of memory adding dnscrypt-provider-cert");
37512be9e038Ssthen 	}
37522be9e038Ssthen 	;
3753bdfc4d55Sflorian dnsc_dnscrypt_provider_cert_rotated: VAR_DNSCRYPT_PROVIDER_CERT_ROTATED STRING_ARG
3754bdfc4d55Sflorian 	{
3755bdfc4d55Sflorian 		OUTYY(("P(dnsc_dnscrypt_provider_cert_rotated:%s)\n", $2));
3756bdfc4d55Sflorian 		if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert_rotated, $2))
3757bdfc4d55Sflorian 			fatal_exit("out of memory adding dnscrypt-provider-cert-rotated");
3758bdfc4d55Sflorian 	}
3759bdfc4d55Sflorian 	;
37602be9e038Ssthen dnsc_dnscrypt_secret_key: VAR_DNSCRYPT_SECRET_KEY STRING_ARG
37612be9e038Ssthen 	{
37622be9e038Ssthen 		OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", $2));
3763bdfc4d55Sflorian 		if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_secret_key, $2))
3764bdfc4d55Sflorian 			log_warn("dnscrypt-secret-key: %s is a duplicate", $2);
37652be9e038Ssthen 		if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_secret_key, $2))
37662be9e038Ssthen 			fatal_exit("out of memory adding dnscrypt-secret-key");
37672be9e038Ssthen 	}
37682be9e038Ssthen 	;
37697191de28Ssthen dnsc_dnscrypt_shared_secret_cache_size: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE STRING_ARG
37707191de28Ssthen   {
37717191de28Ssthen 	OUTYY(("P(dnscrypt_shared_secret_cache_size:%s)\n", $2));
37727191de28Ssthen 	if(!cfg_parse_memsize($2, &cfg_parser->cfg->dnscrypt_shared_secret_cache_size))
37737191de28Ssthen 		yyerror("memory size expected");
37747191de28Ssthen 	free($2);
37757191de28Ssthen   }
37767191de28Ssthen   ;
37777191de28Ssthen dnsc_dnscrypt_shared_secret_cache_slabs: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS STRING_ARG
37787191de28Ssthen   {
37797191de28Ssthen 	OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", $2));
3780e21c60efSsthen 	if(atoi($2) == 0) {
37817191de28Ssthen 		yyerror("number expected");
3782e21c60efSsthen 	} else {
37837191de28Ssthen 		cfg_parser->cfg->dnscrypt_shared_secret_cache_slabs = atoi($2);
37847191de28Ssthen 		if(!is_pow2(cfg_parser->cfg->dnscrypt_shared_secret_cache_slabs))
37857191de28Ssthen 			yyerror("must be a power of 2");
37867191de28Ssthen 	}
37877191de28Ssthen 	free($2);
37887191de28Ssthen   }
37897191de28Ssthen   ;
3790bdfc4d55Sflorian dnsc_dnscrypt_nonce_cache_size: VAR_DNSCRYPT_NONCE_CACHE_SIZE STRING_ARG
3791bdfc4d55Sflorian   {
3792bdfc4d55Sflorian 	OUTYY(("P(dnscrypt_nonce_cache_size:%s)\n", $2));
3793bdfc4d55Sflorian 	if(!cfg_parse_memsize($2, &cfg_parser->cfg->dnscrypt_nonce_cache_size))
3794bdfc4d55Sflorian 		yyerror("memory size expected");
3795bdfc4d55Sflorian 	free($2);
3796bdfc4d55Sflorian   }
3797bdfc4d55Sflorian   ;
3798bdfc4d55Sflorian dnsc_dnscrypt_nonce_cache_slabs: VAR_DNSCRYPT_NONCE_CACHE_SLABS STRING_ARG
3799bdfc4d55Sflorian   {
3800bdfc4d55Sflorian 	OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", $2));
3801e21c60efSsthen 	if(atoi($2) == 0) {
3802bdfc4d55Sflorian 		yyerror("number expected");
3803e21c60efSsthen 	} else {
3804bdfc4d55Sflorian 		cfg_parser->cfg->dnscrypt_nonce_cache_slabs = atoi($2);
3805bdfc4d55Sflorian 		if(!is_pow2(cfg_parser->cfg->dnscrypt_nonce_cache_slabs))
3806bdfc4d55Sflorian 			yyerror("must be a power of 2");
3807bdfc4d55Sflorian 	}
3808bdfc4d55Sflorian 	free($2);
3809bdfc4d55Sflorian   }
3810bdfc4d55Sflorian   ;
38117191de28Ssthen cachedbstart: VAR_CACHEDB
38127191de28Ssthen 	{
38137191de28Ssthen 		OUTYY(("\nP(cachedb:)\n"));
381445872187Ssthen 		cfg_parser->started_toplevel = 1;
38157191de28Ssthen 	}
38167191de28Ssthen 	;
38177191de28Ssthen contents_cachedb: contents_cachedb content_cachedb
38187191de28Ssthen 	| ;
381920237c55Ssthen content_cachedb: cachedb_backend_name | cachedb_secret_seed |
3820a3167c07Ssthen 	redis_server_host | redis_server_port | redis_timeout |
3821d896b962Ssthen 	redis_expire_records | redis_server_path | redis_server_password |
38222bdc0ed1Ssthen 	cachedb_no_store | redis_logical_db | cachedb_check_when_serve_expired
38237191de28Ssthen 	;
38247191de28Ssthen cachedb_backend_name: VAR_CACHEDB_BACKEND STRING_ARG
38257191de28Ssthen 	{
38267191de28Ssthen 	#ifdef USE_CACHEDB
38277191de28Ssthen 		OUTYY(("P(backend:%s)\n", $2));
38287191de28Ssthen 		free(cfg_parser->cfg->cachedb_backend);
38297191de28Ssthen 		cfg_parser->cfg->cachedb_backend = $2;
38307191de28Ssthen 	#else
38317191de28Ssthen 		OUTYY(("P(Compiled without cachedb, ignoring)\n"));
3832f6b99bafSsthen 		free($2);
38337191de28Ssthen 	#endif
38347191de28Ssthen 	}
38357191de28Ssthen 	;
38367191de28Ssthen cachedb_secret_seed: VAR_CACHEDB_SECRETSEED STRING_ARG
38377191de28Ssthen 	{
38387191de28Ssthen 	#ifdef USE_CACHEDB
38397191de28Ssthen 		OUTYY(("P(secret-seed:%s)\n", $2));
38407191de28Ssthen 		free(cfg_parser->cfg->cachedb_secret);
38417191de28Ssthen 		cfg_parser->cfg->cachedb_secret = $2;
38427191de28Ssthen 	#else
38437191de28Ssthen 		OUTYY(("P(Compiled without cachedb, ignoring)\n"));
38447191de28Ssthen 		free($2);
38457191de28Ssthen 	#endif
38467191de28Ssthen 	}
38477191de28Ssthen 	;
3848d896b962Ssthen cachedb_no_store: VAR_CACHEDB_NO_STORE STRING_ARG
3849d896b962Ssthen 	{
3850d896b962Ssthen 	#ifdef USE_CACHEDB
3851d896b962Ssthen 		OUTYY(("P(cachedb_no_store:%s)\n", $2));
3852d896b962Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3853d896b962Ssthen 			yyerror("expected yes or no.");
3854d896b962Ssthen 		else cfg_parser->cfg->cachedb_no_store = (strcmp($2, "yes")==0);
3855d896b962Ssthen 	#else
3856d896b962Ssthen 		OUTYY(("P(Compiled without cachedb, ignoring)\n"));
3857d896b962Ssthen 	#endif
3858d896b962Ssthen 		free($2);
3859d896b962Ssthen 	}
3860d896b962Ssthen 	;
38612bdc0ed1Ssthen cachedb_check_when_serve_expired: VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED STRING_ARG
38622bdc0ed1Ssthen 	{
38632bdc0ed1Ssthen 	#ifdef USE_CACHEDB
38642bdc0ed1Ssthen 		OUTYY(("P(cachedb_check_when_serve_expired:%s)\n", $2));
38652bdc0ed1Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
38662bdc0ed1Ssthen 			yyerror("expected yes or no.");
38672bdc0ed1Ssthen 		else cfg_parser->cfg->cachedb_check_when_serve_expired = (strcmp($2, "yes")==0);
38682bdc0ed1Ssthen 	#else
38692bdc0ed1Ssthen 		OUTYY(("P(Compiled without cachedb, ignoring)\n"));
38702bdc0ed1Ssthen 	#endif
38712bdc0ed1Ssthen 		free($2);
38722bdc0ed1Ssthen 	}
38732bdc0ed1Ssthen 	;
387420237c55Ssthen redis_server_host: VAR_CACHEDB_REDISHOST STRING_ARG
387520237c55Ssthen 	{
387620237c55Ssthen 	#if defined(USE_CACHEDB) && defined(USE_REDIS)
387720237c55Ssthen 		OUTYY(("P(redis_server_host:%s)\n", $2));
387820237c55Ssthen 		free(cfg_parser->cfg->redis_server_host);
387920237c55Ssthen 		cfg_parser->cfg->redis_server_host = $2;
388020237c55Ssthen 	#else
388120237c55Ssthen 		OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
388220237c55Ssthen 		free($2);
388320237c55Ssthen 	#endif
388420237c55Ssthen 	}
388520237c55Ssthen 	;
388620237c55Ssthen redis_server_port: VAR_CACHEDB_REDISPORT STRING_ARG
388720237c55Ssthen 	{
388820237c55Ssthen 	#if defined(USE_CACHEDB) && defined(USE_REDIS)
388920237c55Ssthen 		int port;
389020237c55Ssthen 		OUTYY(("P(redis_server_port:%s)\n", $2));
389120237c55Ssthen 		port = atoi($2);
389220237c55Ssthen 		if(port == 0 || port < 0 || port > 65535)
389320237c55Ssthen 			yyerror("valid redis server port number expected");
389420237c55Ssthen 		else cfg_parser->cfg->redis_server_port = port;
389520237c55Ssthen 	#else
389620237c55Ssthen 		OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
389720237c55Ssthen 	#endif
389820237c55Ssthen 		free($2);
389920237c55Ssthen 	}
390020237c55Ssthen 	;
39018b7325afSsthen redis_server_path: VAR_CACHEDB_REDISPATH STRING_ARG
39028b7325afSsthen 	{
39038b7325afSsthen 	#if defined(USE_CACHEDB) && defined(USE_REDIS)
39048b7325afSsthen 		OUTYY(("P(redis_server_path:%s)\n", $2));
39058b7325afSsthen 		free(cfg_parser->cfg->redis_server_path);
39068b7325afSsthen 		cfg_parser->cfg->redis_server_path = $2;
39078b7325afSsthen 	#else
39088b7325afSsthen 		OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
39098b7325afSsthen 		free($2);
39108b7325afSsthen 	#endif
39118b7325afSsthen 	}
39128b7325afSsthen 	;
39138b7325afSsthen redis_server_password: VAR_CACHEDB_REDISPASSWORD STRING_ARG
39148b7325afSsthen 	{
39158b7325afSsthen 	#if defined(USE_CACHEDB) && defined(USE_REDIS)
39168b7325afSsthen 		OUTYY(("P(redis_server_password:%s)\n", $2));
39178b7325afSsthen 		free(cfg_parser->cfg->redis_server_password);
39188b7325afSsthen 		cfg_parser->cfg->redis_server_password = $2;
39198b7325afSsthen 	#else
39208b7325afSsthen 		OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
39218b7325afSsthen 		free($2);
39228b7325afSsthen 	#endif
39238b7325afSsthen 	}
39248b7325afSsthen 	;
392520237c55Ssthen redis_timeout: VAR_CACHEDB_REDISTIMEOUT STRING_ARG
392620237c55Ssthen 	{
392720237c55Ssthen 	#if defined(USE_CACHEDB) && defined(USE_REDIS)
392820237c55Ssthen 		OUTYY(("P(redis_timeout:%s)\n", $2));
392920237c55Ssthen 		if(atoi($2) == 0)
393020237c55Ssthen 			yyerror("redis timeout value expected");
393120237c55Ssthen 		else cfg_parser->cfg->redis_timeout = atoi($2);
393220237c55Ssthen 	#else
393320237c55Ssthen 		OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
393420237c55Ssthen 	#endif
393520237c55Ssthen 		free($2);
393620237c55Ssthen 	}
393720237c55Ssthen 	;
3938a3167c07Ssthen redis_expire_records: VAR_CACHEDB_REDISEXPIRERECORDS STRING_ARG
3939a3167c07Ssthen 	{
3940a3167c07Ssthen 	#if defined(USE_CACHEDB) && defined(USE_REDIS)
3941a3167c07Ssthen 		OUTYY(("P(redis_expire_records:%s)\n", $2));
3942a3167c07Ssthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
3943a3167c07Ssthen 			yyerror("expected yes or no.");
3944a3167c07Ssthen 		else cfg_parser->cfg->redis_expire_records = (strcmp($2, "yes")==0);
3945a3167c07Ssthen 	#else
3946a3167c07Ssthen 		OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
3947a3167c07Ssthen 	#endif
3948a3167c07Ssthen 		free($2);
3949a3167c07Ssthen 	}
3950a3167c07Ssthen 	;
3951d896b962Ssthen redis_logical_db: VAR_CACHEDB_REDISLOGICALDB STRING_ARG
3952d896b962Ssthen 	{
3953d896b962Ssthen 	#if defined(USE_CACHEDB) && defined(USE_REDIS)
3954d896b962Ssthen 		int db;
3955d896b962Ssthen 		OUTYY(("P(redis_logical_db:%s)\n", $2));
3956d896b962Ssthen 		db = atoi($2);
3957d896b962Ssthen 		if((db == 0 && strcmp($2, "0") != 0) || db < 0)
3958d896b962Ssthen 			yyerror("valid redis logical database index expected");
3959d896b962Ssthen 		else cfg_parser->cfg->redis_logical_db = db;
3960d896b962Ssthen 	#else
3961d896b962Ssthen 		OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
3962d896b962Ssthen 	#endif
3963d896b962Ssthen 		free($2);
3964d896b962Ssthen 	}
3965d896b962Ssthen 	;
39662308e98cSsthen server_tcp_connection_limit: VAR_TCP_CONNECTION_LIMIT STRING_ARG STRING_ARG
39672308e98cSsthen 	{
39682308e98cSsthen 		OUTYY(("P(server_tcp_connection_limit:%s %s)\n", $2, $3));
39692308e98cSsthen 		if (atoi($3) < 0)
39702308e98cSsthen 			yyerror("positive number expected");
39712308e98cSsthen 		else {
39722308e98cSsthen 			if(!cfg_str2list_insert(&cfg_parser->cfg->tcp_connection_limits, $2, $3))
39732308e98cSsthen 				fatal_exit("out of memory adding tcp connection limit");
39742308e98cSsthen 		}
39752308e98cSsthen 	}
39762308e98cSsthen 	;
39778b7325afSsthen server_answer_cookie: VAR_ANSWER_COOKIE STRING_ARG
39788b7325afSsthen 	{
39798b7325afSsthen 		OUTYY(("P(server_answer_cookie:%s)\n", $2));
39808b7325afSsthen 		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
39818b7325afSsthen 			yyerror("expected yes or no.");
39828b7325afSsthen 		else cfg_parser->cfg->do_answer_cookie = (strcmp($2, "yes")==0);
39838b7325afSsthen 		free($2);
39848b7325afSsthen 	}
39858b7325afSsthen 	;
39868b7325afSsthen server_cookie_secret: VAR_COOKIE_SECRET STRING_ARG
39878b7325afSsthen 	{
39888b7325afSsthen 		uint8_t secret[32];
39898b7325afSsthen 		size_t secret_len = sizeof(secret);
39908b7325afSsthen 
39918b7325afSsthen 		OUTYY(("P(server_cookie_secret:%s)\n", $2));
39928b7325afSsthen 		if(sldns_str2wire_hex_buf($2, secret, &secret_len)
39938b7325afSsthen 		|| (secret_len != 16))
39948b7325afSsthen 			yyerror("expected 128 bit hex string");
39958b7325afSsthen 		else {
39968b7325afSsthen 			cfg_parser->cfg->cookie_secret_len = secret_len;
39978b7325afSsthen 			memcpy(cfg_parser->cfg->cookie_secret, secret, sizeof(secret));
39988b7325afSsthen 		}
39998b7325afSsthen 		free($2);
40008b7325afSsthen 	}
40018b7325afSsthen 	;
4002*98bc733bSsthen server_cookie_secret_file: VAR_COOKIE_SECRET_FILE STRING_ARG
4003*98bc733bSsthen 	{
4004*98bc733bSsthen 		OUTYY(("P(cookie_secret_file:%s)\n", $2));
4005*98bc733bSsthen 		free(cfg_parser->cfg->cookie_secret_file);
4006*98bc733bSsthen 		cfg_parser->cfg->cookie_secret_file = $2;
4007*98bc733bSsthen 	}
4008*98bc733bSsthen 	;
40098240c1b9Ssthen 	ipsetstart: VAR_IPSET
40108240c1b9Ssthen 		{
40118240c1b9Ssthen 			OUTYY(("\nP(ipset:)\n"));
401245872187Ssthen 			cfg_parser->started_toplevel = 1;
40138240c1b9Ssthen 		}
40148240c1b9Ssthen 		;
40158240c1b9Ssthen 	contents_ipset: contents_ipset content_ipset
40168240c1b9Ssthen 		| ;
40178240c1b9Ssthen 	content_ipset: ipset_name_v4 | ipset_name_v6
40188240c1b9Ssthen 		;
40198240c1b9Ssthen 	ipset_name_v4: VAR_IPSET_NAME_V4 STRING_ARG
40208240c1b9Ssthen 		{
40218240c1b9Ssthen 		#ifdef USE_IPSET
40228240c1b9Ssthen 			OUTYY(("P(name-v4:%s)\n", $2));
40238240c1b9Ssthen 			if(cfg_parser->cfg->ipset_name_v4)
40248240c1b9Ssthen 				yyerror("ipset name v4 override, there must be one "
40258240c1b9Ssthen 					"name for ip v4");
40268240c1b9Ssthen 			free(cfg_parser->cfg->ipset_name_v4);
40278240c1b9Ssthen 			cfg_parser->cfg->ipset_name_v4 = $2;
40288240c1b9Ssthen 		#else
40298240c1b9Ssthen 			OUTYY(("P(Compiled without ipset, ignoring)\n"));
40308240c1b9Ssthen 			free($2);
40318240c1b9Ssthen 		#endif
40328240c1b9Ssthen 		}
40338240c1b9Ssthen 	;
40348240c1b9Ssthen 	ipset_name_v6: VAR_IPSET_NAME_V6 STRING_ARG
40358240c1b9Ssthen 	{
40368240c1b9Ssthen 		#ifdef USE_IPSET
40378240c1b9Ssthen 			OUTYY(("P(name-v6:%s)\n", $2));
40388240c1b9Ssthen 			if(cfg_parser->cfg->ipset_name_v6)
40398240c1b9Ssthen 				yyerror("ipset name v6 override, there must be one "
40408240c1b9Ssthen 					"name for ip v6");
40418240c1b9Ssthen 			free(cfg_parser->cfg->ipset_name_v6);
40428240c1b9Ssthen 			cfg_parser->cfg->ipset_name_v6 = $2;
40438240c1b9Ssthen 		#else
40448240c1b9Ssthen 			OUTYY(("P(Compiled without ipset, ignoring)\n"));
40458240c1b9Ssthen 			free($2);
40468240c1b9Ssthen 		#endif
40478240c1b9Ssthen 		}
40488240c1b9Ssthen 	;
4049933707f3Ssthen %%
4050933707f3Ssthen 
4051933707f3Ssthen /* parse helper routines could be here */
40522be9e038Ssthen static void
40532be9e038Ssthen validate_respip_action(const char* action)
40542be9e038Ssthen {
40552be9e038Ssthen 	if(strcmp(action, "deny")!=0 &&
40562be9e038Ssthen 		strcmp(action, "redirect")!=0 &&
40572be9e038Ssthen 		strcmp(action, "inform")!=0 &&
40582be9e038Ssthen 		strcmp(action, "inform_deny")!=0 &&
40592be9e038Ssthen 		strcmp(action, "always_transparent")!=0 &&
40602be9e038Ssthen 		strcmp(action, "always_refuse")!=0 &&
40612be9e038Ssthen 		strcmp(action, "always_nxdomain")!=0)
40622be9e038Ssthen 	{
40632be9e038Ssthen 		yyerror("response-ip action: expected deny, redirect, "
40642be9e038Ssthen 			"inform, inform_deny, always_transparent, "
40652be9e038Ssthen 			"always_refuse or always_nxdomain");
40662be9e038Ssthen 	}
40672be9e038Ssthen }
40688240c1b9Ssthen 
406945872187Ssthen static void
407045872187Ssthen validate_acl_action(const char* action)
407145872187Ssthen {
407245872187Ssthen 	if(strcmp(action, "deny")!=0 &&
407345872187Ssthen 		strcmp(action, "refuse")!=0 &&
407445872187Ssthen 		strcmp(action, "deny_non_local")!=0 &&
407545872187Ssthen 		strcmp(action, "refuse_non_local")!=0 &&
407645872187Ssthen 		strcmp(action, "allow_setrd")!=0 &&
407745872187Ssthen 		strcmp(action, "allow")!=0 &&
40788b7325afSsthen 		strcmp(action, "allow_snoop")!=0 &&
40798b7325afSsthen 		strcmp(action, "allow_cookie")!=0)
408045872187Ssthen 	{
408145872187Ssthen 		yyerror("expected deny, refuse, deny_non_local, "
40828b7325afSsthen 			"refuse_non_local, allow, allow_setrd, "
40838b7325afSsthen 			"allow_snoop or allow_cookie as access control action");
408445872187Ssthen 	}
408545872187Ssthen }
4086