1 /* 2 * configparser.y -- yacc grammar for unbound configuration files 3 * 4 * Copyright (c) 2001-2006, NLnet Labs. All rights reserved. 5 * 6 * Copyright (c) 2007, NLnet Labs. All rights reserved. 7 * 8 * This software is open source. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 14 * Redistributions of source code must retain the above copyright notice, 15 * this list of conditions and the following disclaimer. 16 * 17 * Redistributions in binary form must reproduce the above copyright notice, 18 * this list of conditions and the following disclaimer in the documentation 19 * and/or other materials provided with the distribution. 20 * 21 * Neither the name of the NLNET LABS nor the names of its contributors may 22 * be used to endorse or promote products derived from this software without 23 * specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 29 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 31 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 32 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 33 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 34 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 */ 37 38 %{ 39 #include "config.h" 40 41 #include <stdarg.h> 42 #include <stdio.h> 43 #include <string.h> 44 #include <stdlib.h> 45 #include <assert.h> 46 47 #include "util/configyyrename.h" 48 #include "util/config_file.h" 49 #include "util/net_help.h" 50 #include "sldns/str2wire.h" 51 52 int ub_c_lex(void); 53 void ub_c_error(const char *message); 54 55 static void validate_respip_action(const char* action); 56 static void validate_acl_action(const char* action); 57 58 /* these need to be global, otherwise they cannot be used inside yacc */ 59 extern struct config_parser_state* cfg_parser; 60 61 #if 0 62 #define OUTYY(s) printf s /* used ONLY when debugging */ 63 #else 64 #define OUTYY(s) 65 #endif 66 67 %} 68 %union { 69 char* str; 70 }; 71 72 %token SPACE LETTER NEWLINE COMMENT COLON ANY ZONESTR 73 %token <str> STRING_ARG 74 %token VAR_FORCE_TOPLEVEL 75 %token VAR_SERVER VAR_VERBOSITY VAR_NUM_THREADS VAR_PORT 76 %token VAR_OUTGOING_RANGE VAR_INTERFACE VAR_PREFER_IP4 77 %token VAR_DO_IP4 VAR_DO_IP6 VAR_DO_NAT64 VAR_PREFER_IP6 VAR_DO_UDP VAR_DO_TCP 78 %token VAR_TCP_MSS VAR_OUTGOING_TCP_MSS VAR_TCP_IDLE_TIMEOUT 79 %token VAR_EDNS_TCP_KEEPALIVE VAR_EDNS_TCP_KEEPALIVE_TIMEOUT 80 %token VAR_SOCK_QUEUE_TIMEOUT 81 %token VAR_CHROOT VAR_USERNAME VAR_DIRECTORY VAR_LOGFILE VAR_PIDFILE 82 %token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS VAR_NUM_QUERIES_PER_THREAD 83 %token VAR_RRSET_CACHE_SIZE VAR_RRSET_CACHE_SLABS VAR_OUTGOING_NUM_TCP 84 %token VAR_INFRA_HOST_TTL VAR_INFRA_LAME_TTL VAR_INFRA_CACHE_SLABS 85 %token VAR_INFRA_CACHE_NUMHOSTS VAR_INFRA_CACHE_LAME_SIZE VAR_NAME 86 %token VAR_STUB_ZONE VAR_STUB_HOST VAR_STUB_ADDR VAR_TARGET_FETCH_POLICY 87 %token VAR_HARDEN_SHORT_BUFSIZE VAR_HARDEN_LARGE_QUERIES 88 %token VAR_FORWARD_ZONE VAR_FORWARD_HOST VAR_FORWARD_ADDR 89 %token VAR_DO_NOT_QUERY_ADDRESS VAR_HIDE_IDENTITY VAR_HIDE_VERSION 90 %token VAR_IDENTITY VAR_VERSION VAR_HARDEN_GLUE VAR_MODULE_CONF 91 %token VAR_TRUST_ANCHOR_FILE VAR_TRUST_ANCHOR VAR_VAL_OVERRIDE_DATE 92 %token VAR_BOGUS_TTL VAR_VAL_CLEAN_ADDITIONAL VAR_VAL_PERMISSIVE_MODE 93 %token VAR_INCOMING_NUM_TCP VAR_MSG_BUFFER_SIZE VAR_KEY_CACHE_SIZE 94 %token VAR_KEY_CACHE_SLABS VAR_TRUSTED_KEYS_FILE 95 %token VAR_VAL_NSEC3_KEYSIZE_ITERATIONS VAR_USE_SYSLOG 96 %token VAR_OUTGOING_INTERFACE VAR_ROOT_HINTS VAR_DO_NOT_QUERY_LOCALHOST 97 %token VAR_CACHE_MAX_TTL VAR_HARDEN_DNSSEC_STRIPPED VAR_ACCESS_CONTROL 98 %token VAR_LOCAL_ZONE VAR_LOCAL_DATA VAR_INTERFACE_AUTOMATIC 99 %token VAR_STATISTICS_INTERVAL VAR_DO_DAEMONIZE VAR_USE_CAPS_FOR_ID 100 %token VAR_STATISTICS_CUMULATIVE VAR_OUTGOING_PORT_PERMIT 101 %token VAR_OUTGOING_PORT_AVOID VAR_DLV_ANCHOR_FILE VAR_DLV_ANCHOR 102 %token VAR_NEG_CACHE_SIZE VAR_HARDEN_REFERRAL_PATH VAR_PRIVATE_ADDRESS 103 %token VAR_PRIVATE_DOMAIN VAR_REMOTE_CONTROL VAR_CONTROL_ENABLE 104 %token VAR_CONTROL_INTERFACE VAR_CONTROL_PORT VAR_SERVER_KEY_FILE 105 %token VAR_SERVER_CERT_FILE VAR_CONTROL_KEY_FILE VAR_CONTROL_CERT_FILE 106 %token VAR_CONTROL_USE_CERT VAR_TCP_REUSE_TIMEOUT VAR_MAX_REUSE_TCP_QUERIES 107 %token VAR_EXTENDED_STATISTICS VAR_LOCAL_DATA_PTR VAR_JOSTLE_TIMEOUT 108 %token VAR_STUB_PRIME VAR_UNWANTED_REPLY_THRESHOLD VAR_LOG_TIME_ASCII 109 %token VAR_DOMAIN_INSECURE VAR_PYTHON VAR_PYTHON_SCRIPT VAR_VAL_SIG_SKEW_MIN 110 %token VAR_VAL_SIG_SKEW_MAX VAR_VAL_MAX_RESTART VAR_CACHE_MIN_TTL 111 %token VAR_VAL_LOG_LEVEL VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING 112 %token VAR_ADD_HOLDDOWN VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE 113 %token VAR_PREFETCH VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT 114 %token VAR_HARDEN_BELOW_NXDOMAIN VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES 115 %token VAR_LOG_REPLIES VAR_LOG_LOCAL_ACTIONS VAR_TCP_UPSTREAM 116 %token VAR_SSL_UPSTREAM VAR_TCP_AUTH_QUERY_TIMEOUT VAR_SSL_SERVICE_KEY 117 %token VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST 118 %token VAR_STUB_SSL_UPSTREAM VAR_FORWARD_SSL_UPSTREAM VAR_TLS_CERT_BUNDLE 119 %token VAR_STUB_TCP_UPSTREAM VAR_FORWARD_TCP_UPSTREAM 120 %token VAR_HTTPS_PORT VAR_HTTP_ENDPOINT VAR_HTTP_MAX_STREAMS 121 %token VAR_HTTP_QUERY_BUFFER_SIZE VAR_HTTP_RESPONSE_BUFFER_SIZE 122 %token VAR_HTTP_NODELAY VAR_HTTP_NOTLS_DOWNSTREAM 123 %token VAR_STUB_FIRST VAR_MINIMAL_RESPONSES VAR_RRSET_ROUNDROBIN 124 %token VAR_MAX_UDP_SIZE VAR_DELAY_CLOSE VAR_UDP_CONNECT 125 %token VAR_UNBLOCK_LAN_ZONES VAR_INSECURE_LAN_ZONES 126 %token VAR_INFRA_CACHE_MIN_RTT VAR_INFRA_CACHE_MAX_RTT VAR_INFRA_KEEP_PROBING 127 %token VAR_DNS64_PREFIX VAR_DNS64_SYNTHALL VAR_DNS64_IGNORE_AAAA 128 %token VAR_NAT64_PREFIX 129 %token VAR_DNSTAP VAR_DNSTAP_ENABLE VAR_DNSTAP_SOCKET_PATH VAR_DNSTAP_IP 130 %token VAR_DNSTAP_TLS VAR_DNSTAP_TLS_SERVER_NAME VAR_DNSTAP_TLS_CERT_BUNDLE 131 %token VAR_DNSTAP_TLS_CLIENT_KEY_FILE VAR_DNSTAP_TLS_CLIENT_CERT_FILE 132 %token VAR_DNSTAP_SEND_IDENTITY VAR_DNSTAP_SEND_VERSION VAR_DNSTAP_BIDIRECTIONAL 133 %token VAR_DNSTAP_IDENTITY VAR_DNSTAP_VERSION 134 %token VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 135 %token VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 136 %token VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 137 %token VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 138 %token VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 139 %token VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 140 %token VAR_DNSTAP_SAMPLE_RATE 141 %token VAR_RESPONSE_IP_TAG VAR_RESPONSE_IP VAR_RESPONSE_IP_DATA 142 %token VAR_HARDEN_ALGO_DOWNGRADE VAR_IP_TRANSPARENT 143 %token VAR_IP_DSCP 144 %token VAR_DISABLE_DNSSEC_LAME_CHECK 145 %token VAR_IP_RATELIMIT VAR_IP_RATELIMIT_SLABS VAR_IP_RATELIMIT_SIZE 146 %token VAR_RATELIMIT VAR_RATELIMIT_SLABS VAR_RATELIMIT_SIZE 147 %token VAR_OUTBOUND_MSG_RETRY VAR_MAX_SENT_COUNT VAR_MAX_QUERY_RESTARTS 148 %token VAR_RATELIMIT_FOR_DOMAIN VAR_RATELIMIT_BELOW_DOMAIN 149 %token VAR_IP_RATELIMIT_FACTOR VAR_RATELIMIT_FACTOR 150 %token VAR_IP_RATELIMIT_BACKOFF VAR_RATELIMIT_BACKOFF 151 %token VAR_SEND_CLIENT_SUBNET VAR_CLIENT_SUBNET_ZONE 152 %token VAR_CLIENT_SUBNET_ALWAYS_FORWARD VAR_CLIENT_SUBNET_OPCODE 153 %token VAR_MAX_CLIENT_SUBNET_IPV4 VAR_MAX_CLIENT_SUBNET_IPV6 154 %token VAR_MIN_CLIENT_SUBNET_IPV4 VAR_MIN_CLIENT_SUBNET_IPV6 155 %token VAR_MAX_ECS_TREE_SIZE_IPV4 VAR_MAX_ECS_TREE_SIZE_IPV6 156 %token VAR_CAPS_WHITELIST VAR_CACHE_MAX_NEGATIVE_TTL VAR_PERMIT_SMALL_HOLDDOWN 157 %token VAR_CACHE_MIN_NEGATIVE_TTL 158 %token VAR_QNAME_MINIMISATION VAR_QNAME_MINIMISATION_STRICT VAR_IP_FREEBIND 159 %token VAR_DEFINE_TAG VAR_LOCAL_ZONE_TAG VAR_ACCESS_CONTROL_TAG 160 %token VAR_LOCAL_ZONE_OVERRIDE VAR_ACCESS_CONTROL_TAG_ACTION 161 %token VAR_ACCESS_CONTROL_TAG_DATA VAR_VIEW VAR_ACCESS_CONTROL_VIEW 162 %token VAR_VIEW_FIRST VAR_SERVE_EXPIRED VAR_SERVE_EXPIRED_TTL 163 %token VAR_SERVE_EXPIRED_TTL_RESET VAR_SERVE_EXPIRED_REPLY_TTL 164 %token VAR_SERVE_EXPIRED_CLIENT_TIMEOUT VAR_EDE_SERVE_EXPIRED 165 %token VAR_SERVE_ORIGINAL_TTL VAR_FAKE_DSA 166 %token VAR_FAKE_SHA1 VAR_LOG_IDENTITY VAR_HIDE_TRUSTANCHOR 167 %token VAR_HIDE_HTTP_USER_AGENT VAR_HTTP_USER_AGENT 168 %token VAR_TRUST_ANCHOR_SIGNALING VAR_AGGRESSIVE_NSEC VAR_USE_SYSTEMD 169 %token VAR_SHM_ENABLE VAR_SHM_KEY VAR_ROOT_KEY_SENTINEL 170 %token VAR_DNSCRYPT VAR_DNSCRYPT_ENABLE VAR_DNSCRYPT_PORT VAR_DNSCRYPT_PROVIDER 171 %token VAR_DNSCRYPT_SECRET_KEY VAR_DNSCRYPT_PROVIDER_CERT 172 %token VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 173 %token VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 174 %token VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 175 %token VAR_DNSCRYPT_NONCE_CACHE_SIZE 176 %token VAR_DNSCRYPT_NONCE_CACHE_SLABS 177 %token VAR_PAD_RESPONSES VAR_PAD_RESPONSES_BLOCK_SIZE 178 %token VAR_PAD_QUERIES VAR_PAD_QUERIES_BLOCK_SIZE 179 %token VAR_IPSECMOD_ENABLED VAR_IPSECMOD_HOOK VAR_IPSECMOD_IGNORE_BOGUS 180 %token VAR_IPSECMOD_MAX_TTL VAR_IPSECMOD_WHITELIST VAR_IPSECMOD_STRICT 181 %token VAR_CACHEDB VAR_CACHEDB_BACKEND VAR_CACHEDB_SECRETSEED 182 %token VAR_CACHEDB_REDISHOST VAR_CACHEDB_REDISREPLICAHOST 183 %token VAR_CACHEDB_REDISPORT VAR_CACHEDB_REDISREPLICAPORT 184 %token VAR_CACHEDB_REDISTIMEOUT VAR_CACHEDB_REDISREPLICATIMEOUT 185 %token VAR_CACHEDB_REDISEXPIRERECORDS 186 %token VAR_CACHEDB_REDISPATH VAR_CACHEDB_REDISREPLICAPATH 187 %token VAR_CACHEDB_REDISPASSWORD VAR_CACHEDB_REDISREPLICAPASSWORD 188 %token VAR_CACHEDB_REDISLOGICALDB VAR_CACHEDB_REDISREPLICALOGICALDB 189 %token VAR_CACHEDB_REDISCOMMANDTIMEOUT VAR_CACHEDB_REDISREPLICACOMMANDTIMEOUT 190 %token VAR_CACHEDB_REDISCONNECTTIMEOUT VAR_CACHEDB_REDISREPLICACONNECTTIMEOUT 191 %token VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM VAR_FOR_UPSTREAM 192 %token VAR_AUTH_ZONE VAR_ZONEFILE VAR_MASTER VAR_URL VAR_FOR_DOWNSTREAM 193 %token VAR_FALLBACK_ENABLED VAR_TLS_ADDITIONAL_PORT VAR_LOW_RTT VAR_LOW_RTT_PERMIL 194 %token VAR_FAST_SERVER_PERMIL VAR_FAST_SERVER_NUM 195 %token VAR_ALLOW_NOTIFY VAR_TLS_WIN_CERT VAR_TCP_CONNECTION_LIMIT 196 %token VAR_ANSWER_COOKIE VAR_COOKIE_SECRET VAR_IP_RATELIMIT_COOKIE 197 %token VAR_FORWARD_NO_CACHE VAR_STUB_NO_CACHE VAR_LOG_SERVFAIL VAR_DENY_ANY 198 %token VAR_UNKNOWN_SERVER_TIME_LIMIT VAR_LOG_TAG_QUERYREPLY 199 %token VAR_DISCARD_TIMEOUT VAR_WAIT_LIMIT VAR_WAIT_LIMIT_COOKIE 200 %token VAR_WAIT_LIMIT_NETBLOCK VAR_WAIT_LIMIT_COOKIE_NETBLOCK 201 %token VAR_STREAM_WAIT_SIZE VAR_TLS_CIPHERS VAR_TLS_CIPHERSUITES VAR_TLS_USE_SNI 202 %token VAR_TLS_PROTOCOLS 203 %token VAR_IPSET VAR_IPSET_NAME_V4 VAR_IPSET_NAME_V6 204 %token VAR_TLS_SESSION_TICKET_KEYS VAR_RPZ VAR_TAGS VAR_RPZ_ACTION_OVERRIDE 205 %token VAR_RPZ_CNAME_OVERRIDE VAR_RPZ_LOG VAR_RPZ_LOG_NAME 206 %token VAR_DYNLIB VAR_DYNLIB_FILE VAR_EDNS_CLIENT_STRING 207 %token VAR_EDNS_CLIENT_STRING_OPCODE VAR_NSID 208 %token VAR_ZONEMD_PERMISSIVE_MODE VAR_ZONEMD_CHECK VAR_ZONEMD_REJECT_ABSENCE 209 %token VAR_RPZ_SIGNAL_NXDOMAIN_RA VAR_INTERFACE_AUTOMATIC_PORTS VAR_EDE 210 %token VAR_DNS_ERROR_REPORTING 211 %token VAR_INTERFACE_ACTION VAR_INTERFACE_VIEW VAR_INTERFACE_TAG 212 %token VAR_INTERFACE_TAG_ACTION VAR_INTERFACE_TAG_DATA 213 %token VAR_QUIC_PORT VAR_QUIC_SIZE 214 %token VAR_PROXY_PROTOCOL_PORT VAR_STATISTICS_INHIBIT_ZERO 215 %token VAR_HARDEN_UNKNOWN_ADDITIONAL VAR_DISABLE_EDNS_DO VAR_CACHEDB_NO_STORE 216 %token VAR_LOG_DESTADDR VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED 217 %token VAR_COOKIE_SECRET_FILE VAR_ITER_SCRUB_NS VAR_ITER_SCRUB_CNAME 218 %token VAR_ITER_SCRUB_RRSIG 219 %token VAR_MAX_TRANSFER_SIZE VAR_MAX_TRANSFER_TIME 220 %token VAR_MAX_GLOBAL_QUOTA VAR_HARDEN_UNVERIFIED_GLUE VAR_LOG_TIME_ISO 221 %token VAR_VAL_VALIDATION_ATTEMPTS VAR_VAL_HASH_ATTEMPTS 222 %token VAR_ITER_SCRUB_PROMISCUOUS VAR_LOG_THREAD_ID 223 224 %% 225 toplevelvars: /* empty */ | toplevelvars toplevelvar ; 226 toplevelvar: serverstart contents_server | stub_clause | 227 forward_clause | pythonstart contents_py | 228 rcstart contents_rc | dtstart contents_dt | view_clause | 229 dnscstart contents_dnsc | cachedbstart contents_cachedb | 230 ipsetstart contents_ipset | authstart contents_auth | 231 rpzstart contents_rpz | dynlibstart contents_dl | 232 force_toplevel 233 ; 234 force_toplevel: VAR_FORCE_TOPLEVEL 235 { 236 OUTYY(("\nP(force-toplevel)\n")); 237 cfg_parser->started_toplevel = 0; 238 } 239 ; 240 /* server: declaration */ 241 serverstart: VAR_SERVER 242 { 243 OUTYY(("\nP(server:)\n")); 244 cfg_parser->started_toplevel = 1; 245 } 246 ; 247 contents_server: contents_server content_server 248 | ; 249 content_server: server_num_threads | server_verbosity | server_port | 250 server_outgoing_range | server_do_ip4 | 251 server_do_ip6 | server_do_nat64 | server_prefer_ip4 | 252 server_prefer_ip6 | server_do_udp | server_do_tcp | 253 server_tcp_mss | server_outgoing_tcp_mss | server_tcp_idle_timeout | 254 server_tcp_keepalive | server_tcp_keepalive_timeout | 255 server_sock_queue_timeout | 256 server_interface | server_chroot | server_username | 257 server_directory | server_logfile | server_pidfile | 258 server_msg_cache_size | server_msg_cache_slabs | 259 server_num_queries_per_thread | server_rrset_cache_size | 260 server_rrset_cache_slabs | server_outgoing_num_tcp | 261 server_infra_host_ttl | server_infra_lame_ttl | 262 server_infra_cache_slabs | server_infra_cache_numhosts | 263 server_infra_cache_lame_size | server_target_fetch_policy | 264 server_harden_short_bufsize | server_harden_large_queries | 265 server_do_not_query_address | server_hide_identity | 266 server_hide_version | server_identity | server_version | 267 server_hide_http_user_agent | server_http_user_agent | 268 server_harden_glue | server_module_conf | server_trust_anchor_file | 269 server_trust_anchor | server_val_override_date | server_bogus_ttl | 270 server_val_clean_additional | server_val_permissive_mode | 271 server_incoming_num_tcp | server_msg_buffer_size | 272 server_key_cache_size | server_key_cache_slabs | 273 server_trusted_keys_file | server_val_nsec3_keysize_iterations | 274 server_use_syslog | server_outgoing_interface | server_root_hints | 275 server_do_not_query_localhost | server_cache_max_ttl | 276 server_harden_dnssec_stripped | server_access_control | 277 server_local_zone | server_local_data | server_interface_automatic | 278 server_statistics_interval | server_do_daemonize | 279 server_use_caps_for_id | server_statistics_cumulative | 280 server_outgoing_port_permit | server_outgoing_port_avoid | 281 server_dlv_anchor_file | server_dlv_anchor | server_neg_cache_size | 282 server_harden_referral_path | server_private_address | 283 server_private_domain | server_extended_statistics | 284 server_local_data_ptr | server_jostle_timeout | 285 server_unwanted_reply_threshold | server_log_time_ascii | 286 server_domain_insecure | server_val_sig_skew_min | 287 server_val_sig_skew_max | server_val_max_restart | 288 server_cache_min_ttl | server_val_log_level | 289 server_auto_trust_anchor_file | server_add_holddown | 290 server_del_holddown | server_keep_missing | server_so_rcvbuf | 291 server_edns_buffer_size | server_prefetch | server_prefetch_key | 292 server_so_sndbuf | server_harden_below_nxdomain | server_ignore_cd_flag | 293 server_log_queries | server_log_replies | server_tcp_upstream | server_ssl_upstream | 294 server_log_local_actions | server_log_thread_id | 295 server_ssl_service_key | server_ssl_service_pem | server_ssl_port | 296 server_https_port | server_http_endpoint | server_http_max_streams | 297 server_http_query_buffer_size | server_http_response_buffer_size | 298 server_http_nodelay | server_http_notls_downstream | 299 server_minimal_responses | server_rrset_roundrobin | server_max_udp_size | 300 server_so_reuseport | server_delay_close | server_udp_connect | 301 server_unblock_lan_zones | server_insecure_lan_zones | 302 server_dns64_prefix | server_dns64_synthall | server_dns64_ignore_aaaa | 303 server_nat64_prefix | 304 server_infra_cache_min_rtt | server_infra_cache_max_rtt | server_harden_algo_downgrade | 305 server_ip_transparent | server_ip_ratelimit | server_ratelimit | 306 server_ip_dscp | server_infra_keep_probing | 307 server_ip_ratelimit_slabs | server_ratelimit_slabs | 308 server_ip_ratelimit_size | server_ratelimit_size | 309 server_ratelimit_for_domain | 310 server_ratelimit_below_domain | server_ratelimit_factor | 311 server_ip_ratelimit_factor | server_ratelimit_backoff | 312 server_ip_ratelimit_backoff | server_outbound_msg_retry | 313 server_max_sent_count | server_max_query_restarts | 314 server_send_client_subnet | server_client_subnet_zone | 315 server_client_subnet_always_forward | server_client_subnet_opcode | 316 server_max_client_subnet_ipv4 | server_max_client_subnet_ipv6 | 317 server_min_client_subnet_ipv4 | server_min_client_subnet_ipv6 | 318 server_max_ecs_tree_size_ipv4 | server_max_ecs_tree_size_ipv6 | 319 server_caps_whitelist | server_cache_max_negative_ttl | 320 server_cache_min_negative_ttl | 321 server_permit_small_holddown | server_qname_minimisation | 322 server_ip_freebind | server_define_tag | server_local_zone_tag | 323 server_disable_dnssec_lame_check | server_access_control_tag | 324 server_local_zone_override | server_access_control_tag_action | 325 server_access_control_tag_data | server_access_control_view | 326 server_interface_action | server_interface_view | server_interface_tag | 327 server_interface_tag_action | server_interface_tag_data | 328 server_qname_minimisation_strict | 329 server_pad_responses | server_pad_responses_block_size | 330 server_pad_queries | server_pad_queries_block_size | 331 server_serve_expired | 332 server_serve_expired_ttl | server_serve_expired_ttl_reset | 333 server_serve_expired_reply_ttl | server_serve_expired_client_timeout | 334 server_ede_serve_expired | server_serve_original_ttl | server_fake_dsa | 335 server_log_identity | server_use_systemd | 336 server_response_ip_tag | server_response_ip | server_response_ip_data | 337 server_shm_enable | server_shm_key | server_fake_sha1 | 338 server_hide_trustanchor | server_trust_anchor_signaling | 339 server_root_key_sentinel | 340 server_ipsecmod_enabled | server_ipsecmod_hook | 341 server_ipsecmod_ignore_bogus | server_ipsecmod_max_ttl | 342 server_ipsecmod_whitelist | server_ipsecmod_strict | 343 server_udp_upstream_without_downstream | server_aggressive_nsec | 344 server_tls_cert_bundle | server_tls_additional_port | server_low_rtt | 345 server_fast_server_permil | server_fast_server_num | server_tls_win_cert | 346 server_tcp_connection_limit | server_log_servfail | server_deny_any | 347 server_unknown_server_time_limit | server_log_tag_queryreply | 348 server_discard_timeout | server_wait_limit | server_wait_limit_cookie | 349 server_wait_limit_netblock | server_wait_limit_cookie_netblock | 350 server_stream_wait_size | server_tls_ciphers | 351 server_tls_ciphersuites | server_tls_session_ticket_keys | 352 server_answer_cookie | server_cookie_secret | server_ip_ratelimit_cookie | 353 server_tls_use_sni | server_edns_client_string | server_tls_protocols | 354 server_edns_client_string_opcode | server_nsid | 355 server_zonemd_permissive_mode | server_max_reuse_tcp_queries | 356 server_tcp_reuse_timeout | server_tcp_auth_query_timeout | 357 server_quic_port | server_quic_size | 358 server_interface_automatic_ports | server_ede | 359 server_dns_error_reporting | 360 server_proxy_protocol_port | server_statistics_inhibit_zero | 361 server_harden_unknown_additional | server_disable_edns_do | 362 server_log_destaddr | server_cookie_secret_file | 363 server_iter_scrub_ns | server_iter_scrub_cname | server_max_global_quota | 364 server_val_validation_attempts | 365 server_val_hash_attempts | server_iter_scrub_rrsig | 366 server_harden_unverified_glue | server_log_time_iso | server_iter_scrub_promiscuous 367 ; 368 stub_clause: stubstart contents_stub 369 { 370 /* stub end */ 371 if(cfg_parser->cfg->stubs && 372 !cfg_parser->cfg->stubs->name) 373 yyerror("stub-zone without name"); 374 } 375 ; 376 stubstart: VAR_STUB_ZONE 377 { 378 struct config_stub* s; 379 OUTYY(("\nP(stub_zone:)\n")); 380 cfg_parser->started_toplevel = 1; 381 s = (struct config_stub*)calloc(1, sizeof(struct config_stub)); 382 if(s) { 383 s->next = cfg_parser->cfg->stubs; 384 cfg_parser->cfg->stubs = s; 385 } else { 386 yyerror("out of memory"); 387 } 388 } 389 ; 390 contents_stub: contents_stub content_stub 391 | ; 392 content_stub: stub_name | stub_host | stub_addr | stub_prime | stub_first | 393 stub_no_cache | stub_ssl_upstream | stub_tcp_upstream 394 ; 395 forward_clause: forwardstart contents_forward 396 { 397 /* forward end */ 398 if(cfg_parser->cfg->forwards && 399 !cfg_parser->cfg->forwards->name) 400 yyerror("forward-zone without name"); 401 } 402 ; 403 forwardstart: VAR_FORWARD_ZONE 404 { 405 struct config_stub* s; 406 OUTYY(("\nP(forward_zone:)\n")); 407 cfg_parser->started_toplevel = 1; 408 s = (struct config_stub*)calloc(1, sizeof(struct config_stub)); 409 if(s) { 410 s->next = cfg_parser->cfg->forwards; 411 cfg_parser->cfg->forwards = s; 412 } else { 413 yyerror("out of memory"); 414 } 415 } 416 ; 417 contents_forward: contents_forward content_forward 418 | ; 419 content_forward: forward_name | forward_host | forward_addr | forward_first | 420 forward_no_cache | forward_ssl_upstream | forward_tcp_upstream 421 ; 422 view_clause: viewstart contents_view 423 { 424 /* view end */ 425 if(cfg_parser->cfg->views && 426 !cfg_parser->cfg->views->name) 427 yyerror("view without name"); 428 } 429 ; 430 viewstart: VAR_VIEW 431 { 432 struct config_view* s; 433 OUTYY(("\nP(view:)\n")); 434 cfg_parser->started_toplevel = 1; 435 s = (struct config_view*)calloc(1, sizeof(struct config_view)); 436 if(s) { 437 s->next = cfg_parser->cfg->views; 438 cfg_parser->cfg->views = s; 439 } else { 440 yyerror("out of memory"); 441 } 442 } 443 ; 444 contents_view: contents_view content_view 445 | ; 446 content_view: view_name | view_local_zone | view_local_data | view_first | 447 view_response_ip | view_response_ip_data | view_local_data_ptr 448 ; 449 authstart: VAR_AUTH_ZONE 450 { 451 struct config_auth* s; 452 OUTYY(("\nP(auth_zone:)\n")); 453 cfg_parser->started_toplevel = 1; 454 s = (struct config_auth*)calloc(1, sizeof(struct config_auth)); 455 if(s) { 456 s->next = cfg_parser->cfg->auths; 457 cfg_parser->cfg->auths = s; 458 /* defaults for auth zone */ 459 s->for_downstream = 1; 460 s->for_upstream = 1; 461 s->fallback_enabled = 0; 462 s->zonemd_check = 0; 463 s->zonemd_reject_absence = 0; 464 s->isrpz = 0; 465 s->max_transfer_size = 0; 466 s->max_transfer_time = 0; 467 } else { 468 yyerror("out of memory"); 469 } 470 } 471 ; 472 contents_auth: contents_auth content_auth 473 | ; 474 content_auth: auth_name | auth_zonefile | auth_master | auth_url | 475 auth_for_downstream | auth_for_upstream | auth_fallback_enabled | 476 auth_allow_notify | auth_zonemd_check | auth_zonemd_reject_absence | 477 auth_max_transfer_size | auth_max_transfer_time 478 ; 479 480 rpz_tag: VAR_TAGS STRING_ARG 481 { 482 uint8_t* bitlist; 483 size_t len = 0; 484 OUTYY(("P(server_local_zone_tag:%s)\n", $2)); 485 bitlist = config_parse_taglist(cfg_parser->cfg, $2, 486 &len); 487 free($2); 488 if(!bitlist) { 489 yyerror("could not parse tags, (define-tag them first)"); 490 } 491 if(bitlist) { 492 cfg_parser->cfg->auths->rpz_taglist = bitlist; 493 cfg_parser->cfg->auths->rpz_taglistlen = len; 494 495 } 496 } 497 ; 498 499 rpz_action_override: VAR_RPZ_ACTION_OVERRIDE STRING_ARG 500 { 501 OUTYY(("P(rpz_action_override:%s)\n", $2)); 502 if(strcmp($2, "nxdomain")!=0 && strcmp($2, "nodata")!=0 && 503 strcmp($2, "passthru")!=0 && strcmp($2, "drop")!=0 && 504 strcmp($2, "cname")!=0 && strcmp($2, "disabled")!=0) { 505 yyerror("rpz-action-override action: expected nxdomain, " 506 "nodata, passthru, drop, cname or disabled"); 507 free($2); 508 cfg_parser->cfg->auths->rpz_action_override = NULL; 509 } 510 else { 511 cfg_parser->cfg->auths->rpz_action_override = $2; 512 } 513 } 514 ; 515 516 rpz_cname_override: VAR_RPZ_CNAME_OVERRIDE STRING_ARG 517 { 518 OUTYY(("P(rpz_cname_override:%s)\n", $2)); 519 free(cfg_parser->cfg->auths->rpz_cname); 520 cfg_parser->cfg->auths->rpz_cname = $2; 521 } 522 ; 523 524 rpz_log: VAR_RPZ_LOG STRING_ARG 525 { 526 OUTYY(("P(rpz_log:%s)\n", $2)); 527 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 528 yyerror("expected yes or no."); 529 else cfg_parser->cfg->auths->rpz_log = (strcmp($2, "yes")==0); 530 free($2); 531 } 532 ; 533 534 rpz_log_name: VAR_RPZ_LOG_NAME STRING_ARG 535 { 536 OUTYY(("P(rpz_log_name:%s)\n", $2)); 537 free(cfg_parser->cfg->auths->rpz_log_name); 538 cfg_parser->cfg->auths->rpz_log_name = $2; 539 } 540 ; 541 rpz_signal_nxdomain_ra: VAR_RPZ_SIGNAL_NXDOMAIN_RA STRING_ARG 542 { 543 OUTYY(("P(rpz_signal_nxdomain_ra:%s)\n", $2)); 544 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 545 yyerror("expected yes or no."); 546 else cfg_parser->cfg->auths->rpz_signal_nxdomain_ra = (strcmp($2, "yes")==0); 547 free($2); 548 } 549 ; 550 551 rpzstart: VAR_RPZ 552 { 553 struct config_auth* s; 554 OUTYY(("\nP(rpz:)\n")); 555 cfg_parser->started_toplevel = 1; 556 s = (struct config_auth*)calloc(1, sizeof(struct config_auth)); 557 if(s) { 558 s->next = cfg_parser->cfg->auths; 559 cfg_parser->cfg->auths = s; 560 /* defaults for RPZ auth zone */ 561 s->for_downstream = 0; 562 s->for_upstream = 0; 563 s->fallback_enabled = 0; 564 s->isrpz = 1; 565 s->max_transfer_size = 0; 566 s->max_transfer_time = 0; 567 } else { 568 yyerror("out of memory"); 569 } 570 } 571 ; 572 contents_rpz: contents_rpz content_rpz 573 | ; 574 content_rpz: auth_name | auth_zonefile | rpz_tag | auth_master | auth_url | 575 auth_allow_notify | rpz_action_override | rpz_cname_override | 576 rpz_log | rpz_log_name | rpz_signal_nxdomain_ra | auth_for_downstream | 577 auth_max_transfer_size | auth_max_transfer_time 578 ; 579 server_num_threads: VAR_NUM_THREADS STRING_ARG 580 { 581 OUTYY(("P(server_num_threads:%s)\n", $2)); 582 if(atoi($2) == 0 && strcmp($2, "0") != 0) 583 yyerror("number expected"); 584 else cfg_parser->cfg->num_threads = atoi($2); 585 free($2); 586 } 587 ; 588 server_verbosity: VAR_VERBOSITY STRING_ARG 589 { 590 OUTYY(("P(server_verbosity:%s)\n", $2)); 591 if(atoi($2) == 0 && strcmp($2, "0") != 0) 592 yyerror("number expected"); 593 else cfg_parser->cfg->verbosity = atoi($2); 594 free($2); 595 } 596 ; 597 server_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG 598 { 599 OUTYY(("P(server_statistics_interval:%s)\n", $2)); 600 if(strcmp($2, "") == 0 || strcmp($2, "0") == 0) 601 cfg_parser->cfg->stat_interval = 0; 602 else if(atoi($2) == 0) 603 yyerror("number expected"); 604 else cfg_parser->cfg->stat_interval = atoi($2); 605 free($2); 606 } 607 ; 608 server_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG 609 { 610 OUTYY(("P(server_statistics_cumulative:%s)\n", $2)); 611 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 612 yyerror("expected yes or no."); 613 else cfg_parser->cfg->stat_cumulative = (strcmp($2, "yes")==0); 614 free($2); 615 } 616 ; 617 server_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG 618 { 619 OUTYY(("P(server_extended_statistics:%s)\n", $2)); 620 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 621 yyerror("expected yes or no."); 622 else cfg_parser->cfg->stat_extended = (strcmp($2, "yes")==0); 623 free($2); 624 } 625 ; 626 server_statistics_inhibit_zero: VAR_STATISTICS_INHIBIT_ZERO STRING_ARG 627 { 628 OUTYY(("P(server_statistics_inhibit_zero:%s)\n", $2)); 629 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 630 yyerror("expected yes or no."); 631 else cfg_parser->cfg->stat_inhibit_zero = (strcmp($2, "yes")==0); 632 free($2); 633 } 634 ; 635 server_shm_enable: VAR_SHM_ENABLE STRING_ARG 636 { 637 OUTYY(("P(server_shm_enable:%s)\n", $2)); 638 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 639 yyerror("expected yes or no."); 640 else cfg_parser->cfg->shm_enable = (strcmp($2, "yes")==0); 641 free($2); 642 } 643 ; 644 server_shm_key: VAR_SHM_KEY STRING_ARG 645 { 646 OUTYY(("P(server_shm_key:%s)\n", $2)); 647 if(strcmp($2, "") == 0 || strcmp($2, "0") == 0) 648 cfg_parser->cfg->shm_key = 0; 649 else if(atoi($2) == 0) 650 yyerror("number expected"); 651 else cfg_parser->cfg->shm_key = atoi($2); 652 free($2); 653 } 654 ; 655 server_port: VAR_PORT STRING_ARG 656 { 657 OUTYY(("P(server_port:%s)\n", $2)); 658 if(atoi($2) == 0) 659 yyerror("port number expected"); 660 else cfg_parser->cfg->port = atoi($2); 661 free($2); 662 } 663 ; 664 server_send_client_subnet: VAR_SEND_CLIENT_SUBNET STRING_ARG 665 { 666 #ifdef CLIENT_SUBNET 667 OUTYY(("P(server_send_client_subnet:%s)\n", $2)); 668 if(!cfg_strlist_insert(&cfg_parser->cfg->client_subnet, $2)) 669 yyerror("out of memory"); 670 #else 671 OUTYY(("P(Compiled without edns subnet option, ignoring)\n")); 672 free($2); 673 #endif 674 } 675 ; 676 server_client_subnet_zone: VAR_CLIENT_SUBNET_ZONE STRING_ARG 677 { 678 #ifdef CLIENT_SUBNET 679 OUTYY(("P(server_client_subnet_zone:%s)\n", $2)); 680 if(!cfg_strlist_insert(&cfg_parser->cfg->client_subnet_zone, 681 $2)) 682 yyerror("out of memory"); 683 #else 684 OUTYY(("P(Compiled without edns subnet option, ignoring)\n")); 685 free($2); 686 #endif 687 } 688 ; 689 server_client_subnet_always_forward: 690 VAR_CLIENT_SUBNET_ALWAYS_FORWARD STRING_ARG 691 { 692 #ifdef CLIENT_SUBNET 693 OUTYY(("P(server_client_subnet_always_forward:%s)\n", $2)); 694 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 695 yyerror("expected yes or no."); 696 else 697 cfg_parser->cfg->client_subnet_always_forward = 698 (strcmp($2, "yes")==0); 699 #else 700 OUTYY(("P(Compiled without edns subnet option, ignoring)\n")); 701 #endif 702 free($2); 703 } 704 ; 705 server_client_subnet_opcode: VAR_CLIENT_SUBNET_OPCODE STRING_ARG 706 { 707 #ifdef CLIENT_SUBNET 708 OUTYY(("P(client_subnet_opcode:%s)\n", $2)); 709 OUTYY(("P(Deprecated option, ignoring)\n")); 710 #else 711 OUTYY(("P(Compiled without edns subnet option, ignoring)\n")); 712 #endif 713 free($2); 714 } 715 ; 716 server_max_client_subnet_ipv4: VAR_MAX_CLIENT_SUBNET_IPV4 STRING_ARG 717 { 718 #ifdef CLIENT_SUBNET 719 OUTYY(("P(max_client_subnet_ipv4:%s)\n", $2)); 720 if(atoi($2) == 0 && strcmp($2, "0") != 0) 721 yyerror("IPv4 subnet length expected"); 722 else if (atoi($2) > 32) 723 cfg_parser->cfg->max_client_subnet_ipv4 = 32; 724 else if (atoi($2) < 0) 725 cfg_parser->cfg->max_client_subnet_ipv4 = 0; 726 else cfg_parser->cfg->max_client_subnet_ipv4 = (uint8_t)atoi($2); 727 #else 728 OUTYY(("P(Compiled without edns subnet option, ignoring)\n")); 729 #endif 730 free($2); 731 } 732 ; 733 server_max_client_subnet_ipv6: VAR_MAX_CLIENT_SUBNET_IPV6 STRING_ARG 734 { 735 #ifdef CLIENT_SUBNET 736 OUTYY(("P(max_client_subnet_ipv6:%s)\n", $2)); 737 if(atoi($2) == 0 && strcmp($2, "0") != 0) 738 yyerror("Ipv6 subnet length expected"); 739 else if (atoi($2) > 128) 740 cfg_parser->cfg->max_client_subnet_ipv6 = 128; 741 else if (atoi($2) < 0) 742 cfg_parser->cfg->max_client_subnet_ipv6 = 0; 743 else cfg_parser->cfg->max_client_subnet_ipv6 = (uint8_t)atoi($2); 744 #else 745 OUTYY(("P(Compiled without edns subnet option, ignoring)\n")); 746 #endif 747 free($2); 748 } 749 ; 750 server_min_client_subnet_ipv4: VAR_MIN_CLIENT_SUBNET_IPV4 STRING_ARG 751 { 752 #ifdef CLIENT_SUBNET 753 OUTYY(("P(min_client_subnet_ipv4:%s)\n", $2)); 754 if(atoi($2) == 0 && strcmp($2, "0") != 0) 755 yyerror("IPv4 subnet length expected"); 756 else if (atoi($2) > 32) 757 cfg_parser->cfg->min_client_subnet_ipv4 = 32; 758 else if (atoi($2) < 0) 759 cfg_parser->cfg->min_client_subnet_ipv4 = 0; 760 else cfg_parser->cfg->min_client_subnet_ipv4 = (uint8_t)atoi($2); 761 #else 762 OUTYY(("P(Compiled without edns subnet option, ignoring)\n")); 763 #endif 764 free($2); 765 } 766 ; 767 server_min_client_subnet_ipv6: VAR_MIN_CLIENT_SUBNET_IPV6 STRING_ARG 768 { 769 #ifdef CLIENT_SUBNET 770 OUTYY(("P(min_client_subnet_ipv6:%s)\n", $2)); 771 if(atoi($2) == 0 && strcmp($2, "0") != 0) 772 yyerror("Ipv6 subnet length expected"); 773 else if (atoi($2) > 128) 774 cfg_parser->cfg->min_client_subnet_ipv6 = 128; 775 else if (atoi($2) < 0) 776 cfg_parser->cfg->min_client_subnet_ipv6 = 0; 777 else cfg_parser->cfg->min_client_subnet_ipv6 = (uint8_t)atoi($2); 778 #else 779 OUTYY(("P(Compiled without edns subnet option, ignoring)\n")); 780 #endif 781 free($2); 782 } 783 ; 784 server_max_ecs_tree_size_ipv4: VAR_MAX_ECS_TREE_SIZE_IPV4 STRING_ARG 785 { 786 #ifdef CLIENT_SUBNET 787 OUTYY(("P(max_ecs_tree_size_ipv4:%s)\n", $2)); 788 if(atoi($2) == 0 && strcmp($2, "0") != 0) 789 yyerror("IPv4 ECS tree size expected"); 790 else if (atoi($2) < 0) 791 cfg_parser->cfg->max_ecs_tree_size_ipv4 = 0; 792 else cfg_parser->cfg->max_ecs_tree_size_ipv4 = (uint32_t)atoi($2); 793 #else 794 OUTYY(("P(Compiled without edns subnet option, ignoring)\n")); 795 #endif 796 free($2); 797 } 798 ; 799 server_max_ecs_tree_size_ipv6: VAR_MAX_ECS_TREE_SIZE_IPV6 STRING_ARG 800 { 801 #ifdef CLIENT_SUBNET 802 OUTYY(("P(max_ecs_tree_size_ipv6:%s)\n", $2)); 803 if(atoi($2) == 0 && strcmp($2, "0") != 0) 804 yyerror("IPv6 ECS tree size expected"); 805 else if (atoi($2) < 0) 806 cfg_parser->cfg->max_ecs_tree_size_ipv6 = 0; 807 else cfg_parser->cfg->max_ecs_tree_size_ipv6 = (uint32_t)atoi($2); 808 #else 809 OUTYY(("P(Compiled without edns subnet option, ignoring)\n")); 810 #endif 811 free($2); 812 } 813 ; 814 server_interface: VAR_INTERFACE STRING_ARG 815 { 816 OUTYY(("P(server_interface:%s)\n", $2)); 817 if(cfg_parser->cfg->num_ifs == 0) 818 cfg_parser->cfg->ifs = calloc(1, sizeof(char*)); 819 else cfg_parser->cfg->ifs = realloc(cfg_parser->cfg->ifs, 820 (cfg_parser->cfg->num_ifs+1)*sizeof(char*)); 821 if(!cfg_parser->cfg->ifs) 822 yyerror("out of memory"); 823 else 824 cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = $2; 825 } 826 ; 827 server_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG 828 { 829 OUTYY(("P(server_outgoing_interface:%s)\n", $2)); 830 if(cfg_parser->cfg->num_out_ifs == 0) 831 cfg_parser->cfg->out_ifs = calloc(1, sizeof(char*)); 832 else cfg_parser->cfg->out_ifs = realloc( 833 cfg_parser->cfg->out_ifs, 834 (cfg_parser->cfg->num_out_ifs+1)*sizeof(char*)); 835 if(!cfg_parser->cfg->out_ifs) 836 yyerror("out of memory"); 837 else 838 cfg_parser->cfg->out_ifs[ 839 cfg_parser->cfg->num_out_ifs++] = $2; 840 } 841 ; 842 server_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG 843 { 844 OUTYY(("P(server_outgoing_range:%s)\n", $2)); 845 if(atoi($2) == 0) 846 yyerror("number expected"); 847 else cfg_parser->cfg->outgoing_num_ports = atoi($2); 848 free($2); 849 } 850 ; 851 server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG 852 { 853 OUTYY(("P(server_outgoing_port_permit:%s)\n", $2)); 854 if(!cfg_mark_ports($2, 1, 855 cfg_parser->cfg->outgoing_avail_ports, 65536)) 856 yyerror("port number or range (\"low-high\") expected"); 857 free($2); 858 } 859 ; 860 server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG 861 { 862 OUTYY(("P(server_outgoing_port_avoid:%s)\n", $2)); 863 if(!cfg_mark_ports($2, 0, 864 cfg_parser->cfg->outgoing_avail_ports, 65536)) 865 yyerror("port number or range (\"low-high\") expected"); 866 free($2); 867 } 868 ; 869 server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG 870 { 871 OUTYY(("P(server_outgoing_num_tcp:%s)\n", $2)); 872 if(atoi($2) == 0 && strcmp($2, "0") != 0) 873 yyerror("number expected"); 874 else cfg_parser->cfg->outgoing_num_tcp = atoi($2); 875 free($2); 876 } 877 ; 878 server_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG 879 { 880 OUTYY(("P(server_incoming_num_tcp:%s)\n", $2)); 881 if(atoi($2) == 0 && strcmp($2, "0") != 0) 882 yyerror("number expected"); 883 else cfg_parser->cfg->incoming_num_tcp = atoi($2); 884 free($2); 885 } 886 ; 887 server_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG 888 { 889 OUTYY(("P(server_interface_automatic:%s)\n", $2)); 890 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 891 yyerror("expected yes or no."); 892 else cfg_parser->cfg->if_automatic = (strcmp($2, "yes")==0); 893 free($2); 894 } 895 ; 896 server_interface_automatic_ports: VAR_INTERFACE_AUTOMATIC_PORTS STRING_ARG 897 { 898 OUTYY(("P(server_interface_automatic_ports:%s)\n", $2)); 899 free(cfg_parser->cfg->if_automatic_ports); 900 cfg_parser->cfg->if_automatic_ports = $2; 901 } 902 ; 903 server_do_ip4: VAR_DO_IP4 STRING_ARG 904 { 905 OUTYY(("P(server_do_ip4:%s)\n", $2)); 906 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 907 yyerror("expected yes or no."); 908 else cfg_parser->cfg->do_ip4 = (strcmp($2, "yes")==0); 909 free($2); 910 } 911 ; 912 server_do_ip6: VAR_DO_IP6 STRING_ARG 913 { 914 OUTYY(("P(server_do_ip6:%s)\n", $2)); 915 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 916 yyerror("expected yes or no."); 917 else cfg_parser->cfg->do_ip6 = (strcmp($2, "yes")==0); 918 free($2); 919 } 920 ; 921 server_do_nat64: VAR_DO_NAT64 STRING_ARG 922 { 923 OUTYY(("P(server_do_nat64:%s)\n", $2)); 924 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 925 yyerror("expected yes or no."); 926 else cfg_parser->cfg->do_nat64 = (strcmp($2, "yes")==0); 927 free($2); 928 } 929 ; 930 server_do_udp: VAR_DO_UDP STRING_ARG 931 { 932 OUTYY(("P(server_do_udp:%s)\n", $2)); 933 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 934 yyerror("expected yes or no."); 935 else cfg_parser->cfg->do_udp = (strcmp($2, "yes")==0); 936 free($2); 937 } 938 ; 939 server_do_tcp: VAR_DO_TCP STRING_ARG 940 { 941 OUTYY(("P(server_do_tcp:%s)\n", $2)); 942 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 943 yyerror("expected yes or no."); 944 else cfg_parser->cfg->do_tcp = (strcmp($2, "yes")==0); 945 free($2); 946 } 947 ; 948 server_prefer_ip4: VAR_PREFER_IP4 STRING_ARG 949 { 950 OUTYY(("P(server_prefer_ip4:%s)\n", $2)); 951 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 952 yyerror("expected yes or no."); 953 else cfg_parser->cfg->prefer_ip4 = (strcmp($2, "yes")==0); 954 free($2); 955 } 956 ; 957 server_prefer_ip6: VAR_PREFER_IP6 STRING_ARG 958 { 959 OUTYY(("P(server_prefer_ip6:%s)\n", $2)); 960 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 961 yyerror("expected yes or no."); 962 else cfg_parser->cfg->prefer_ip6 = (strcmp($2, "yes")==0); 963 free($2); 964 } 965 ; 966 server_tcp_mss: VAR_TCP_MSS STRING_ARG 967 { 968 OUTYY(("P(server_tcp_mss:%s)\n", $2)); 969 if(atoi($2) == 0 && strcmp($2, "0") != 0) 970 yyerror("number expected"); 971 else cfg_parser->cfg->tcp_mss = atoi($2); 972 free($2); 973 } 974 ; 975 server_outgoing_tcp_mss: VAR_OUTGOING_TCP_MSS STRING_ARG 976 { 977 OUTYY(("P(server_outgoing_tcp_mss:%s)\n", $2)); 978 if(atoi($2) == 0 && strcmp($2, "0") != 0) 979 yyerror("number expected"); 980 else cfg_parser->cfg->outgoing_tcp_mss = atoi($2); 981 free($2); 982 } 983 ; 984 server_tcp_idle_timeout: VAR_TCP_IDLE_TIMEOUT STRING_ARG 985 { 986 OUTYY(("P(server_tcp_idle_timeout:%s)\n", $2)); 987 if(atoi($2) == 0 && strcmp($2, "0") != 0) 988 yyerror("number expected"); 989 else if (atoi($2) > 120000) 990 cfg_parser->cfg->tcp_idle_timeout = 120000; 991 else if (atoi($2) < 1) 992 cfg_parser->cfg->tcp_idle_timeout = 1; 993 else cfg_parser->cfg->tcp_idle_timeout = atoi($2); 994 free($2); 995 } 996 ; 997 server_max_reuse_tcp_queries: VAR_MAX_REUSE_TCP_QUERIES STRING_ARG 998 { 999 OUTYY(("P(server_max_reuse_tcp_queries:%s)\n", $2)); 1000 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1001 yyerror("number expected"); 1002 else if (atoi($2) < 1) 1003 cfg_parser->cfg->max_reuse_tcp_queries = 0; 1004 else cfg_parser->cfg->max_reuse_tcp_queries = atoi($2); 1005 free($2); 1006 } 1007 ; 1008 server_tcp_reuse_timeout: VAR_TCP_REUSE_TIMEOUT STRING_ARG 1009 { 1010 OUTYY(("P(server_tcp_reuse_timeout:%s)\n", $2)); 1011 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1012 yyerror("number expected"); 1013 else if (atoi($2) < 1) 1014 cfg_parser->cfg->tcp_reuse_timeout = 0; 1015 else cfg_parser->cfg->tcp_reuse_timeout = atoi($2); 1016 free($2); 1017 } 1018 ; 1019 server_tcp_auth_query_timeout: VAR_TCP_AUTH_QUERY_TIMEOUT STRING_ARG 1020 { 1021 OUTYY(("P(server_tcp_auth_query_timeout:%s)\n", $2)); 1022 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1023 yyerror("number expected"); 1024 else if (atoi($2) < 1) 1025 cfg_parser->cfg->tcp_auth_query_timeout = 0; 1026 else cfg_parser->cfg->tcp_auth_query_timeout = atoi($2); 1027 free($2); 1028 } 1029 ; 1030 server_tcp_keepalive: VAR_EDNS_TCP_KEEPALIVE STRING_ARG 1031 { 1032 OUTYY(("P(server_tcp_keepalive:%s)\n", $2)); 1033 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1034 yyerror("expected yes or no."); 1035 else cfg_parser->cfg->do_tcp_keepalive = (strcmp($2, "yes")==0); 1036 free($2); 1037 } 1038 ; 1039 server_tcp_keepalive_timeout: VAR_EDNS_TCP_KEEPALIVE_TIMEOUT STRING_ARG 1040 { 1041 OUTYY(("P(server_tcp_keepalive_timeout:%s)\n", $2)); 1042 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1043 yyerror("number expected"); 1044 else if (atoi($2) > 6553500) 1045 cfg_parser->cfg->tcp_keepalive_timeout = 6553500; 1046 else if (atoi($2) < 1) 1047 cfg_parser->cfg->tcp_keepalive_timeout = 0; 1048 else cfg_parser->cfg->tcp_keepalive_timeout = atoi($2); 1049 free($2); 1050 } 1051 ; 1052 server_sock_queue_timeout: VAR_SOCK_QUEUE_TIMEOUT STRING_ARG 1053 { 1054 OUTYY(("P(server_sock_queue_timeout:%s)\n", $2)); 1055 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1056 yyerror("number expected"); 1057 else if (atoi($2) > 6553500) 1058 cfg_parser->cfg->sock_queue_timeout = 6553500; 1059 else if (atoi($2) < 1) 1060 cfg_parser->cfg->sock_queue_timeout = 0; 1061 else cfg_parser->cfg->sock_queue_timeout = atoi($2); 1062 free($2); 1063 } 1064 ; 1065 server_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG 1066 { 1067 OUTYY(("P(server_tcp_upstream:%s)\n", $2)); 1068 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1069 yyerror("expected yes or no."); 1070 else cfg_parser->cfg->tcp_upstream = (strcmp($2, "yes")==0); 1071 free($2); 1072 } 1073 ; 1074 server_udp_upstream_without_downstream: VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM STRING_ARG 1075 { 1076 OUTYY(("P(server_udp_upstream_without_downstream:%s)\n", $2)); 1077 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1078 yyerror("expected yes or no."); 1079 else cfg_parser->cfg->udp_upstream_without_downstream = (strcmp($2, "yes")==0); 1080 free($2); 1081 } 1082 ; 1083 server_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG 1084 { 1085 OUTYY(("P(server_ssl_upstream:%s)\n", $2)); 1086 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1087 yyerror("expected yes or no."); 1088 else cfg_parser->cfg->ssl_upstream = (strcmp($2, "yes")==0); 1089 free($2); 1090 } 1091 ; 1092 server_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG 1093 { 1094 OUTYY(("P(server_ssl_service_key:%s)\n", $2)); 1095 free(cfg_parser->cfg->ssl_service_key); 1096 cfg_parser->cfg->ssl_service_key = $2; 1097 } 1098 ; 1099 server_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG 1100 { 1101 OUTYY(("P(server_ssl_service_pem:%s)\n", $2)); 1102 free(cfg_parser->cfg->ssl_service_pem); 1103 cfg_parser->cfg->ssl_service_pem = $2; 1104 } 1105 ; 1106 server_ssl_port: VAR_SSL_PORT STRING_ARG 1107 { 1108 OUTYY(("P(server_ssl_port:%s)\n", $2)); 1109 if(atoi($2) == 0) 1110 yyerror("port number expected"); 1111 else cfg_parser->cfg->ssl_port = atoi($2); 1112 free($2); 1113 } 1114 ; 1115 server_tls_cert_bundle: VAR_TLS_CERT_BUNDLE STRING_ARG 1116 { 1117 OUTYY(("P(server_tls_cert_bundle:%s)\n", $2)); 1118 free(cfg_parser->cfg->tls_cert_bundle); 1119 cfg_parser->cfg->tls_cert_bundle = $2; 1120 } 1121 ; 1122 server_tls_win_cert: VAR_TLS_WIN_CERT STRING_ARG 1123 { 1124 OUTYY(("P(server_tls_win_cert:%s)\n", $2)); 1125 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1126 yyerror("expected yes or no."); 1127 else cfg_parser->cfg->tls_win_cert = (strcmp($2, "yes")==0); 1128 free($2); 1129 } 1130 ; 1131 server_tls_additional_port: VAR_TLS_ADDITIONAL_PORT STRING_ARG 1132 { 1133 OUTYY(("P(server_tls_additional_port:%s)\n", $2)); 1134 if(!cfg_strlist_insert(&cfg_parser->cfg->tls_additional_port, 1135 $2)) 1136 yyerror("out of memory"); 1137 } 1138 ; 1139 server_tls_ciphers: VAR_TLS_CIPHERS STRING_ARG 1140 { 1141 OUTYY(("P(server_tls_ciphers:%s)\n", $2)); 1142 free(cfg_parser->cfg->tls_ciphers); 1143 cfg_parser->cfg->tls_ciphers = $2; 1144 } 1145 ; 1146 server_tls_ciphersuites: VAR_TLS_CIPHERSUITES STRING_ARG 1147 { 1148 OUTYY(("P(server_tls_ciphersuites:%s)\n", $2)); 1149 free(cfg_parser->cfg->tls_ciphersuites); 1150 cfg_parser->cfg->tls_ciphersuites = $2; 1151 } 1152 ; 1153 server_tls_session_ticket_keys: VAR_TLS_SESSION_TICKET_KEYS STRING_ARG 1154 { 1155 OUTYY(("P(server_tls_session_ticket_keys:%s)\n", $2)); 1156 if(!cfg_strlist_append(&cfg_parser->cfg->tls_session_ticket_keys, 1157 $2)) 1158 yyerror("out of memory"); 1159 } 1160 ; 1161 server_tls_use_sni: VAR_TLS_USE_SNI STRING_ARG 1162 { 1163 OUTYY(("P(server_tls_use_sni:%s)\n", $2)); 1164 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1165 yyerror("expected yes or no."); 1166 else cfg_parser->cfg->tls_use_sni = (strcmp($2, "yes")==0); 1167 free($2); 1168 } 1169 ; 1170 server_tls_protocols: VAR_TLS_PROTOCOLS STRING_ARG 1171 { 1172 OUTYY(("P(server_tls_protocols:%s)\n", $2)); 1173 if(!cfg_tls_protocols_is_valid($2)) 1174 yyerror("tls-protocols: valid values are 'TLSv1.2' and 'TLSv1.3'."); 1175 free(cfg_parser->cfg->tls_protocols); 1176 cfg_parser->cfg->tls_protocols = $2; 1177 } 1178 ; 1179 server_https_port: VAR_HTTPS_PORT STRING_ARG 1180 { 1181 OUTYY(("P(server_https_port:%s)\n", $2)); 1182 if(atoi($2) == 0) 1183 yyerror("port number expected"); 1184 else cfg_parser->cfg->https_port = atoi($2); 1185 free($2); 1186 }; 1187 server_http_endpoint: VAR_HTTP_ENDPOINT STRING_ARG 1188 { 1189 OUTYY(("P(server_http_endpoint:%s)\n", $2)); 1190 free(cfg_parser->cfg->http_endpoint); 1191 if($2 && $2[0] != '/') { 1192 cfg_parser->cfg->http_endpoint = malloc(strlen($2)+2); 1193 if(cfg_parser->cfg->http_endpoint) { 1194 cfg_parser->cfg->http_endpoint[0] = '/'; 1195 memmove(cfg_parser->cfg->http_endpoint+1, $2, 1196 strlen($2)+1); 1197 } else { 1198 yyerror("out of memory"); 1199 } 1200 free($2); 1201 } else { 1202 cfg_parser->cfg->http_endpoint = $2; 1203 } 1204 }; 1205 server_http_max_streams: VAR_HTTP_MAX_STREAMS STRING_ARG 1206 { 1207 OUTYY(("P(server_http_max_streams:%s)\n", $2)); 1208 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1209 yyerror("number expected"); 1210 else cfg_parser->cfg->http_max_streams = atoi($2); 1211 free($2); 1212 }; 1213 server_http_query_buffer_size: VAR_HTTP_QUERY_BUFFER_SIZE STRING_ARG 1214 { 1215 OUTYY(("P(server_http_query_buffer_size:%s)\n", $2)); 1216 if(!cfg_parse_memsize($2, 1217 &cfg_parser->cfg->http_query_buffer_size)) 1218 yyerror("memory size expected"); 1219 free($2); 1220 }; 1221 server_http_response_buffer_size: VAR_HTTP_RESPONSE_BUFFER_SIZE STRING_ARG 1222 { 1223 OUTYY(("P(server_http_response_buffer_size:%s)\n", $2)); 1224 if(!cfg_parse_memsize($2, 1225 &cfg_parser->cfg->http_response_buffer_size)) 1226 yyerror("memory size expected"); 1227 free($2); 1228 }; 1229 server_http_nodelay: VAR_HTTP_NODELAY STRING_ARG 1230 { 1231 OUTYY(("P(server_http_nodelay:%s)\n", $2)); 1232 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1233 yyerror("expected yes or no."); 1234 else cfg_parser->cfg->http_nodelay = (strcmp($2, "yes")==0); 1235 free($2); 1236 }; 1237 server_http_notls_downstream: VAR_HTTP_NOTLS_DOWNSTREAM STRING_ARG 1238 { 1239 OUTYY(("P(server_http_notls_downstream:%s)\n", $2)); 1240 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1241 yyerror("expected yes or no."); 1242 else cfg_parser->cfg->http_notls_downstream = (strcmp($2, "yes")==0); 1243 free($2); 1244 }; 1245 server_quic_port: VAR_QUIC_PORT STRING_ARG 1246 { 1247 OUTYY(("P(server_quic_port:%s)\n", $2)); 1248 if(atoi($2) == 0 && strcmp($2,"0")!=0) 1249 yyerror("port number expected"); 1250 else { 1251 cfg_parser->cfg->quic_port = atoi($2); 1252 #ifndef HAVE_NGTCP2 1253 if (cfg_parser->cfg->quic_port != 0) 1254 log_warn("%s:%d: Unbound is not compiled with " 1255 "ngtcp2. This is required to use DNS " 1256 "over QUIC.", cfg_parser->filename, cfg_parser->line); 1257 #endif 1258 } 1259 free($2); 1260 }; 1261 server_quic_size: VAR_QUIC_SIZE STRING_ARG 1262 { 1263 OUTYY(("P(server_quic_size:%s)\n", $2)); 1264 if(!cfg_parse_memsize($2, &cfg_parser->cfg->quic_size)) 1265 yyerror("memory size expected"); 1266 free($2); 1267 }; 1268 server_use_systemd: VAR_USE_SYSTEMD STRING_ARG 1269 { 1270 OUTYY(("P(server_use_systemd:%s)\n", $2)); 1271 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1272 yyerror("expected yes or no."); 1273 else cfg_parser->cfg->use_systemd = (strcmp($2, "yes")==0); 1274 free($2); 1275 } 1276 ; 1277 server_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG 1278 { 1279 OUTYY(("P(server_do_daemonize:%s)\n", $2)); 1280 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1281 yyerror("expected yes or no."); 1282 else cfg_parser->cfg->do_daemonize = (strcmp($2, "yes")==0); 1283 free($2); 1284 } 1285 ; 1286 server_use_syslog: VAR_USE_SYSLOG STRING_ARG 1287 { 1288 OUTYY(("P(server_use_syslog:%s)\n", $2)); 1289 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1290 yyerror("expected yes or no."); 1291 else cfg_parser->cfg->use_syslog = (strcmp($2, "yes")==0); 1292 #if !defined(HAVE_SYSLOG_H) && !defined(UB_ON_WINDOWS) 1293 if(strcmp($2, "yes") == 0) 1294 yyerror("no syslog services are available. " 1295 "(reconfigure and compile to add)"); 1296 #endif 1297 free($2); 1298 } 1299 ; 1300 server_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG 1301 { 1302 OUTYY(("P(server_log_time_ascii:%s)\n", $2)); 1303 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1304 yyerror("expected yes or no."); 1305 else cfg_parser->cfg->log_time_ascii = (strcmp($2, "yes")==0); 1306 free($2); 1307 } 1308 ; 1309 server_log_time_iso: VAR_LOG_TIME_ISO STRING_ARG 1310 { 1311 OUTYY(("P(server_log_time_iso:%s)\n", $2)); 1312 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1313 yyerror("expected yes or no."); 1314 else cfg_parser->cfg->log_time_iso = (strcmp($2, "yes")==0); 1315 free($2); 1316 } 1317 ; 1318 server_log_queries: VAR_LOG_QUERIES STRING_ARG 1319 { 1320 OUTYY(("P(server_log_queries:%s)\n", $2)); 1321 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1322 yyerror("expected yes or no."); 1323 else cfg_parser->cfg->log_queries = (strcmp($2, "yes")==0); 1324 free($2); 1325 } 1326 ; 1327 server_log_replies: VAR_LOG_REPLIES STRING_ARG 1328 { 1329 OUTYY(("P(server_log_replies:%s)\n", $2)); 1330 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1331 yyerror("expected yes or no."); 1332 else cfg_parser->cfg->log_replies = (strcmp($2, "yes")==0); 1333 free($2); 1334 } 1335 ; 1336 server_log_tag_queryreply: VAR_LOG_TAG_QUERYREPLY STRING_ARG 1337 { 1338 OUTYY(("P(server_log_tag_queryreply:%s)\n", $2)); 1339 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1340 yyerror("expected yes or no."); 1341 else cfg_parser->cfg->log_tag_queryreply = (strcmp($2, "yes")==0); 1342 free($2); 1343 } 1344 ; 1345 server_log_servfail: VAR_LOG_SERVFAIL STRING_ARG 1346 { 1347 OUTYY(("P(server_log_servfail:%s)\n", $2)); 1348 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1349 yyerror("expected yes or no."); 1350 else cfg_parser->cfg->log_servfail = (strcmp($2, "yes")==0); 1351 free($2); 1352 } 1353 ; 1354 server_log_destaddr: VAR_LOG_DESTADDR STRING_ARG 1355 { 1356 OUTYY(("P(server_log_destaddr:%s)\n", $2)); 1357 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1358 yyerror("expected yes or no."); 1359 else cfg_parser->cfg->log_destaddr = (strcmp($2, "yes")==0); 1360 free($2); 1361 } 1362 ; 1363 server_log_thread_id: VAR_LOG_THREAD_ID STRING_ARG 1364 { 1365 OUTYY(("P(server_log_thread_id:%s)\n", $2)); 1366 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1367 yyerror("expected yes or no."); 1368 else cfg_parser->cfg->log_thread_id = (strcmp($2, "yes")==0); 1369 free($2); 1370 } 1371 ; 1372 server_log_local_actions: VAR_LOG_LOCAL_ACTIONS STRING_ARG 1373 { 1374 OUTYY(("P(server_log_local_actions:%s)\n", $2)); 1375 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1376 yyerror("expected yes or no."); 1377 else cfg_parser->cfg->log_local_actions = (strcmp($2, "yes")==0); 1378 free($2); 1379 } 1380 ; 1381 server_chroot: VAR_CHROOT STRING_ARG 1382 { 1383 OUTYY(("P(server_chroot:%s)\n", $2)); 1384 free(cfg_parser->cfg->chrootdir); 1385 cfg_parser->cfg->chrootdir = $2; 1386 } 1387 ; 1388 server_username: VAR_USERNAME STRING_ARG 1389 { 1390 OUTYY(("P(server_username:%s)\n", $2)); 1391 free(cfg_parser->cfg->username); 1392 cfg_parser->cfg->username = $2; 1393 } 1394 ; 1395 server_directory: VAR_DIRECTORY STRING_ARG 1396 { 1397 OUTYY(("P(server_directory:%s)\n", $2)); 1398 free(cfg_parser->cfg->directory); 1399 cfg_parser->cfg->directory = $2; 1400 /* change there right away for includes relative to this */ 1401 if($2[0]) { 1402 char* d; 1403 #ifdef UB_ON_WINDOWS 1404 w_config_adjust_directory(cfg_parser->cfg); 1405 #endif 1406 d = cfg_parser->cfg->directory; 1407 /* adjust directory if we have already chroot, 1408 * like, we reread after sighup */ 1409 if(cfg_parser->chroot && cfg_parser->chroot[0] && 1410 strncmp(d, cfg_parser->chroot, strlen( 1411 cfg_parser->chroot)) == 0) 1412 d += strlen(cfg_parser->chroot); 1413 if(d[0]) { 1414 if(chdir(d)) 1415 log_err("cannot chdir to directory: %s (%s)", 1416 d, strerror(errno)); 1417 } 1418 } 1419 } 1420 ; 1421 server_logfile: VAR_LOGFILE STRING_ARG 1422 { 1423 OUTYY(("P(server_logfile:%s)\n", $2)); 1424 free(cfg_parser->cfg->logfile); 1425 cfg_parser->cfg->logfile = $2; 1426 cfg_parser->cfg->use_syslog = 0; 1427 } 1428 ; 1429 server_pidfile: VAR_PIDFILE STRING_ARG 1430 { 1431 OUTYY(("P(server_pidfile:%s)\n", $2)); 1432 free(cfg_parser->cfg->pidfile); 1433 cfg_parser->cfg->pidfile = $2; 1434 } 1435 ; 1436 server_root_hints: VAR_ROOT_HINTS STRING_ARG 1437 { 1438 OUTYY(("P(server_root_hints:%s)\n", $2)); 1439 if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, $2)) 1440 yyerror("out of memory"); 1441 } 1442 ; 1443 server_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG 1444 { 1445 OUTYY(("P(server_dlv_anchor_file:%s)\n", $2)); 1446 log_warn("option dlv-anchor-file ignored: DLV is decommissioned"); 1447 free($2); 1448 } 1449 ; 1450 server_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG 1451 { 1452 OUTYY(("P(server_dlv_anchor:%s)\n", $2)); 1453 log_warn("option dlv-anchor ignored: DLV is decommissioned"); 1454 free($2); 1455 } 1456 ; 1457 server_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG 1458 { 1459 OUTYY(("P(server_auto_trust_anchor_file:%s)\n", $2)); 1460 if(!cfg_strlist_insert(&cfg_parser->cfg-> 1461 auto_trust_anchor_file_list, $2)) 1462 yyerror("out of memory"); 1463 } 1464 ; 1465 server_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG 1466 { 1467 OUTYY(("P(server_trust_anchor_file:%s)\n", $2)); 1468 if(!cfg_strlist_insert(&cfg_parser->cfg-> 1469 trust_anchor_file_list, $2)) 1470 yyerror("out of memory"); 1471 } 1472 ; 1473 server_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG 1474 { 1475 OUTYY(("P(server_trusted_keys_file:%s)\n", $2)); 1476 if(!cfg_strlist_insert(&cfg_parser->cfg-> 1477 trusted_keys_file_list, $2)) 1478 yyerror("out of memory"); 1479 } 1480 ; 1481 server_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG 1482 { 1483 OUTYY(("P(server_trust_anchor:%s)\n", $2)); 1484 if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, $2)) 1485 yyerror("out of memory"); 1486 } 1487 ; 1488 server_trust_anchor_signaling: VAR_TRUST_ANCHOR_SIGNALING STRING_ARG 1489 { 1490 OUTYY(("P(server_trust_anchor_signaling:%s)\n", $2)); 1491 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1492 yyerror("expected yes or no."); 1493 else 1494 cfg_parser->cfg->trust_anchor_signaling = 1495 (strcmp($2, "yes")==0); 1496 free($2); 1497 } 1498 ; 1499 server_root_key_sentinel: VAR_ROOT_KEY_SENTINEL STRING_ARG 1500 { 1501 OUTYY(("P(server_root_key_sentinel:%s)\n", $2)); 1502 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1503 yyerror("expected yes or no."); 1504 else 1505 cfg_parser->cfg->root_key_sentinel = 1506 (strcmp($2, "yes")==0); 1507 free($2); 1508 } 1509 ; 1510 server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG 1511 { 1512 OUTYY(("P(server_domain_insecure:%s)\n", $2)); 1513 if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, $2)) 1514 yyerror("out of memory"); 1515 } 1516 ; 1517 server_hide_identity: VAR_HIDE_IDENTITY STRING_ARG 1518 { 1519 OUTYY(("P(server_hide_identity:%s)\n", $2)); 1520 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1521 yyerror("expected yes or no."); 1522 else cfg_parser->cfg->hide_identity = (strcmp($2, "yes")==0); 1523 free($2); 1524 } 1525 ; 1526 server_hide_version: VAR_HIDE_VERSION STRING_ARG 1527 { 1528 OUTYY(("P(server_hide_version:%s)\n", $2)); 1529 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1530 yyerror("expected yes or no."); 1531 else cfg_parser->cfg->hide_version = (strcmp($2, "yes")==0); 1532 free($2); 1533 } 1534 ; 1535 server_hide_trustanchor: VAR_HIDE_TRUSTANCHOR STRING_ARG 1536 { 1537 OUTYY(("P(server_hide_trustanchor:%s)\n", $2)); 1538 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1539 yyerror("expected yes or no."); 1540 else cfg_parser->cfg->hide_trustanchor = (strcmp($2, "yes")==0); 1541 free($2); 1542 } 1543 ; 1544 server_hide_http_user_agent: VAR_HIDE_HTTP_USER_AGENT STRING_ARG 1545 { 1546 OUTYY(("P(server_hide_user_agent:%s)\n", $2)); 1547 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1548 yyerror("expected yes or no."); 1549 else cfg_parser->cfg->hide_http_user_agent = (strcmp($2, "yes")==0); 1550 free($2); 1551 } 1552 ; 1553 server_identity: VAR_IDENTITY STRING_ARG 1554 { 1555 OUTYY(("P(server_identity:%s)\n", $2)); 1556 free(cfg_parser->cfg->identity); 1557 cfg_parser->cfg->identity = $2; 1558 } 1559 ; 1560 server_version: VAR_VERSION STRING_ARG 1561 { 1562 OUTYY(("P(server_version:%s)\n", $2)); 1563 free(cfg_parser->cfg->version); 1564 cfg_parser->cfg->version = $2; 1565 } 1566 ; 1567 server_http_user_agent: VAR_HTTP_USER_AGENT STRING_ARG 1568 { 1569 OUTYY(("P(server_http_user_agent:%s)\n", $2)); 1570 free(cfg_parser->cfg->http_user_agent); 1571 cfg_parser->cfg->http_user_agent = $2; 1572 } 1573 ; 1574 server_nsid: VAR_NSID STRING_ARG 1575 { 1576 OUTYY(("P(server_nsid:%s)\n", $2)); 1577 free(cfg_parser->cfg->nsid_cfg_str); 1578 cfg_parser->cfg->nsid_cfg_str = $2; 1579 free(cfg_parser->cfg->nsid); 1580 cfg_parser->cfg->nsid = NULL; 1581 cfg_parser->cfg->nsid_len = 0; 1582 if (*$2 == 0) 1583 ; /* pass; empty string is not setting nsid */ 1584 else if (!(cfg_parser->cfg->nsid = cfg_parse_nsid( 1585 $2, &cfg_parser->cfg->nsid_len))) 1586 yyerror("the NSID must be either a hex string or an " 1587 "ascii character string prepended with ascii_."); 1588 } 1589 ; 1590 server_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG 1591 { 1592 OUTYY(("P(server_so_rcvbuf:%s)\n", $2)); 1593 if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_rcvbuf)) 1594 yyerror("buffer size expected"); 1595 free($2); 1596 } 1597 ; 1598 server_so_sndbuf: VAR_SO_SNDBUF STRING_ARG 1599 { 1600 OUTYY(("P(server_so_sndbuf:%s)\n", $2)); 1601 if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_sndbuf)) 1602 yyerror("buffer size expected"); 1603 free($2); 1604 } 1605 ; 1606 server_so_reuseport: VAR_SO_REUSEPORT STRING_ARG 1607 { 1608 OUTYY(("P(server_so_reuseport:%s)\n", $2)); 1609 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1610 yyerror("expected yes or no."); 1611 else cfg_parser->cfg->so_reuseport = 1612 (strcmp($2, "yes")==0); 1613 free($2); 1614 } 1615 ; 1616 server_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG 1617 { 1618 OUTYY(("P(server_ip_transparent:%s)\n", $2)); 1619 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1620 yyerror("expected yes or no."); 1621 else cfg_parser->cfg->ip_transparent = 1622 (strcmp($2, "yes")==0); 1623 free($2); 1624 } 1625 ; 1626 server_ip_freebind: VAR_IP_FREEBIND STRING_ARG 1627 { 1628 OUTYY(("P(server_ip_freebind:%s)\n", $2)); 1629 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1630 yyerror("expected yes or no."); 1631 else cfg_parser->cfg->ip_freebind = 1632 (strcmp($2, "yes")==0); 1633 free($2); 1634 } 1635 ; 1636 server_ip_dscp: VAR_IP_DSCP STRING_ARG 1637 { 1638 OUTYY(("P(server_ip_dscp:%s)\n", $2)); 1639 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1640 yyerror("number expected"); 1641 else if (atoi($2) > 63) 1642 yyerror("value too large (max 63)"); 1643 else if (atoi($2) < 0) 1644 yyerror("value too small (min 0)"); 1645 else 1646 cfg_parser->cfg->ip_dscp = atoi($2); 1647 free($2); 1648 } 1649 ; 1650 server_stream_wait_size: VAR_STREAM_WAIT_SIZE STRING_ARG 1651 { 1652 OUTYY(("P(server_stream_wait_size:%s)\n", $2)); 1653 if(!cfg_parse_memsize($2, &cfg_parser->cfg->stream_wait_size)) 1654 yyerror("memory size expected"); 1655 free($2); 1656 } 1657 ; 1658 server_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG 1659 { 1660 OUTYY(("P(server_edns_buffer_size:%s)\n", $2)); 1661 if(atoi($2) == 0) 1662 yyerror("number expected"); 1663 else if (atoi($2) < 12) 1664 yyerror("edns buffer size too small"); 1665 else if (atoi($2) > 65535) 1666 cfg_parser->cfg->edns_buffer_size = 65535; 1667 else cfg_parser->cfg->edns_buffer_size = atoi($2); 1668 free($2); 1669 } 1670 ; 1671 server_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG 1672 { 1673 OUTYY(("P(server_msg_buffer_size:%s)\n", $2)); 1674 if(atoi($2) == 0) 1675 yyerror("number expected"); 1676 else if (atoi($2) < 4096) 1677 yyerror("message buffer size too small (use 4096)"); 1678 else cfg_parser->cfg->msg_buffer_size = atoi($2); 1679 free($2); 1680 } 1681 ; 1682 server_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG 1683 { 1684 OUTYY(("P(server_msg_cache_size:%s)\n", $2)); 1685 if(!cfg_parse_memsize($2, &cfg_parser->cfg->msg_cache_size)) 1686 yyerror("memory size expected"); 1687 free($2); 1688 } 1689 ; 1690 server_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG 1691 { 1692 OUTYY(("P(server_msg_cache_slabs:%s)\n", $2)); 1693 if(atoi($2) == 0) { 1694 yyerror("number expected"); 1695 } else { 1696 cfg_parser->cfg->msg_cache_slabs = atoi($2); 1697 if(!is_pow2(cfg_parser->cfg->msg_cache_slabs)) 1698 yyerror("must be a power of 2"); 1699 } 1700 free($2); 1701 } 1702 ; 1703 server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG 1704 { 1705 OUTYY(("P(server_num_queries_per_thread:%s)\n", $2)); 1706 if(atoi($2) == 0) 1707 yyerror("number expected"); 1708 else cfg_parser->cfg->num_queries_per_thread = atoi($2); 1709 free($2); 1710 } 1711 ; 1712 server_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG 1713 { 1714 OUTYY(("P(server_jostle_timeout:%s)\n", $2)); 1715 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1716 yyerror("number expected"); 1717 else cfg_parser->cfg->jostle_time = atoi($2); 1718 free($2); 1719 } 1720 ; 1721 server_delay_close: VAR_DELAY_CLOSE STRING_ARG 1722 { 1723 OUTYY(("P(server_delay_close:%s)\n", $2)); 1724 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1725 yyerror("number expected"); 1726 else cfg_parser->cfg->delay_close = atoi($2); 1727 free($2); 1728 } 1729 ; 1730 server_udp_connect: VAR_UDP_CONNECT STRING_ARG 1731 { 1732 OUTYY(("P(server_udp_connect:%s)\n", $2)); 1733 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1734 yyerror("expected yes or no."); 1735 else cfg_parser->cfg->udp_connect = (strcmp($2, "yes")==0); 1736 free($2); 1737 } 1738 ; 1739 server_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG 1740 { 1741 OUTYY(("P(server_unblock_lan_zones:%s)\n", $2)); 1742 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1743 yyerror("expected yes or no."); 1744 else cfg_parser->cfg->unblock_lan_zones = 1745 (strcmp($2, "yes")==0); 1746 free($2); 1747 } 1748 ; 1749 server_insecure_lan_zones: VAR_INSECURE_LAN_ZONES STRING_ARG 1750 { 1751 OUTYY(("P(server_insecure_lan_zones:%s)\n", $2)); 1752 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1753 yyerror("expected yes or no."); 1754 else cfg_parser->cfg->insecure_lan_zones = 1755 (strcmp($2, "yes")==0); 1756 free($2); 1757 } 1758 ; 1759 server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG 1760 { 1761 OUTYY(("P(server_rrset_cache_size:%s)\n", $2)); 1762 if(!cfg_parse_memsize($2, &cfg_parser->cfg->rrset_cache_size)) 1763 yyerror("memory size expected"); 1764 free($2); 1765 } 1766 ; 1767 server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG 1768 { 1769 OUTYY(("P(server_rrset_cache_slabs:%s)\n", $2)); 1770 if(atoi($2) == 0) { 1771 yyerror("number expected"); 1772 } else { 1773 cfg_parser->cfg->rrset_cache_slabs = atoi($2); 1774 if(!is_pow2(cfg_parser->cfg->rrset_cache_slabs)) 1775 yyerror("must be a power of 2"); 1776 } 1777 free($2); 1778 } 1779 ; 1780 server_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG 1781 { 1782 OUTYY(("P(server_infra_host_ttl:%s)\n", $2)); 1783 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1784 yyerror("number expected"); 1785 else cfg_parser->cfg->host_ttl = atoi($2); 1786 free($2); 1787 } 1788 ; 1789 server_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG 1790 { 1791 OUTYY(("P(server_infra_lame_ttl:%s)\n", $2)); 1792 verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option " 1793 "removed, use infra-host-ttl)", $2); 1794 free($2); 1795 } 1796 ; 1797 server_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG 1798 { 1799 OUTYY(("P(server_infra_cache_numhosts:%s)\n", $2)); 1800 if(atoi($2) == 0) 1801 yyerror("number expected"); 1802 else cfg_parser->cfg->infra_cache_numhosts = atoi($2); 1803 free($2); 1804 } 1805 ; 1806 server_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG 1807 { 1808 OUTYY(("P(server_infra_cache_lame_size:%s)\n", $2)); 1809 verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s " 1810 "(option removed, use infra-cache-numhosts)", $2); 1811 free($2); 1812 } 1813 ; 1814 server_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG 1815 { 1816 OUTYY(("P(server_infra_cache_slabs:%s)\n", $2)); 1817 if(atoi($2) == 0) { 1818 yyerror("number expected"); 1819 } else { 1820 cfg_parser->cfg->infra_cache_slabs = atoi($2); 1821 if(!is_pow2(cfg_parser->cfg->infra_cache_slabs)) 1822 yyerror("must be a power of 2"); 1823 } 1824 free($2); 1825 } 1826 ; 1827 server_infra_cache_min_rtt: VAR_INFRA_CACHE_MIN_RTT STRING_ARG 1828 { 1829 OUTYY(("P(server_infra_cache_min_rtt:%s)\n", $2)); 1830 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1831 yyerror("number expected"); 1832 else cfg_parser->cfg->infra_cache_min_rtt = atoi($2); 1833 free($2); 1834 } 1835 ; 1836 server_infra_cache_max_rtt: VAR_INFRA_CACHE_MAX_RTT STRING_ARG 1837 { 1838 OUTYY(("P(server_infra_cache_max_rtt:%s)\n", $2)); 1839 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1840 yyerror("number expected"); 1841 else cfg_parser->cfg->infra_cache_max_rtt = atoi($2); 1842 free($2); 1843 } 1844 ; 1845 server_infra_keep_probing: VAR_INFRA_KEEP_PROBING STRING_ARG 1846 { 1847 OUTYY(("P(server_infra_keep_probing:%s)\n", $2)); 1848 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1849 yyerror("expected yes or no."); 1850 else cfg_parser->cfg->infra_keep_probing = 1851 (strcmp($2, "yes")==0); 1852 free($2); 1853 } 1854 ; 1855 server_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG 1856 { 1857 OUTYY(("P(server_target_fetch_policy:%s)\n", $2)); 1858 free(cfg_parser->cfg->target_fetch_policy); 1859 cfg_parser->cfg->target_fetch_policy = $2; 1860 } 1861 ; 1862 server_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG 1863 { 1864 OUTYY(("P(server_harden_short_bufsize:%s)\n", $2)); 1865 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1866 yyerror("expected yes or no."); 1867 else cfg_parser->cfg->harden_short_bufsize = 1868 (strcmp($2, "yes")==0); 1869 free($2); 1870 } 1871 ; 1872 server_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG 1873 { 1874 OUTYY(("P(server_harden_large_queries:%s)\n", $2)); 1875 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1876 yyerror("expected yes or no."); 1877 else cfg_parser->cfg->harden_large_queries = 1878 (strcmp($2, "yes")==0); 1879 free($2); 1880 } 1881 ; 1882 server_harden_glue: VAR_HARDEN_GLUE STRING_ARG 1883 { 1884 OUTYY(("P(server_harden_glue:%s)\n", $2)); 1885 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1886 yyerror("expected yes or no."); 1887 else cfg_parser->cfg->harden_glue = 1888 (strcmp($2, "yes")==0); 1889 free($2); 1890 } 1891 ; 1892 server_harden_unverified_glue: VAR_HARDEN_UNVERIFIED_GLUE STRING_ARG 1893 { 1894 OUTYY(("P(server_harden_unverified_glue:%s)\n", $2)); 1895 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1896 yyerror("expected yes or no."); 1897 else cfg_parser->cfg->harden_unverified_glue = 1898 (strcmp($2, "yes")==0); 1899 free($2); 1900 } 1901 ; 1902 server_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG 1903 { 1904 OUTYY(("P(server_harden_dnssec_stripped:%s)\n", $2)); 1905 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1906 yyerror("expected yes or no."); 1907 else cfg_parser->cfg->harden_dnssec_stripped = 1908 (strcmp($2, "yes")==0); 1909 free($2); 1910 } 1911 ; 1912 server_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG 1913 { 1914 OUTYY(("P(server_harden_below_nxdomain:%s)\n", $2)); 1915 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1916 yyerror("expected yes or no."); 1917 else cfg_parser->cfg->harden_below_nxdomain = 1918 (strcmp($2, "yes")==0); 1919 free($2); 1920 } 1921 ; 1922 server_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG 1923 { 1924 OUTYY(("P(server_harden_referral_path:%s)\n", $2)); 1925 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1926 yyerror("expected yes or no."); 1927 else cfg_parser->cfg->harden_referral_path = 1928 (strcmp($2, "yes")==0); 1929 free($2); 1930 } 1931 ; 1932 server_harden_algo_downgrade: VAR_HARDEN_ALGO_DOWNGRADE STRING_ARG 1933 { 1934 OUTYY(("P(server_harden_algo_downgrade:%s)\n", $2)); 1935 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1936 yyerror("expected yes or no."); 1937 else cfg_parser->cfg->harden_algo_downgrade = 1938 (strcmp($2, "yes")==0); 1939 free($2); 1940 } 1941 ; 1942 server_harden_unknown_additional: VAR_HARDEN_UNKNOWN_ADDITIONAL STRING_ARG 1943 { 1944 OUTYY(("P(server_harden_unknown_additional:%s)\n", $2)); 1945 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1946 yyerror("expected yes or no."); 1947 else cfg_parser->cfg->harden_unknown_additional = 1948 (strcmp($2, "yes")==0); 1949 free($2); 1950 } 1951 ; 1952 server_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG 1953 { 1954 OUTYY(("P(server_use_caps_for_id:%s)\n", $2)); 1955 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1956 yyerror("expected yes or no."); 1957 else cfg_parser->cfg->use_caps_bits_for_id = 1958 (strcmp($2, "yes")==0); 1959 free($2); 1960 } 1961 ; 1962 server_caps_whitelist: VAR_CAPS_WHITELIST STRING_ARG 1963 { 1964 OUTYY(("P(server_caps_whitelist:%s)\n", $2)); 1965 if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, $2)) 1966 yyerror("out of memory"); 1967 } 1968 ; 1969 server_private_address: VAR_PRIVATE_ADDRESS STRING_ARG 1970 { 1971 OUTYY(("P(server_private_address:%s)\n", $2)); 1972 if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, $2)) 1973 yyerror("out of memory"); 1974 } 1975 ; 1976 server_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG 1977 { 1978 OUTYY(("P(server_private_domain:%s)\n", $2)); 1979 if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, $2)) 1980 yyerror("out of memory"); 1981 } 1982 ; 1983 server_prefetch: VAR_PREFETCH STRING_ARG 1984 { 1985 OUTYY(("P(server_prefetch:%s)\n", $2)); 1986 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1987 yyerror("expected yes or no."); 1988 else cfg_parser->cfg->prefetch = (strcmp($2, "yes")==0); 1989 free($2); 1990 } 1991 ; 1992 server_prefetch_key: VAR_PREFETCH_KEY STRING_ARG 1993 { 1994 OUTYY(("P(server_prefetch_key:%s)\n", $2)); 1995 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1996 yyerror("expected yes or no."); 1997 else cfg_parser->cfg->prefetch_key = (strcmp($2, "yes")==0); 1998 free($2); 1999 } 2000 ; 2001 server_deny_any: VAR_DENY_ANY STRING_ARG 2002 { 2003 OUTYY(("P(server_deny_any:%s)\n", $2)); 2004 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2005 yyerror("expected yes or no."); 2006 else cfg_parser->cfg->deny_any = (strcmp($2, "yes")==0); 2007 free($2); 2008 } 2009 ; 2010 server_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG 2011 { 2012 OUTYY(("P(server_unwanted_reply_threshold:%s)\n", $2)); 2013 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2014 yyerror("number expected"); 2015 else cfg_parser->cfg->unwanted_threshold = atoi($2); 2016 free($2); 2017 } 2018 ; 2019 server_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG 2020 { 2021 OUTYY(("P(server_do_not_query_address:%s)\n", $2)); 2022 if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, $2)) 2023 yyerror("out of memory"); 2024 } 2025 ; 2026 server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG 2027 { 2028 OUTYY(("P(server_do_not_query_localhost:%s)\n", $2)); 2029 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2030 yyerror("expected yes or no."); 2031 else cfg_parser->cfg->donotquery_localhost = 2032 (strcmp($2, "yes")==0); 2033 free($2); 2034 } 2035 ; 2036 server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG 2037 { 2038 OUTYY(("P(server_access_control:%s %s)\n", $2, $3)); 2039 validate_acl_action($3); 2040 if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3)) 2041 yyerror("out of memory"); 2042 } 2043 ; 2044 server_interface_action: VAR_INTERFACE_ACTION STRING_ARG STRING_ARG 2045 { 2046 OUTYY(("P(server_interface_action:%s %s)\n", $2, $3)); 2047 validate_acl_action($3); 2048 if(!cfg_str2list_insert( 2049 &cfg_parser->cfg->interface_actions, $2, $3)) 2050 yyerror("out of memory"); 2051 } 2052 ; 2053 server_module_conf: VAR_MODULE_CONF STRING_ARG 2054 { 2055 OUTYY(("P(server_module_conf:%s)\n", $2)); 2056 free(cfg_parser->cfg->module_conf); 2057 cfg_parser->cfg->module_conf = $2; 2058 } 2059 ; 2060 server_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG 2061 { 2062 OUTYY(("P(server_val_override_date:%s)\n", $2)); 2063 if(*$2 == '\0' || strcmp($2, "0") == 0) { 2064 cfg_parser->cfg->val_date_override = 0; 2065 } else if(strlen($2) == 14) { 2066 cfg_parser->cfg->val_date_override = 2067 cfg_convert_timeval($2); 2068 if(!cfg_parser->cfg->val_date_override) 2069 yyerror("bad date/time specification"); 2070 } else { 2071 if(atoi($2) == 0) 2072 yyerror("number expected"); 2073 cfg_parser->cfg->val_date_override = atoi($2); 2074 } 2075 free($2); 2076 } 2077 ; 2078 server_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG 2079 { 2080 OUTYY(("P(server_val_sig_skew_min:%s)\n", $2)); 2081 if(*$2 == '\0' || strcmp($2, "0") == 0) { 2082 cfg_parser->cfg->val_sig_skew_min = 0; 2083 } else { 2084 cfg_parser->cfg->val_sig_skew_min = atoi($2); 2085 if(!cfg_parser->cfg->val_sig_skew_min) 2086 yyerror("number expected"); 2087 } 2088 free($2); 2089 } 2090 ; 2091 server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG 2092 { 2093 OUTYY(("P(server_val_sig_skew_max:%s)\n", $2)); 2094 if(*$2 == '\0' || strcmp($2, "0") == 0) { 2095 cfg_parser->cfg->val_sig_skew_max = 0; 2096 } else { 2097 cfg_parser->cfg->val_sig_skew_max = atoi($2); 2098 if(!cfg_parser->cfg->val_sig_skew_max) 2099 yyerror("number expected"); 2100 } 2101 free($2); 2102 } 2103 ; 2104 server_val_max_restart: VAR_VAL_MAX_RESTART STRING_ARG 2105 { 2106 OUTYY(("P(server_val_max_restart:%s)\n", $2)); 2107 if(*$2 == '\0' || strcmp($2, "0") == 0) { 2108 cfg_parser->cfg->val_max_restart = 0; 2109 } else { 2110 cfg_parser->cfg->val_max_restart = atoi($2); 2111 if(!cfg_parser->cfg->val_max_restart) 2112 yyerror("number expected"); 2113 } 2114 free($2); 2115 } 2116 ; 2117 server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG 2118 { 2119 OUTYY(("P(server_cache_max_ttl:%s)\n", $2)); 2120 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2121 yyerror("number expected"); 2122 else cfg_parser->cfg->max_ttl = atoi($2); 2123 free($2); 2124 } 2125 ; 2126 server_cache_max_negative_ttl: VAR_CACHE_MAX_NEGATIVE_TTL STRING_ARG 2127 { 2128 OUTYY(("P(server_cache_max_negative_ttl:%s)\n", $2)); 2129 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2130 yyerror("number expected"); 2131 else cfg_parser->cfg->max_negative_ttl = atoi($2); 2132 free($2); 2133 } 2134 ; 2135 server_cache_min_negative_ttl: VAR_CACHE_MIN_NEGATIVE_TTL STRING_ARG 2136 { 2137 OUTYY(("P(server_cache_min_negative_ttl:%s)\n", $2)); 2138 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2139 yyerror("number expected"); 2140 else cfg_parser->cfg->min_negative_ttl = atoi($2); 2141 free($2); 2142 } 2143 ; 2144 server_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG 2145 { 2146 OUTYY(("P(server_cache_min_ttl:%s)\n", $2)); 2147 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2148 yyerror("number expected"); 2149 else cfg_parser->cfg->min_ttl = atoi($2); 2150 free($2); 2151 } 2152 ; 2153 server_bogus_ttl: VAR_BOGUS_TTL STRING_ARG 2154 { 2155 OUTYY(("P(server_bogus_ttl:%s)\n", $2)); 2156 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2157 yyerror("number expected"); 2158 else cfg_parser->cfg->bogus_ttl = atoi($2); 2159 free($2); 2160 } 2161 ; 2162 server_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG 2163 { 2164 OUTYY(("P(server_val_clean_additional:%s)\n", $2)); 2165 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2166 yyerror("expected yes or no."); 2167 else cfg_parser->cfg->val_clean_additional = 2168 (strcmp($2, "yes")==0); 2169 free($2); 2170 } 2171 ; 2172 server_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG 2173 { 2174 OUTYY(("P(server_val_permissive_mode:%s)\n", $2)); 2175 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2176 yyerror("expected yes or no."); 2177 else cfg_parser->cfg->val_permissive_mode = 2178 (strcmp($2, "yes")==0); 2179 free($2); 2180 } 2181 ; 2182 server_aggressive_nsec: VAR_AGGRESSIVE_NSEC STRING_ARG 2183 { 2184 OUTYY(("P(server_aggressive_nsec:%s)\n", $2)); 2185 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2186 yyerror("expected yes or no."); 2187 else 2188 cfg_parser->cfg->aggressive_nsec = 2189 (strcmp($2, "yes")==0); 2190 free($2); 2191 } 2192 ; 2193 server_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG 2194 { 2195 OUTYY(("P(server_ignore_cd_flag:%s)\n", $2)); 2196 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2197 yyerror("expected yes or no."); 2198 else cfg_parser->cfg->ignore_cd = (strcmp($2, "yes")==0); 2199 free($2); 2200 } 2201 ; 2202 server_disable_edns_do: VAR_DISABLE_EDNS_DO STRING_ARG 2203 { 2204 OUTYY(("P(server_disable_edns_do:%s)\n", $2)); 2205 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2206 yyerror("expected yes or no."); 2207 else cfg_parser->cfg->disable_edns_do = (strcmp($2, "yes")==0); 2208 free($2); 2209 } 2210 ; 2211 server_serve_expired: VAR_SERVE_EXPIRED STRING_ARG 2212 { 2213 OUTYY(("P(server_serve_expired:%s)\n", $2)); 2214 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2215 yyerror("expected yes or no."); 2216 else cfg_parser->cfg->serve_expired = (strcmp($2, "yes")==0); 2217 free($2); 2218 } 2219 ; 2220 server_serve_expired_ttl: VAR_SERVE_EXPIRED_TTL STRING_ARG 2221 { 2222 OUTYY(("P(server_serve_expired_ttl:%s)\n", $2)); 2223 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2224 yyerror("number expected"); 2225 else cfg_parser->cfg->serve_expired_ttl = atoi($2); 2226 free($2); 2227 } 2228 ; 2229 server_serve_expired_ttl_reset: VAR_SERVE_EXPIRED_TTL_RESET STRING_ARG 2230 { 2231 OUTYY(("P(server_serve_expired_ttl_reset:%s)\n", $2)); 2232 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2233 yyerror("expected yes or no."); 2234 else cfg_parser->cfg->serve_expired_ttl_reset = (strcmp($2, "yes")==0); 2235 free($2); 2236 } 2237 ; 2238 server_serve_expired_reply_ttl: VAR_SERVE_EXPIRED_REPLY_TTL STRING_ARG 2239 { 2240 OUTYY(("P(server_serve_expired_reply_ttl:%s)\n", $2)); 2241 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2242 yyerror("number expected"); 2243 else cfg_parser->cfg->serve_expired_reply_ttl = atoi($2); 2244 free($2); 2245 } 2246 ; 2247 server_serve_expired_client_timeout: VAR_SERVE_EXPIRED_CLIENT_TIMEOUT STRING_ARG 2248 { 2249 OUTYY(("P(server_serve_expired_client_timeout:%s)\n", $2)); 2250 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2251 yyerror("number expected"); 2252 else cfg_parser->cfg->serve_expired_client_timeout = atoi($2); 2253 free($2); 2254 } 2255 ; 2256 server_ede_serve_expired: VAR_EDE_SERVE_EXPIRED STRING_ARG 2257 { 2258 OUTYY(("P(server_ede_serve_expired:%s)\n", $2)); 2259 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2260 yyerror("expected yes or no."); 2261 else cfg_parser->cfg->ede_serve_expired = (strcmp($2, "yes")==0); 2262 free($2); 2263 } 2264 ; 2265 server_serve_original_ttl: VAR_SERVE_ORIGINAL_TTL STRING_ARG 2266 { 2267 OUTYY(("P(server_serve_original_ttl:%s)\n", $2)); 2268 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2269 yyerror("expected yes or no."); 2270 else cfg_parser->cfg->serve_original_ttl = (strcmp($2, "yes")==0); 2271 free($2); 2272 } 2273 ; 2274 server_fake_dsa: VAR_FAKE_DSA STRING_ARG 2275 { 2276 OUTYY(("P(server_fake_dsa:%s)\n", $2)); 2277 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2278 yyerror("expected yes or no."); 2279 #if defined(HAVE_SSL) || defined(HAVE_NETTLE) 2280 else fake_dsa = (strcmp($2, "yes")==0); 2281 if(fake_dsa) 2282 log_warn("test option fake_dsa is enabled"); 2283 #endif 2284 free($2); 2285 } 2286 ; 2287 server_fake_sha1: VAR_FAKE_SHA1 STRING_ARG 2288 { 2289 OUTYY(("P(server_fake_sha1:%s)\n", $2)); 2290 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2291 yyerror("expected yes or no."); 2292 #if defined(HAVE_SSL) || defined(HAVE_NETTLE) 2293 else fake_sha1 = (strcmp($2, "yes")==0); 2294 if(fake_sha1) 2295 log_warn("test option fake_sha1 is enabled"); 2296 #endif 2297 free($2); 2298 } 2299 ; 2300 server_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG 2301 { 2302 OUTYY(("P(server_val_log_level:%s)\n", $2)); 2303 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2304 yyerror("number expected"); 2305 else cfg_parser->cfg->val_log_level = atoi($2); 2306 free($2); 2307 } 2308 ; 2309 server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG 2310 { 2311 OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", $2)); 2312 free(cfg_parser->cfg->val_nsec3_key_iterations); 2313 cfg_parser->cfg->val_nsec3_key_iterations = $2; 2314 } 2315 ; 2316 server_zonemd_permissive_mode: VAR_ZONEMD_PERMISSIVE_MODE STRING_ARG 2317 { 2318 OUTYY(("P(server_zonemd_permissive_mode:%s)\n", $2)); 2319 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2320 yyerror("expected yes or no."); 2321 else cfg_parser->cfg->zonemd_permissive_mode = (strcmp($2, "yes")==0); 2322 free($2); 2323 } 2324 ; 2325 server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG 2326 { 2327 OUTYY(("P(server_add_holddown:%s)\n", $2)); 2328 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2329 yyerror("number expected"); 2330 else cfg_parser->cfg->add_holddown = atoi($2); 2331 free($2); 2332 } 2333 ; 2334 server_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG 2335 { 2336 OUTYY(("P(server_del_holddown:%s)\n", $2)); 2337 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2338 yyerror("number expected"); 2339 else cfg_parser->cfg->del_holddown = atoi($2); 2340 free($2); 2341 } 2342 ; 2343 server_keep_missing: VAR_KEEP_MISSING STRING_ARG 2344 { 2345 OUTYY(("P(server_keep_missing:%s)\n", $2)); 2346 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2347 yyerror("number expected"); 2348 else cfg_parser->cfg->keep_missing = atoi($2); 2349 free($2); 2350 } 2351 ; 2352 server_permit_small_holddown: VAR_PERMIT_SMALL_HOLDDOWN STRING_ARG 2353 { 2354 OUTYY(("P(server_permit_small_holddown:%s)\n", $2)); 2355 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2356 yyerror("expected yes or no."); 2357 else cfg_parser->cfg->permit_small_holddown = 2358 (strcmp($2, "yes")==0); 2359 free($2); 2360 } 2361 ; 2362 server_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG 2363 { 2364 OUTYY(("P(server_key_cache_size:%s)\n", $2)); 2365 if(!cfg_parse_memsize($2, &cfg_parser->cfg->key_cache_size)) 2366 yyerror("memory size expected"); 2367 free($2); 2368 } 2369 ; 2370 server_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG 2371 { 2372 OUTYY(("P(server_key_cache_slabs:%s)\n", $2)); 2373 if(atoi($2) == 0) { 2374 yyerror("number expected"); 2375 } else { 2376 cfg_parser->cfg->key_cache_slabs = atoi($2); 2377 if(!is_pow2(cfg_parser->cfg->key_cache_slabs)) 2378 yyerror("must be a power of 2"); 2379 } 2380 free($2); 2381 } 2382 ; 2383 server_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG 2384 { 2385 OUTYY(("P(server_neg_cache_size:%s)\n", $2)); 2386 if(!cfg_parse_memsize($2, &cfg_parser->cfg->neg_cache_size)) 2387 yyerror("memory size expected"); 2388 free($2); 2389 } 2390 ; 2391 server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG 2392 { 2393 OUTYY(("P(server_local_zone:%s %s)\n", $2, $3)); 2394 if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 && 2395 strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 && 2396 strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0 2397 && strcmp($3, "typetransparent")!=0 2398 && strcmp($3, "always_transparent")!=0 2399 && strcmp($3, "block_a")!=0 2400 && strcmp($3, "block_aaaa")!=0 2401 && strcmp($3, "block_a_wdata")!=0 2402 && strcmp($3, "block_aaaa_wdata")!=0 2403 && strcmp($3, "always_refuse")!=0 2404 && strcmp($3, "always_nxdomain")!=0 2405 && strcmp($3, "always_nodata")!=0 2406 && strcmp($3, "always_deny")!=0 2407 && strcmp($3, "always_null")!=0 2408 && strcmp($3, "noview")!=0 2409 && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0 2410 && strcmp($3, "inform_redirect") != 0 2411 && strcmp($3, "ipset") != 0) { 2412 yyerror("local-zone type: expected static, deny, " 2413 "refuse, redirect, transparent, " 2414 "typetransparent, inform, inform_deny, " 2415 "inform_redirect, always_transparent, " 2416 "block_a, block_aaaa, " 2417 "block_a_wdata, block_aaaa_wdata, " 2418 "always_refuse, always_nxdomain, " 2419 "always_nodata, always_deny, always_null, " 2420 "noview, nodefault or ipset"); 2421 free($2); 2422 free($3); 2423 } else if(strcmp($3, "nodefault")==0) { 2424 if(!cfg_strlist_insert(&cfg_parser->cfg-> 2425 local_zones_nodefault, $2)) 2426 yyerror("out of memory"); 2427 free($3); 2428 #ifdef USE_IPSET 2429 } else if(strcmp($3, "ipset")==0) { 2430 size_t len = strlen($2); 2431 /* Make sure to add the trailing dot. 2432 * These are str compared to domain names. */ 2433 if($2[len-1] != '.') { 2434 char* prev = $2; 2435 if(!($2 = realloc($2, len+2))) { 2436 yyerror("out of memory"); 2437 free(prev); 2438 } else { 2439 $2[len] = '.'; 2440 $2[len+1] = 0; 2441 } 2442 } 2443 if(!cfg_strlist_insert(&cfg_parser->cfg-> 2444 local_zones_ipset, $2)) 2445 yyerror("out of memory"); 2446 free($3); 2447 #endif 2448 } else { 2449 if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones, 2450 $2, $3)) 2451 yyerror("out of memory"); 2452 } 2453 } 2454 ; 2455 server_local_data: VAR_LOCAL_DATA STRING_ARG 2456 { 2457 OUTYY(("P(server_local_data:%s)\n", $2)); 2458 if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, $2)) 2459 yyerror("out of memory"); 2460 } 2461 ; 2462 server_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG 2463 { 2464 char* ptr; 2465 OUTYY(("P(server_local_data_ptr:%s)\n", $2)); 2466 ptr = cfg_ptr_reverse($2); 2467 free($2); 2468 if(ptr) { 2469 if(!cfg_strlist_insert(&cfg_parser->cfg-> 2470 local_data, ptr)) 2471 yyerror("out of memory"); 2472 } else { 2473 yyerror("local-data-ptr could not be reversed"); 2474 } 2475 } 2476 ; 2477 server_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG 2478 { 2479 OUTYY(("P(server_minimal_responses:%s)\n", $2)); 2480 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2481 yyerror("expected yes or no."); 2482 else cfg_parser->cfg->minimal_responses = 2483 (strcmp($2, "yes")==0); 2484 free($2); 2485 } 2486 ; 2487 server_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG 2488 { 2489 OUTYY(("P(server_rrset_roundrobin:%s)\n", $2)); 2490 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2491 yyerror("expected yes or no."); 2492 else cfg_parser->cfg->rrset_roundrobin = 2493 (strcmp($2, "yes")==0); 2494 free($2); 2495 } 2496 ; 2497 server_unknown_server_time_limit: VAR_UNKNOWN_SERVER_TIME_LIMIT STRING_ARG 2498 { 2499 OUTYY(("P(server_unknown_server_time_limit:%s)\n", $2)); 2500 cfg_parser->cfg->unknown_server_time_limit = atoi($2); 2501 free($2); 2502 } 2503 ; 2504 server_discard_timeout: VAR_DISCARD_TIMEOUT STRING_ARG 2505 { 2506 OUTYY(("P(server_discard_timeout:%s)\n", $2)); 2507 cfg_parser->cfg->discard_timeout = atoi($2); 2508 free($2); 2509 } 2510 ; 2511 server_wait_limit: VAR_WAIT_LIMIT STRING_ARG 2512 { 2513 OUTYY(("P(server_wait_limit:%s)\n", $2)); 2514 cfg_parser->cfg->wait_limit = atoi($2); 2515 free($2); 2516 } 2517 ; 2518 server_wait_limit_cookie: VAR_WAIT_LIMIT_COOKIE STRING_ARG 2519 { 2520 OUTYY(("P(server_wait_limit_cookie:%s)\n", $2)); 2521 cfg_parser->cfg->wait_limit_cookie = atoi($2); 2522 free($2); 2523 } 2524 ; 2525 server_wait_limit_netblock: VAR_WAIT_LIMIT_NETBLOCK STRING_ARG STRING_ARG 2526 { 2527 OUTYY(("P(server_wait_limit_netblock:%s %s)\n", $2, $3)); 2528 if(atoi($3) == 0 && strcmp($3, "0") != 0) { 2529 yyerror("number expected"); 2530 free($2); 2531 free($3); 2532 } else { 2533 if(!cfg_str2list_insert(&cfg_parser->cfg-> 2534 wait_limit_netblock, $2, $3)) 2535 yyerror("out of memory"); 2536 } 2537 } 2538 ; 2539 server_wait_limit_cookie_netblock: VAR_WAIT_LIMIT_COOKIE_NETBLOCK STRING_ARG STRING_ARG 2540 { 2541 OUTYY(("P(server_wait_limit_cookie_netblock:%s %s)\n", $2, $3)); 2542 if(atoi($3) == 0 && strcmp($3, "0") != 0) { 2543 yyerror("number expected"); 2544 free($2); 2545 free($3); 2546 } else { 2547 if(!cfg_str2list_insert(&cfg_parser->cfg-> 2548 wait_limit_cookie_netblock, $2, $3)) 2549 yyerror("out of memory"); 2550 } 2551 } 2552 ; 2553 server_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG 2554 { 2555 OUTYY(("P(server_max_udp_size:%s)\n", $2)); 2556 cfg_parser->cfg->max_udp_size = atoi($2); 2557 free($2); 2558 } 2559 ; 2560 server_dns64_prefix: VAR_DNS64_PREFIX STRING_ARG 2561 { 2562 OUTYY(("P(dns64_prefix:%s)\n", $2)); 2563 free(cfg_parser->cfg->dns64_prefix); 2564 cfg_parser->cfg->dns64_prefix = $2; 2565 } 2566 ; 2567 server_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG 2568 { 2569 OUTYY(("P(server_dns64_synthall:%s)\n", $2)); 2570 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2571 yyerror("expected yes or no."); 2572 else cfg_parser->cfg->dns64_synthall = (strcmp($2, "yes")==0); 2573 free($2); 2574 } 2575 ; 2576 server_dns64_ignore_aaaa: VAR_DNS64_IGNORE_AAAA STRING_ARG 2577 { 2578 OUTYY(("P(dns64_ignore_aaaa:%s)\n", $2)); 2579 if(!cfg_strlist_insert(&cfg_parser->cfg->dns64_ignore_aaaa, 2580 $2)) 2581 yyerror("out of memory"); 2582 } 2583 ; 2584 server_nat64_prefix: VAR_NAT64_PREFIX STRING_ARG 2585 { 2586 OUTYY(("P(nat64_prefix:%s)\n", $2)); 2587 free(cfg_parser->cfg->nat64_prefix); 2588 cfg_parser->cfg->nat64_prefix = $2; 2589 } 2590 ; 2591 server_define_tag: VAR_DEFINE_TAG STRING_ARG 2592 { 2593 char* p, *s = $2; 2594 OUTYY(("P(server_define_tag:%s)\n", $2)); 2595 while((p=strsep(&s, " \t\n")) != NULL) { 2596 if(*p) { 2597 if(!config_add_tag(cfg_parser->cfg, p)) 2598 yyerror("could not define-tag, " 2599 "out of memory"); 2600 } 2601 } 2602 free($2); 2603 } 2604 ; 2605 server_local_zone_tag: VAR_LOCAL_ZONE_TAG STRING_ARG STRING_ARG 2606 { 2607 size_t len = 0; 2608 uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3, 2609 &len); 2610 free($3); 2611 OUTYY(("P(server_local_zone_tag:%s)\n", $2)); 2612 if(!bitlist) { 2613 yyerror("could not parse tags, (define-tag them first)"); 2614 free($2); 2615 } 2616 if(bitlist) { 2617 if(!cfg_strbytelist_insert( 2618 &cfg_parser->cfg->local_zone_tags, 2619 $2, bitlist, len)) { 2620 yyerror("out of memory"); 2621 free($2); 2622 } 2623 } 2624 } 2625 ; 2626 server_access_control_tag: VAR_ACCESS_CONTROL_TAG STRING_ARG STRING_ARG 2627 { 2628 size_t len = 0; 2629 uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3, 2630 &len); 2631 free($3); 2632 OUTYY(("P(server_access_control_tag:%s)\n", $2)); 2633 if(!bitlist) { 2634 yyerror("could not parse tags, (define-tag them first)"); 2635 free($2); 2636 } 2637 if(bitlist) { 2638 if(!cfg_strbytelist_insert( 2639 &cfg_parser->cfg->acl_tags, 2640 $2, bitlist, len)) { 2641 yyerror("out of memory"); 2642 free($2); 2643 } 2644 } 2645 } 2646 ; 2647 server_access_control_tag_action: VAR_ACCESS_CONTROL_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG 2648 { 2649 OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", $2, $3, $4)); 2650 if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions, 2651 $2, $3, $4)) { 2652 yyerror("out of memory"); 2653 free($2); 2654 free($3); 2655 free($4); 2656 } 2657 } 2658 ; 2659 server_access_control_tag_data: VAR_ACCESS_CONTROL_TAG_DATA STRING_ARG STRING_ARG STRING_ARG 2660 { 2661 OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", $2, $3, $4)); 2662 if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas, 2663 $2, $3, $4)) { 2664 yyerror("out of memory"); 2665 free($2); 2666 free($3); 2667 free($4); 2668 } 2669 } 2670 ; 2671 server_local_zone_override: VAR_LOCAL_ZONE_OVERRIDE STRING_ARG STRING_ARG STRING_ARG 2672 { 2673 OUTYY(("P(server_local_zone_override:%s %s %s)\n", $2, $3, $4)); 2674 if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides, 2675 $2, $3, $4)) { 2676 yyerror("out of memory"); 2677 free($2); 2678 free($3); 2679 free($4); 2680 } 2681 } 2682 ; 2683 server_access_control_view: VAR_ACCESS_CONTROL_VIEW STRING_ARG STRING_ARG 2684 { 2685 OUTYY(("P(server_access_control_view:%s %s)\n", $2, $3)); 2686 if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view, 2687 $2, $3)) { 2688 yyerror("out of memory"); 2689 } 2690 } 2691 ; 2692 server_interface_tag: VAR_INTERFACE_TAG STRING_ARG STRING_ARG 2693 { 2694 size_t len = 0; 2695 uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3, 2696 &len); 2697 free($3); 2698 OUTYY(("P(server_interface_tag:%s)\n", $2)); 2699 if(!bitlist) { 2700 yyerror("could not parse tags, (define-tag them first)"); 2701 free($2); 2702 } 2703 if(bitlist) { 2704 if(!cfg_strbytelist_insert( 2705 &cfg_parser->cfg->interface_tags, 2706 $2, bitlist, len)) { 2707 yyerror("out of memory"); 2708 free($2); 2709 } 2710 } 2711 } 2712 ; 2713 server_interface_tag_action: VAR_INTERFACE_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG 2714 { 2715 OUTYY(("P(server_interface_tag_action:%s %s %s)\n", $2, $3, $4)); 2716 if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_actions, 2717 $2, $3, $4)) { 2718 yyerror("out of memory"); 2719 free($2); 2720 free($3); 2721 free($4); 2722 } 2723 } 2724 ; 2725 server_interface_tag_data: VAR_INTERFACE_TAG_DATA STRING_ARG STRING_ARG STRING_ARG 2726 { 2727 OUTYY(("P(server_interface_tag_data:%s %s %s)\n", $2, $3, $4)); 2728 if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_datas, 2729 $2, $3, $4)) { 2730 yyerror("out of memory"); 2731 free($2); 2732 free($3); 2733 free($4); 2734 } 2735 } 2736 ; 2737 server_interface_view: VAR_INTERFACE_VIEW STRING_ARG STRING_ARG 2738 { 2739 OUTYY(("P(server_interface_view:%s %s)\n", $2, $3)); 2740 if(!cfg_str2list_insert(&cfg_parser->cfg->interface_view, 2741 $2, $3)) { 2742 yyerror("out of memory"); 2743 } 2744 } 2745 ; 2746 server_response_ip_tag: VAR_RESPONSE_IP_TAG STRING_ARG STRING_ARG 2747 { 2748 size_t len = 0; 2749 uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3, 2750 &len); 2751 free($3); 2752 OUTYY(("P(response_ip_tag:%s)\n", $2)); 2753 if(!bitlist) { 2754 yyerror("could not parse tags, (define-tag them first)"); 2755 free($2); 2756 } 2757 if(bitlist) { 2758 if(!cfg_strbytelist_insert( 2759 &cfg_parser->cfg->respip_tags, 2760 $2, bitlist, len)) { 2761 yyerror("out of memory"); 2762 free($2); 2763 } 2764 } 2765 } 2766 ; 2767 server_ip_ratelimit: VAR_IP_RATELIMIT STRING_ARG 2768 { 2769 OUTYY(("P(server_ip_ratelimit:%s)\n", $2)); 2770 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2771 yyerror("number expected"); 2772 else cfg_parser->cfg->ip_ratelimit = atoi($2); 2773 free($2); 2774 } 2775 ; 2776 server_ip_ratelimit_cookie: VAR_IP_RATELIMIT_COOKIE STRING_ARG 2777 { 2778 OUTYY(("P(server_ip_ratelimit_cookie:%s)\n", $2)); 2779 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2780 yyerror("number expected"); 2781 else cfg_parser->cfg->ip_ratelimit_cookie = atoi($2); 2782 free($2); 2783 } 2784 ; 2785 server_ratelimit: VAR_RATELIMIT STRING_ARG 2786 { 2787 OUTYY(("P(server_ratelimit:%s)\n", $2)); 2788 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2789 yyerror("number expected"); 2790 else cfg_parser->cfg->ratelimit = atoi($2); 2791 free($2); 2792 } 2793 ; 2794 server_ip_ratelimit_size: VAR_IP_RATELIMIT_SIZE STRING_ARG 2795 { 2796 OUTYY(("P(server_ip_ratelimit_size:%s)\n", $2)); 2797 if(!cfg_parse_memsize($2, &cfg_parser->cfg->ip_ratelimit_size)) 2798 yyerror("memory size expected"); 2799 free($2); 2800 } 2801 ; 2802 server_ratelimit_size: VAR_RATELIMIT_SIZE STRING_ARG 2803 { 2804 OUTYY(("P(server_ratelimit_size:%s)\n", $2)); 2805 if(!cfg_parse_memsize($2, &cfg_parser->cfg->ratelimit_size)) 2806 yyerror("memory size expected"); 2807 free($2); 2808 } 2809 ; 2810 server_ip_ratelimit_slabs: VAR_IP_RATELIMIT_SLABS STRING_ARG 2811 { 2812 OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", $2)); 2813 if(atoi($2) == 0) { 2814 yyerror("number expected"); 2815 } else { 2816 cfg_parser->cfg->ip_ratelimit_slabs = atoi($2); 2817 if(!is_pow2(cfg_parser->cfg->ip_ratelimit_slabs)) 2818 yyerror("must be a power of 2"); 2819 } 2820 free($2); 2821 } 2822 ; 2823 server_ratelimit_slabs: VAR_RATELIMIT_SLABS STRING_ARG 2824 { 2825 OUTYY(("P(server_ratelimit_slabs:%s)\n", $2)); 2826 if(atoi($2) == 0) { 2827 yyerror("number expected"); 2828 } else { 2829 cfg_parser->cfg->ratelimit_slabs = atoi($2); 2830 if(!is_pow2(cfg_parser->cfg->ratelimit_slabs)) 2831 yyerror("must be a power of 2"); 2832 } 2833 free($2); 2834 } 2835 ; 2836 server_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG 2837 { 2838 OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", $2, $3)); 2839 if(atoi($3) == 0 && strcmp($3, "0") != 0) { 2840 yyerror("number expected"); 2841 free($2); 2842 free($3); 2843 } else { 2844 if(!cfg_str2list_insert(&cfg_parser->cfg-> 2845 ratelimit_for_domain, $2, $3)) 2846 yyerror("out of memory"); 2847 } 2848 } 2849 ; 2850 server_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG 2851 { 2852 OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", $2, $3)); 2853 if(atoi($3) == 0 && strcmp($3, "0") != 0) { 2854 yyerror("number expected"); 2855 free($2); 2856 free($3); 2857 } else { 2858 if(!cfg_str2list_insert(&cfg_parser->cfg-> 2859 ratelimit_below_domain, $2, $3)) 2860 yyerror("out of memory"); 2861 } 2862 } 2863 ; 2864 server_ip_ratelimit_factor: VAR_IP_RATELIMIT_FACTOR STRING_ARG 2865 { 2866 OUTYY(("P(server_ip_ratelimit_factor:%s)\n", $2)); 2867 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2868 yyerror("number expected"); 2869 else cfg_parser->cfg->ip_ratelimit_factor = atoi($2); 2870 free($2); 2871 } 2872 ; 2873 server_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG 2874 { 2875 OUTYY(("P(server_ratelimit_factor:%s)\n", $2)); 2876 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2877 yyerror("number expected"); 2878 else cfg_parser->cfg->ratelimit_factor = atoi($2); 2879 free($2); 2880 } 2881 ; 2882 server_ip_ratelimit_backoff: VAR_IP_RATELIMIT_BACKOFF STRING_ARG 2883 { 2884 OUTYY(("P(server_ip_ratelimit_backoff:%s)\n", $2)); 2885 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2886 yyerror("expected yes or no."); 2887 else cfg_parser->cfg->ip_ratelimit_backoff = 2888 (strcmp($2, "yes")==0); 2889 free($2); 2890 } 2891 ; 2892 server_ratelimit_backoff: VAR_RATELIMIT_BACKOFF STRING_ARG 2893 { 2894 OUTYY(("P(server_ratelimit_backoff:%s)\n", $2)); 2895 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2896 yyerror("expected yes or no."); 2897 else cfg_parser->cfg->ratelimit_backoff = 2898 (strcmp($2, "yes")==0); 2899 free($2); 2900 } 2901 ; 2902 server_outbound_msg_retry: VAR_OUTBOUND_MSG_RETRY STRING_ARG 2903 { 2904 OUTYY(("P(server_outbound_msg_retry:%s)\n", $2)); 2905 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2906 yyerror("number expected"); 2907 else cfg_parser->cfg->outbound_msg_retry = atoi($2); 2908 free($2); 2909 } 2910 ; 2911 server_max_sent_count: VAR_MAX_SENT_COUNT STRING_ARG 2912 { 2913 OUTYY(("P(server_max_sent_count:%s)\n", $2)); 2914 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2915 yyerror("number expected"); 2916 else cfg_parser->cfg->max_sent_count = atoi($2); 2917 free($2); 2918 } 2919 ; 2920 server_max_query_restarts: VAR_MAX_QUERY_RESTARTS STRING_ARG 2921 { 2922 OUTYY(("P(server_max_query_restarts:%s)\n", $2)); 2923 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2924 yyerror("number expected"); 2925 else cfg_parser->cfg->max_query_restarts = atoi($2); 2926 free($2); 2927 } 2928 ; 2929 server_low_rtt: VAR_LOW_RTT STRING_ARG 2930 { 2931 OUTYY(("P(low-rtt option is deprecated, use fast-server-num instead)\n")); 2932 free($2); 2933 } 2934 ; 2935 server_fast_server_num: VAR_FAST_SERVER_NUM STRING_ARG 2936 { 2937 OUTYY(("P(server_fast_server_num:%s)\n", $2)); 2938 if(atoi($2) <= 0) 2939 yyerror("number expected"); 2940 else cfg_parser->cfg->fast_server_num = atoi($2); 2941 free($2); 2942 } 2943 ; 2944 server_fast_server_permil: VAR_FAST_SERVER_PERMIL STRING_ARG 2945 { 2946 OUTYY(("P(server_fast_server_permil:%s)\n", $2)); 2947 if(atoi($2) == 0 && strcmp($2, "0") != 0) 2948 yyerror("number expected"); 2949 else cfg_parser->cfg->fast_server_permil = atoi($2); 2950 free($2); 2951 } 2952 ; 2953 server_qname_minimisation: VAR_QNAME_MINIMISATION STRING_ARG 2954 { 2955 OUTYY(("P(server_qname_minimisation:%s)\n", $2)); 2956 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2957 yyerror("expected yes or no."); 2958 else cfg_parser->cfg->qname_minimisation = 2959 (strcmp($2, "yes")==0); 2960 free($2); 2961 } 2962 ; 2963 server_qname_minimisation_strict: VAR_QNAME_MINIMISATION_STRICT STRING_ARG 2964 { 2965 OUTYY(("P(server_qname_minimisation_strict:%s)\n", $2)); 2966 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2967 yyerror("expected yes or no."); 2968 else cfg_parser->cfg->qname_minimisation_strict = 2969 (strcmp($2, "yes")==0); 2970 free($2); 2971 } 2972 ; 2973 server_pad_responses: VAR_PAD_RESPONSES STRING_ARG 2974 { 2975 OUTYY(("P(server_pad_responses:%s)\n", $2)); 2976 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2977 yyerror("expected yes or no."); 2978 else cfg_parser->cfg->pad_responses = 2979 (strcmp($2, "yes")==0); 2980 free($2); 2981 } 2982 ; 2983 server_pad_responses_block_size: VAR_PAD_RESPONSES_BLOCK_SIZE STRING_ARG 2984 { 2985 OUTYY(("P(server_pad_responses_block_size:%s)\n", $2)); 2986 if(atoi($2) == 0) 2987 yyerror("number expected"); 2988 else cfg_parser->cfg->pad_responses_block_size = atoi($2); 2989 free($2); 2990 } 2991 ; 2992 server_pad_queries: VAR_PAD_QUERIES STRING_ARG 2993 { 2994 OUTYY(("P(server_pad_queries:%s)\n", $2)); 2995 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 2996 yyerror("expected yes or no."); 2997 else cfg_parser->cfg->pad_queries = 2998 (strcmp($2, "yes")==0); 2999 free($2); 3000 } 3001 ; 3002 server_pad_queries_block_size: VAR_PAD_QUERIES_BLOCK_SIZE STRING_ARG 3003 { 3004 OUTYY(("P(server_pad_queries_block_size:%s)\n", $2)); 3005 if(atoi($2) == 0) 3006 yyerror("number expected"); 3007 else cfg_parser->cfg->pad_queries_block_size = atoi($2); 3008 free($2); 3009 } 3010 ; 3011 server_ipsecmod_enabled: VAR_IPSECMOD_ENABLED STRING_ARG 3012 { 3013 #ifdef USE_IPSECMOD 3014 OUTYY(("P(server_ipsecmod_enabled:%s)\n", $2)); 3015 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3016 yyerror("expected yes or no."); 3017 else cfg_parser->cfg->ipsecmod_enabled = (strcmp($2, "yes")==0); 3018 #else 3019 OUTYY(("P(Compiled without IPsec module, ignoring)\n")); 3020 #endif 3021 free($2); 3022 } 3023 ; 3024 server_ipsecmod_ignore_bogus: VAR_IPSECMOD_IGNORE_BOGUS STRING_ARG 3025 { 3026 #ifdef USE_IPSECMOD 3027 OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", $2)); 3028 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3029 yyerror("expected yes or no."); 3030 else cfg_parser->cfg->ipsecmod_ignore_bogus = (strcmp($2, "yes")==0); 3031 #else 3032 OUTYY(("P(Compiled without IPsec module, ignoring)\n")); 3033 #endif 3034 free($2); 3035 } 3036 ; 3037 server_ipsecmod_hook: VAR_IPSECMOD_HOOK STRING_ARG 3038 { 3039 #ifdef USE_IPSECMOD 3040 OUTYY(("P(server_ipsecmod_hook:%s)\n", $2)); 3041 free(cfg_parser->cfg->ipsecmod_hook); 3042 cfg_parser->cfg->ipsecmod_hook = $2; 3043 #else 3044 OUTYY(("P(Compiled without IPsec module, ignoring)\n")); 3045 free($2); 3046 #endif 3047 } 3048 ; 3049 server_ipsecmod_max_ttl: VAR_IPSECMOD_MAX_TTL STRING_ARG 3050 { 3051 #ifdef USE_IPSECMOD 3052 OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", $2)); 3053 if(atoi($2) == 0 && strcmp($2, "0") != 0) 3054 yyerror("number expected"); 3055 else cfg_parser->cfg->ipsecmod_max_ttl = atoi($2); 3056 free($2); 3057 #else 3058 OUTYY(("P(Compiled without IPsec module, ignoring)\n")); 3059 free($2); 3060 #endif 3061 } 3062 ; 3063 server_ipsecmod_whitelist: VAR_IPSECMOD_WHITELIST STRING_ARG 3064 { 3065 #ifdef USE_IPSECMOD 3066 OUTYY(("P(server_ipsecmod_whitelist:%s)\n", $2)); 3067 if(!cfg_strlist_insert(&cfg_parser->cfg->ipsecmod_whitelist, $2)) 3068 yyerror("out of memory"); 3069 #else 3070 OUTYY(("P(Compiled without IPsec module, ignoring)\n")); 3071 free($2); 3072 #endif 3073 } 3074 ; 3075 server_ipsecmod_strict: VAR_IPSECMOD_STRICT STRING_ARG 3076 { 3077 #ifdef USE_IPSECMOD 3078 OUTYY(("P(server_ipsecmod_strict:%s)\n", $2)); 3079 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3080 yyerror("expected yes or no."); 3081 else cfg_parser->cfg->ipsecmod_strict = (strcmp($2, "yes")==0); 3082 free($2); 3083 #else 3084 OUTYY(("P(Compiled without IPsec module, ignoring)\n")); 3085 free($2); 3086 #endif 3087 } 3088 ; 3089 server_edns_client_string: VAR_EDNS_CLIENT_STRING STRING_ARG STRING_ARG 3090 { 3091 OUTYY(("P(server_edns_client_string:%s %s)\n", $2, $3)); 3092 if(!cfg_str2list_insert( 3093 &cfg_parser->cfg->edns_client_strings, $2, $3)) 3094 yyerror("out of memory"); 3095 } 3096 ; 3097 server_edns_client_string_opcode: VAR_EDNS_CLIENT_STRING_OPCODE STRING_ARG 3098 { 3099 OUTYY(("P(edns_client_string_opcode:%s)\n", $2)); 3100 if(atoi($2) == 0 && strcmp($2, "0") != 0) 3101 yyerror("option code expected"); 3102 else if(atoi($2) > 65535 || atoi($2) < 0) 3103 yyerror("option code must be in interval [0, 65535]"); 3104 else cfg_parser->cfg->edns_client_string_opcode = atoi($2); 3105 free($2); 3106 } 3107 ; 3108 server_ede: VAR_EDE STRING_ARG 3109 { 3110 OUTYY(("P(server_ede:%s)\n", $2)); 3111 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3112 yyerror("expected yes or no."); 3113 else cfg_parser->cfg->ede = (strcmp($2, "yes")==0); 3114 free($2); 3115 } 3116 ; 3117 server_dns_error_reporting: VAR_DNS_ERROR_REPORTING STRING_ARG 3118 { 3119 OUTYY(("P(server_dns_error_reporting:%s)\n", $2)); 3120 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3121 yyerror("expected yes or no."); 3122 else cfg_parser->cfg->dns_error_reporting = (strcmp($2, "yes")==0); 3123 free($2); 3124 } 3125 ; 3126 server_proxy_protocol_port: VAR_PROXY_PROTOCOL_PORT STRING_ARG 3127 { 3128 OUTYY(("P(server_proxy_protocol_port:%s)\n", $2)); 3129 if(!cfg_strlist_insert(&cfg_parser->cfg->proxy_protocol_port, $2)) 3130 yyerror("out of memory"); 3131 } 3132 ; 3133 stub_name: VAR_NAME STRING_ARG 3134 { 3135 OUTYY(("P(name:%s)\n", $2)); 3136 if(cfg_parser->cfg->stubs->name) 3137 yyerror("stub name override, there must be one name " 3138 "for one stub-zone"); 3139 free(cfg_parser->cfg->stubs->name); 3140 cfg_parser->cfg->stubs->name = $2; 3141 } 3142 ; 3143 stub_host: VAR_STUB_HOST STRING_ARG 3144 { 3145 OUTYY(("P(stub-host:%s)\n", $2)); 3146 if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, $2)) 3147 yyerror("out of memory"); 3148 } 3149 ; 3150 stub_addr: VAR_STUB_ADDR STRING_ARG 3151 { 3152 OUTYY(("P(stub-addr:%s)\n", $2)); 3153 if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, $2)) 3154 yyerror("out of memory"); 3155 } 3156 ; 3157 stub_first: VAR_STUB_FIRST STRING_ARG 3158 { 3159 OUTYY(("P(stub-first:%s)\n", $2)); 3160 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3161 yyerror("expected yes or no."); 3162 else cfg_parser->cfg->stubs->isfirst=(strcmp($2, "yes")==0); 3163 free($2); 3164 } 3165 ; 3166 stub_no_cache: VAR_STUB_NO_CACHE STRING_ARG 3167 { 3168 OUTYY(("P(stub-no-cache:%s)\n", $2)); 3169 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3170 yyerror("expected yes or no."); 3171 else cfg_parser->cfg->stubs->no_cache=(strcmp($2, "yes")==0); 3172 free($2); 3173 } 3174 ; 3175 stub_ssl_upstream: VAR_STUB_SSL_UPSTREAM STRING_ARG 3176 { 3177 OUTYY(("P(stub-ssl-upstream:%s)\n", $2)); 3178 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3179 yyerror("expected yes or no."); 3180 else cfg_parser->cfg->stubs->ssl_upstream = 3181 (strcmp($2, "yes")==0); 3182 free($2); 3183 } 3184 ; 3185 stub_tcp_upstream: VAR_STUB_TCP_UPSTREAM STRING_ARG 3186 { 3187 OUTYY(("P(stub-tcp-upstream:%s)\n", $2)); 3188 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3189 yyerror("expected yes or no."); 3190 else cfg_parser->cfg->stubs->tcp_upstream = 3191 (strcmp($2, "yes")==0); 3192 free($2); 3193 } 3194 ; 3195 stub_prime: VAR_STUB_PRIME STRING_ARG 3196 { 3197 OUTYY(("P(stub-prime:%s)\n", $2)); 3198 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3199 yyerror("expected yes or no."); 3200 else cfg_parser->cfg->stubs->isprime = 3201 (strcmp($2, "yes")==0); 3202 free($2); 3203 } 3204 ; 3205 forward_name: VAR_NAME STRING_ARG 3206 { 3207 OUTYY(("P(name:%s)\n", $2)); 3208 if(cfg_parser->cfg->forwards->name) 3209 yyerror("forward name override, there must be one " 3210 "name for one forward-zone"); 3211 free(cfg_parser->cfg->forwards->name); 3212 cfg_parser->cfg->forwards->name = $2; 3213 } 3214 ; 3215 forward_host: VAR_FORWARD_HOST STRING_ARG 3216 { 3217 OUTYY(("P(forward-host:%s)\n", $2)); 3218 if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, $2)) 3219 yyerror("out of memory"); 3220 } 3221 ; 3222 forward_addr: VAR_FORWARD_ADDR STRING_ARG 3223 { 3224 OUTYY(("P(forward-addr:%s)\n", $2)); 3225 if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, $2)) 3226 yyerror("out of memory"); 3227 } 3228 ; 3229 forward_first: VAR_FORWARD_FIRST STRING_ARG 3230 { 3231 OUTYY(("P(forward-first:%s)\n", $2)); 3232 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3233 yyerror("expected yes or no."); 3234 else cfg_parser->cfg->forwards->isfirst=(strcmp($2, "yes")==0); 3235 free($2); 3236 } 3237 ; 3238 forward_no_cache: VAR_FORWARD_NO_CACHE STRING_ARG 3239 { 3240 OUTYY(("P(forward-no-cache:%s)\n", $2)); 3241 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3242 yyerror("expected yes or no."); 3243 else cfg_parser->cfg->forwards->no_cache=(strcmp($2, "yes")==0); 3244 free($2); 3245 } 3246 ; 3247 forward_ssl_upstream: VAR_FORWARD_SSL_UPSTREAM STRING_ARG 3248 { 3249 OUTYY(("P(forward-ssl-upstream:%s)\n", $2)); 3250 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3251 yyerror("expected yes or no."); 3252 else cfg_parser->cfg->forwards->ssl_upstream = 3253 (strcmp($2, "yes")==0); 3254 free($2); 3255 } 3256 ; 3257 forward_tcp_upstream: VAR_FORWARD_TCP_UPSTREAM STRING_ARG 3258 { 3259 OUTYY(("P(forward-tcp-upstream:%s)\n", $2)); 3260 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3261 yyerror("expected yes or no."); 3262 else cfg_parser->cfg->forwards->tcp_upstream = 3263 (strcmp($2, "yes")==0); 3264 free($2); 3265 } 3266 ; 3267 auth_name: VAR_NAME STRING_ARG 3268 { 3269 OUTYY(("P(name:%s)\n", $2)); 3270 if(cfg_parser->cfg->auths->name) 3271 yyerror("auth name override, there must be one name " 3272 "for one auth-zone"); 3273 free(cfg_parser->cfg->auths->name); 3274 cfg_parser->cfg->auths->name = $2; 3275 } 3276 ; 3277 auth_zonefile: VAR_ZONEFILE STRING_ARG 3278 { 3279 OUTYY(("P(zonefile:%s)\n", $2)); 3280 free(cfg_parser->cfg->auths->zonefile); 3281 cfg_parser->cfg->auths->zonefile = $2; 3282 } 3283 ; 3284 auth_master: VAR_MASTER STRING_ARG 3285 { 3286 OUTYY(("P(master:%s)\n", $2)); 3287 if(!cfg_strlist_insert(&cfg_parser->cfg->auths->masters, $2)) 3288 yyerror("out of memory"); 3289 } 3290 ; 3291 auth_url: VAR_URL STRING_ARG 3292 { 3293 OUTYY(("P(url:%s)\n", $2)); 3294 if(!cfg_strlist_insert(&cfg_parser->cfg->auths->urls, $2)) 3295 yyerror("out of memory"); 3296 } 3297 ; 3298 auth_allow_notify: VAR_ALLOW_NOTIFY STRING_ARG 3299 { 3300 OUTYY(("P(allow-notify:%s)\n", $2)); 3301 if(!cfg_strlist_insert(&cfg_parser->cfg->auths->allow_notify, 3302 $2)) 3303 yyerror("out of memory"); 3304 } 3305 ; 3306 auth_zonemd_check: VAR_ZONEMD_CHECK STRING_ARG 3307 { 3308 OUTYY(("P(zonemd-check:%s)\n", $2)); 3309 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3310 yyerror("expected yes or no."); 3311 else cfg_parser->cfg->auths->zonemd_check = 3312 (strcmp($2, "yes")==0); 3313 free($2); 3314 } 3315 ; 3316 auth_zonemd_reject_absence: VAR_ZONEMD_REJECT_ABSENCE STRING_ARG 3317 { 3318 OUTYY(("P(zonemd-reject-absence:%s)\n", $2)); 3319 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3320 yyerror("expected yes or no."); 3321 else cfg_parser->cfg->auths->zonemd_reject_absence = 3322 (strcmp($2, "yes")==0); 3323 free($2); 3324 } 3325 ; 3326 auth_for_downstream: VAR_FOR_DOWNSTREAM STRING_ARG 3327 { 3328 OUTYY(("P(for-downstream:%s)\n", $2)); 3329 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3330 yyerror("expected yes or no."); 3331 else cfg_parser->cfg->auths->for_downstream = 3332 (strcmp($2, "yes")==0); 3333 free($2); 3334 } 3335 ; 3336 auth_for_upstream: VAR_FOR_UPSTREAM STRING_ARG 3337 { 3338 OUTYY(("P(for-upstream:%s)\n", $2)); 3339 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3340 yyerror("expected yes or no."); 3341 else cfg_parser->cfg->auths->for_upstream = 3342 (strcmp($2, "yes")==0); 3343 free($2); 3344 } 3345 ; 3346 auth_fallback_enabled: VAR_FALLBACK_ENABLED STRING_ARG 3347 { 3348 OUTYY(("P(fallback-enabled:%s)\n", $2)); 3349 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3350 yyerror("expected yes or no."); 3351 else cfg_parser->cfg->auths->fallback_enabled = 3352 (strcmp($2, "yes")==0); 3353 free($2); 3354 } 3355 ; 3356 auth_max_transfer_size: VAR_MAX_TRANSFER_SIZE STRING_ARG 3357 { 3358 OUTYY(("P(max-transfer-size:%s)\n", $2)); 3359 if(!cfg_parse_memsize($2, &cfg_parser->cfg->auths->max_transfer_size)) 3360 yyerror("memory size expected"); 3361 free($2); 3362 } 3363 ; 3364 auth_max_transfer_time: VAR_MAX_TRANSFER_TIME STRING_ARG 3365 { 3366 OUTYY(("P(max-transfer-time:%s)\n", $2)); 3367 if(atoi($2) == 0 && strcmp($2, "0") != 0) 3368 yyerror("number expected"); 3369 else cfg_parser->cfg->auths->max_transfer_time = atoi($2); 3370 free($2); 3371 } 3372 ; 3373 view_name: VAR_NAME STRING_ARG 3374 { 3375 OUTYY(("P(name:%s)\n", $2)); 3376 if(cfg_parser->cfg->views->name) 3377 yyerror("view name override, there must be one " 3378 "name for one view"); 3379 free(cfg_parser->cfg->views->name); 3380 cfg_parser->cfg->views->name = $2; 3381 } 3382 ; 3383 view_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG 3384 { 3385 OUTYY(("P(view_local_zone:%s %s)\n", $2, $3)); 3386 if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 && 3387 strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 && 3388 strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0 3389 && strcmp($3, "typetransparent")!=0 3390 && strcmp($3, "always_transparent")!=0 3391 && strcmp($3, "always_refuse")!=0 3392 && strcmp($3, "always_nxdomain")!=0 3393 && strcmp($3, "always_nodata")!=0 3394 && strcmp($3, "always_deny")!=0 3395 && strcmp($3, "always_null")!=0 3396 && strcmp($3, "noview")!=0 3397 && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0 3398 && strcmp($3, "inform_redirect") != 0 3399 && strcmp($3, "ipset") != 0) { 3400 yyerror("local-zone type: expected static, deny, " 3401 "refuse, redirect, transparent, " 3402 "typetransparent, inform, inform_deny, " 3403 "inform_redirect, always_transparent, " 3404 "always_refuse, always_nxdomain, " 3405 "always_nodata, always_deny, always_null, " 3406 "noview, nodefault or ipset"); 3407 free($2); 3408 free($3); 3409 } else if(strcmp($3, "nodefault")==0) { 3410 if(!cfg_strlist_insert(&cfg_parser->cfg->views-> 3411 local_zones_nodefault, $2)) 3412 yyerror("out of memory"); 3413 free($3); 3414 #ifdef USE_IPSET 3415 } else if(strcmp($3, "ipset")==0) { 3416 size_t len = strlen($2); 3417 /* Make sure to add the trailing dot. 3418 * These are str compared to domain names. */ 3419 if($2[len-1] != '.') { 3420 char* prev = $2; 3421 if(!($2 = realloc($2, len+2))) { 3422 yyerror("out of memory"); 3423 free(prev); 3424 } else { 3425 $2[len] = '.'; 3426 $2[len+1] = 0; 3427 } 3428 } 3429 if(!cfg_strlist_insert(&cfg_parser->cfg->views-> 3430 local_zones_ipset, $2)) 3431 yyerror("out of memory"); 3432 free($3); 3433 #endif 3434 } else { 3435 if(!cfg_str2list_insert( 3436 &cfg_parser->cfg->views->local_zones, 3437 $2, $3)) 3438 yyerror("out of memory"); 3439 } 3440 } 3441 ; 3442 view_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG 3443 { 3444 OUTYY(("P(view_response_ip:%s %s)\n", $2, $3)); 3445 validate_respip_action($3); 3446 if(!cfg_str2list_insert( 3447 &cfg_parser->cfg->views->respip_actions, $2, $3)) 3448 yyerror("out of memory"); 3449 } 3450 ; 3451 view_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG 3452 { 3453 OUTYY(("P(view_response_ip_data:%s)\n", $2)); 3454 if(!cfg_str2list_insert( 3455 &cfg_parser->cfg->views->respip_data, $2, $3)) 3456 yyerror("out of memory"); 3457 } 3458 ; 3459 view_local_data: VAR_LOCAL_DATA STRING_ARG 3460 { 3461 OUTYY(("P(view_local_data:%s)\n", $2)); 3462 if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, $2)) { 3463 yyerror("out of memory"); 3464 } 3465 } 3466 ; 3467 view_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG 3468 { 3469 char* ptr; 3470 OUTYY(("P(view_local_data_ptr:%s)\n", $2)); 3471 ptr = cfg_ptr_reverse($2); 3472 free($2); 3473 if(ptr) { 3474 if(!cfg_strlist_insert(&cfg_parser->cfg->views-> 3475 local_data, ptr)) 3476 yyerror("out of memory"); 3477 } else { 3478 yyerror("local-data-ptr could not be reversed"); 3479 } 3480 } 3481 ; 3482 view_first: VAR_VIEW_FIRST STRING_ARG 3483 { 3484 OUTYY(("P(view-first:%s)\n", $2)); 3485 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3486 yyerror("expected yes or no."); 3487 else cfg_parser->cfg->views->isfirst=(strcmp($2, "yes")==0); 3488 free($2); 3489 } 3490 ; 3491 rcstart: VAR_REMOTE_CONTROL 3492 { 3493 OUTYY(("\nP(remote-control:)\n")); 3494 cfg_parser->started_toplevel = 1; 3495 } 3496 ; 3497 contents_rc: contents_rc content_rc 3498 | ; 3499 content_rc: rc_control_enable | rc_control_interface | rc_control_port | 3500 rc_server_key_file | rc_server_cert_file | rc_control_key_file | 3501 rc_control_cert_file | rc_control_use_cert 3502 ; 3503 rc_control_enable: VAR_CONTROL_ENABLE STRING_ARG 3504 { 3505 OUTYY(("P(control_enable:%s)\n", $2)); 3506 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3507 yyerror("expected yes or no."); 3508 else cfg_parser->cfg->remote_control_enable = 3509 (strcmp($2, "yes")==0); 3510 free($2); 3511 } 3512 ; 3513 rc_control_port: VAR_CONTROL_PORT STRING_ARG 3514 { 3515 OUTYY(("P(control_port:%s)\n", $2)); 3516 if(atoi($2) == 0) 3517 yyerror("control port number expected"); 3518 else cfg_parser->cfg->control_port = atoi($2); 3519 free($2); 3520 } 3521 ; 3522 rc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG 3523 { 3524 OUTYY(("P(control_interface:%s)\n", $2)); 3525 if(!cfg_strlist_append(&cfg_parser->cfg->control_ifs, $2)) 3526 yyerror("out of memory"); 3527 } 3528 ; 3529 rc_control_use_cert: VAR_CONTROL_USE_CERT STRING_ARG 3530 { 3531 OUTYY(("P(control_use_cert:%s)\n", $2)); 3532 cfg_parser->cfg->control_use_cert = (strcmp($2, "yes")==0); 3533 free($2); 3534 } 3535 ; 3536 rc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG 3537 { 3538 OUTYY(("P(rc_server_key_file:%s)\n", $2)); 3539 free(cfg_parser->cfg->server_key_file); 3540 cfg_parser->cfg->server_key_file = $2; 3541 } 3542 ; 3543 rc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG 3544 { 3545 OUTYY(("P(rc_server_cert_file:%s)\n", $2)); 3546 free(cfg_parser->cfg->server_cert_file); 3547 cfg_parser->cfg->server_cert_file = $2; 3548 } 3549 ; 3550 rc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG 3551 { 3552 OUTYY(("P(rc_control_key_file:%s)\n", $2)); 3553 free(cfg_parser->cfg->control_key_file); 3554 cfg_parser->cfg->control_key_file = $2; 3555 } 3556 ; 3557 rc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG 3558 { 3559 OUTYY(("P(rc_control_cert_file:%s)\n", $2)); 3560 free(cfg_parser->cfg->control_cert_file); 3561 cfg_parser->cfg->control_cert_file = $2; 3562 } 3563 ; 3564 dtstart: VAR_DNSTAP 3565 { 3566 OUTYY(("\nP(dnstap:)\n")); 3567 cfg_parser->started_toplevel = 1; 3568 } 3569 ; 3570 contents_dt: contents_dt content_dt 3571 | ; 3572 content_dt: dt_dnstap_enable | dt_dnstap_socket_path | dt_dnstap_bidirectional | 3573 dt_dnstap_ip | dt_dnstap_tls | dt_dnstap_tls_server_name | 3574 dt_dnstap_tls_cert_bundle | 3575 dt_dnstap_tls_client_key_file | dt_dnstap_tls_client_cert_file | 3576 dt_dnstap_send_identity | dt_dnstap_send_version | 3577 dt_dnstap_identity | dt_dnstap_version | 3578 dt_dnstap_log_resolver_query_messages | 3579 dt_dnstap_log_resolver_response_messages | 3580 dt_dnstap_log_client_query_messages | 3581 dt_dnstap_log_client_response_messages | 3582 dt_dnstap_log_forwarder_query_messages | 3583 dt_dnstap_log_forwarder_response_messages | 3584 dt_dnstap_sample_rate 3585 ; 3586 dt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG 3587 { 3588 OUTYY(("P(dt_dnstap_enable:%s)\n", $2)); 3589 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3590 yyerror("expected yes or no."); 3591 else cfg_parser->cfg->dnstap = (strcmp($2, "yes")==0); 3592 free($2); 3593 } 3594 ; 3595 dt_dnstap_bidirectional: VAR_DNSTAP_BIDIRECTIONAL STRING_ARG 3596 { 3597 OUTYY(("P(dt_dnstap_bidirectional:%s)\n", $2)); 3598 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3599 yyerror("expected yes or no."); 3600 else cfg_parser->cfg->dnstap_bidirectional = 3601 (strcmp($2, "yes")==0); 3602 free($2); 3603 } 3604 ; 3605 dt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG 3606 { 3607 OUTYY(("P(dt_dnstap_socket_path:%s)\n", $2)); 3608 free(cfg_parser->cfg->dnstap_socket_path); 3609 cfg_parser->cfg->dnstap_socket_path = $2; 3610 } 3611 ; 3612 dt_dnstap_ip: VAR_DNSTAP_IP STRING_ARG 3613 { 3614 OUTYY(("P(dt_dnstap_ip:%s)\n", $2)); 3615 free(cfg_parser->cfg->dnstap_ip); 3616 cfg_parser->cfg->dnstap_ip = $2; 3617 } 3618 ; 3619 dt_dnstap_tls: VAR_DNSTAP_TLS STRING_ARG 3620 { 3621 OUTYY(("P(dt_dnstap_tls:%s)\n", $2)); 3622 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3623 yyerror("expected yes or no."); 3624 else cfg_parser->cfg->dnstap_tls = (strcmp($2, "yes")==0); 3625 free($2); 3626 } 3627 ; 3628 dt_dnstap_tls_server_name: VAR_DNSTAP_TLS_SERVER_NAME STRING_ARG 3629 { 3630 OUTYY(("P(dt_dnstap_tls_server_name:%s)\n", $2)); 3631 free(cfg_parser->cfg->dnstap_tls_server_name); 3632 cfg_parser->cfg->dnstap_tls_server_name = $2; 3633 } 3634 ; 3635 dt_dnstap_tls_cert_bundle: VAR_DNSTAP_TLS_CERT_BUNDLE STRING_ARG 3636 { 3637 OUTYY(("P(dt_dnstap_tls_cert_bundle:%s)\n", $2)); 3638 free(cfg_parser->cfg->dnstap_tls_cert_bundle); 3639 cfg_parser->cfg->dnstap_tls_cert_bundle = $2; 3640 } 3641 ; 3642 dt_dnstap_tls_client_key_file: VAR_DNSTAP_TLS_CLIENT_KEY_FILE STRING_ARG 3643 { 3644 OUTYY(("P(dt_dnstap_tls_client_key_file:%s)\n", $2)); 3645 free(cfg_parser->cfg->dnstap_tls_client_key_file); 3646 cfg_parser->cfg->dnstap_tls_client_key_file = $2; 3647 } 3648 ; 3649 dt_dnstap_tls_client_cert_file: VAR_DNSTAP_TLS_CLIENT_CERT_FILE STRING_ARG 3650 { 3651 OUTYY(("P(dt_dnstap_tls_client_cert_file:%s)\n", $2)); 3652 free(cfg_parser->cfg->dnstap_tls_client_cert_file); 3653 cfg_parser->cfg->dnstap_tls_client_cert_file = $2; 3654 } 3655 ; 3656 dt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG 3657 { 3658 OUTYY(("P(dt_dnstap_send_identity:%s)\n", $2)); 3659 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3660 yyerror("expected yes or no."); 3661 else cfg_parser->cfg->dnstap_send_identity = (strcmp($2, "yes")==0); 3662 free($2); 3663 } 3664 ; 3665 dt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG 3666 { 3667 OUTYY(("P(dt_dnstap_send_version:%s)\n", $2)); 3668 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3669 yyerror("expected yes or no."); 3670 else cfg_parser->cfg->dnstap_send_version = (strcmp($2, "yes")==0); 3671 free($2); 3672 } 3673 ; 3674 dt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG 3675 { 3676 OUTYY(("P(dt_dnstap_identity:%s)\n", $2)); 3677 free(cfg_parser->cfg->dnstap_identity); 3678 cfg_parser->cfg->dnstap_identity = $2; 3679 } 3680 ; 3681 dt_dnstap_version: VAR_DNSTAP_VERSION STRING_ARG 3682 { 3683 OUTYY(("P(dt_dnstap_version:%s)\n", $2)); 3684 free(cfg_parser->cfg->dnstap_version); 3685 cfg_parser->cfg->dnstap_version = $2; 3686 } 3687 ; 3688 dt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES STRING_ARG 3689 { 3690 OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", $2)); 3691 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3692 yyerror("expected yes or no."); 3693 else cfg_parser->cfg->dnstap_log_resolver_query_messages = 3694 (strcmp($2, "yes")==0); 3695 free($2); 3696 } 3697 ; 3698 dt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG 3699 { 3700 OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", $2)); 3701 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3702 yyerror("expected yes or no."); 3703 else cfg_parser->cfg->dnstap_log_resolver_response_messages = 3704 (strcmp($2, "yes")==0); 3705 free($2); 3706 } 3707 ; 3708 dt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG 3709 { 3710 OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", $2)); 3711 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3712 yyerror("expected yes or no."); 3713 else cfg_parser->cfg->dnstap_log_client_query_messages = 3714 (strcmp($2, "yes")==0); 3715 free($2); 3716 } 3717 ; 3718 dt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG 3719 { 3720 OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", $2)); 3721 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3722 yyerror("expected yes or no."); 3723 else cfg_parser->cfg->dnstap_log_client_response_messages = 3724 (strcmp($2, "yes")==0); 3725 free($2); 3726 } 3727 ; 3728 dt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG 3729 { 3730 OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", $2)); 3731 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3732 yyerror("expected yes or no."); 3733 else cfg_parser->cfg->dnstap_log_forwarder_query_messages = 3734 (strcmp($2, "yes")==0); 3735 free($2); 3736 } 3737 ; 3738 dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG 3739 { 3740 OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", $2)); 3741 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3742 yyerror("expected yes or no."); 3743 else cfg_parser->cfg->dnstap_log_forwarder_response_messages = 3744 (strcmp($2, "yes")==0); 3745 free($2); 3746 } 3747 ; 3748 dt_dnstap_sample_rate: VAR_DNSTAP_SAMPLE_RATE STRING_ARG 3749 { 3750 OUTYY(("P(dt_dnstap_sample_rate:%s)\n", $2)); 3751 if(atoi($2) == 0 && strcmp($2, "0") != 0) 3752 yyerror("number expected"); 3753 else if(atoi($2) < 0) 3754 yyerror("dnstap sample rate too small"); 3755 else cfg_parser->cfg->dnstap_sample_rate = atoi($2); 3756 free($2); 3757 } 3758 ; 3759 pythonstart: VAR_PYTHON 3760 { 3761 OUTYY(("\nP(python:)\n")); 3762 cfg_parser->started_toplevel = 1; 3763 } 3764 ; 3765 contents_py: contents_py content_py 3766 | ; 3767 content_py: py_script 3768 ; 3769 py_script: VAR_PYTHON_SCRIPT STRING_ARG 3770 { 3771 OUTYY(("P(python-script:%s)\n", $2)); 3772 if(!cfg_strlist_append_ex(&cfg_parser->cfg->python_script, $2)) 3773 yyerror("out of memory"); 3774 } 3775 ; 3776 dynlibstart: VAR_DYNLIB 3777 { 3778 OUTYY(("\nP(dynlib:)\n")); 3779 cfg_parser->started_toplevel = 1; 3780 } 3781 ; 3782 contents_dl: contents_dl content_dl 3783 | ; 3784 content_dl: dl_file 3785 ; 3786 dl_file: VAR_DYNLIB_FILE STRING_ARG 3787 { 3788 OUTYY(("P(dynlib-file:%s)\n", $2)); 3789 if(!cfg_strlist_append_ex(&cfg_parser->cfg->dynlib_file, $2)) 3790 yyerror("out of memory"); 3791 } 3792 ; 3793 server_disable_dnssec_lame_check: VAR_DISABLE_DNSSEC_LAME_CHECK STRING_ARG 3794 { 3795 OUTYY(("P(disable_dnssec_lame_check:%s)\n", $2)); 3796 if (strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3797 yyerror("expected yes or no."); 3798 else cfg_parser->cfg->disable_dnssec_lame_check = 3799 (strcmp($2, "yes")==0); 3800 free($2); 3801 } 3802 ; 3803 server_log_identity: VAR_LOG_IDENTITY STRING_ARG 3804 { 3805 OUTYY(("P(server_log_identity:%s)\n", $2)); 3806 free(cfg_parser->cfg->log_identity); 3807 cfg_parser->cfg->log_identity = $2; 3808 } 3809 ; 3810 server_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG 3811 { 3812 OUTYY(("P(server_response_ip:%s %s)\n", $2, $3)); 3813 validate_respip_action($3); 3814 if(!cfg_str2list_insert(&cfg_parser->cfg->respip_actions, 3815 $2, $3)) 3816 yyerror("out of memory"); 3817 } 3818 ; 3819 server_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG 3820 { 3821 OUTYY(("P(server_response_ip_data:%s)\n", $2)); 3822 if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data, 3823 $2, $3)) 3824 yyerror("out of memory"); 3825 } 3826 ; 3827 dnscstart: VAR_DNSCRYPT 3828 { 3829 OUTYY(("\nP(dnscrypt:)\n")); 3830 cfg_parser->started_toplevel = 1; 3831 } 3832 ; 3833 contents_dnsc: contents_dnsc content_dnsc 3834 | ; 3835 content_dnsc: 3836 dnsc_dnscrypt_enable | dnsc_dnscrypt_port | dnsc_dnscrypt_provider | 3837 dnsc_dnscrypt_secret_key | dnsc_dnscrypt_provider_cert | 3838 dnsc_dnscrypt_provider_cert_rotated | 3839 dnsc_dnscrypt_shared_secret_cache_size | 3840 dnsc_dnscrypt_shared_secret_cache_slabs | 3841 dnsc_dnscrypt_nonce_cache_size | 3842 dnsc_dnscrypt_nonce_cache_slabs 3843 ; 3844 dnsc_dnscrypt_enable: VAR_DNSCRYPT_ENABLE STRING_ARG 3845 { 3846 OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", $2)); 3847 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3848 yyerror("expected yes or no."); 3849 else cfg_parser->cfg->dnscrypt = (strcmp($2, "yes")==0); 3850 free($2); 3851 } 3852 ; 3853 dnsc_dnscrypt_port: VAR_DNSCRYPT_PORT STRING_ARG 3854 { 3855 OUTYY(("P(dnsc_dnscrypt_port:%s)\n", $2)); 3856 if(atoi($2) == 0) 3857 yyerror("port number expected"); 3858 else cfg_parser->cfg->dnscrypt_port = atoi($2); 3859 free($2); 3860 } 3861 ; 3862 dnsc_dnscrypt_provider: VAR_DNSCRYPT_PROVIDER STRING_ARG 3863 { 3864 OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", $2)); 3865 free(cfg_parser->cfg->dnscrypt_provider); 3866 cfg_parser->cfg->dnscrypt_provider = $2; 3867 } 3868 ; 3869 dnsc_dnscrypt_provider_cert: VAR_DNSCRYPT_PROVIDER_CERT STRING_ARG 3870 { 3871 OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", $2)); 3872 if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_provider_cert, $2)) { 3873 log_warn("dnscrypt-provider-cert %s is a duplicate", $2); 3874 free($2); 3875 } else if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert, $2)) { 3876 yyerror("out of memory"); 3877 } 3878 } 3879 ; 3880 dnsc_dnscrypt_provider_cert_rotated: VAR_DNSCRYPT_PROVIDER_CERT_ROTATED STRING_ARG 3881 { 3882 OUTYY(("P(dnsc_dnscrypt_provider_cert_rotated:%s)\n", $2)); 3883 if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert_rotated, $2)) 3884 yyerror("out of memory"); 3885 } 3886 ; 3887 dnsc_dnscrypt_secret_key: VAR_DNSCRYPT_SECRET_KEY STRING_ARG 3888 { 3889 OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", $2)); 3890 if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_secret_key, $2)) { 3891 log_warn("dnscrypt-secret-key: %s is a duplicate", $2); 3892 free($2); 3893 } else if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_secret_key, $2)) { 3894 yyerror("out of memory"); 3895 } 3896 } 3897 ; 3898 dnsc_dnscrypt_shared_secret_cache_size: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE STRING_ARG 3899 { 3900 OUTYY(("P(dnscrypt_shared_secret_cache_size:%s)\n", $2)); 3901 if(!cfg_parse_memsize($2, &cfg_parser->cfg->dnscrypt_shared_secret_cache_size)) 3902 yyerror("memory size expected"); 3903 free($2); 3904 } 3905 ; 3906 dnsc_dnscrypt_shared_secret_cache_slabs: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS STRING_ARG 3907 { 3908 OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", $2)); 3909 if(atoi($2) == 0) { 3910 yyerror("number expected"); 3911 } else { 3912 cfg_parser->cfg->dnscrypt_shared_secret_cache_slabs = atoi($2); 3913 if(!is_pow2(cfg_parser->cfg->dnscrypt_shared_secret_cache_slabs)) 3914 yyerror("must be a power of 2"); 3915 } 3916 free($2); 3917 } 3918 ; 3919 dnsc_dnscrypt_nonce_cache_size: VAR_DNSCRYPT_NONCE_CACHE_SIZE STRING_ARG 3920 { 3921 OUTYY(("P(dnscrypt_nonce_cache_size:%s)\n", $2)); 3922 if(!cfg_parse_memsize($2, &cfg_parser->cfg->dnscrypt_nonce_cache_size)) 3923 yyerror("memory size expected"); 3924 free($2); 3925 } 3926 ; 3927 dnsc_dnscrypt_nonce_cache_slabs: VAR_DNSCRYPT_NONCE_CACHE_SLABS STRING_ARG 3928 { 3929 OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", $2)); 3930 if(atoi($2) == 0) { 3931 yyerror("number expected"); 3932 } else { 3933 cfg_parser->cfg->dnscrypt_nonce_cache_slabs = atoi($2); 3934 if(!is_pow2(cfg_parser->cfg->dnscrypt_nonce_cache_slabs)) 3935 yyerror("must be a power of 2"); 3936 } 3937 free($2); 3938 } 3939 ; 3940 cachedbstart: VAR_CACHEDB 3941 { 3942 OUTYY(("\nP(cachedb:)\n")); 3943 cfg_parser->started_toplevel = 1; 3944 } 3945 ; 3946 contents_cachedb: contents_cachedb content_cachedb 3947 | ; 3948 content_cachedb: cachedb_backend_name | cachedb_secret_seed | 3949 redis_server_host | redis_replica_server_host | 3950 redis_server_port | redis_replica_server_port | 3951 redis_timeout | redis_replica_timeout | 3952 redis_command_timeout | redis_replica_command_timeout | 3953 redis_connect_timeout | redis_replica_connect_timeout | 3954 redis_server_path | redis_replica_server_path | 3955 redis_server_password | redis_replica_server_password | 3956 redis_logical_db | redis_replica_logical_db | 3957 cachedb_no_store | redis_expire_records | 3958 cachedb_check_when_serve_expired 3959 ; 3960 cachedb_backend_name: VAR_CACHEDB_BACKEND STRING_ARG 3961 { 3962 #ifdef USE_CACHEDB 3963 OUTYY(("P(backend:%s)\n", $2)); 3964 free(cfg_parser->cfg->cachedb_backend); 3965 cfg_parser->cfg->cachedb_backend = $2; 3966 #else 3967 OUTYY(("P(Compiled without cachedb, ignoring)\n")); 3968 free($2); 3969 #endif 3970 } 3971 ; 3972 cachedb_secret_seed: VAR_CACHEDB_SECRETSEED STRING_ARG 3973 { 3974 #ifdef USE_CACHEDB 3975 OUTYY(("P(secret-seed:%s)\n", $2)); 3976 free(cfg_parser->cfg->cachedb_secret); 3977 cfg_parser->cfg->cachedb_secret = $2; 3978 #else 3979 OUTYY(("P(Compiled without cachedb, ignoring)\n")); 3980 free($2); 3981 #endif 3982 } 3983 ; 3984 cachedb_no_store: VAR_CACHEDB_NO_STORE STRING_ARG 3985 { 3986 #ifdef USE_CACHEDB 3987 OUTYY(("P(cachedb_no_store:%s)\n", $2)); 3988 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 3989 yyerror("expected yes or no."); 3990 else cfg_parser->cfg->cachedb_no_store = (strcmp($2, "yes")==0); 3991 #else 3992 OUTYY(("P(Compiled without cachedb, ignoring)\n")); 3993 #endif 3994 free($2); 3995 } 3996 ; 3997 cachedb_check_when_serve_expired: VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED STRING_ARG 3998 { 3999 #ifdef USE_CACHEDB 4000 OUTYY(("P(cachedb_check_when_serve_expired:%s)\n", $2)); 4001 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 4002 yyerror("expected yes or no."); 4003 else cfg_parser->cfg->cachedb_check_when_serve_expired = (strcmp($2, "yes")==0); 4004 #else 4005 OUTYY(("P(Compiled without cachedb, ignoring)\n")); 4006 #endif 4007 free($2); 4008 } 4009 ; 4010 redis_server_host: VAR_CACHEDB_REDISHOST STRING_ARG 4011 { 4012 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4013 OUTYY(("P(redis_server_host:%s)\n", $2)); 4014 free(cfg_parser->cfg->redis_server_host); 4015 cfg_parser->cfg->redis_server_host = $2; 4016 #else 4017 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4018 free($2); 4019 #endif 4020 } 4021 ; 4022 redis_replica_server_host: VAR_CACHEDB_REDISREPLICAHOST STRING_ARG 4023 { 4024 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4025 OUTYY(("P(redis_replica_server_host:%s)\n", $2)); 4026 free(cfg_parser->cfg->redis_replica_server_host); 4027 cfg_parser->cfg->redis_replica_server_host = $2; 4028 #else 4029 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4030 free($2); 4031 #endif 4032 } 4033 ; 4034 redis_server_port: VAR_CACHEDB_REDISPORT STRING_ARG 4035 { 4036 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4037 int port; 4038 OUTYY(("P(redis_server_port:%s)\n", $2)); 4039 port = atoi($2); 4040 if(port == 0 || port < 0 || port > 65535) 4041 yyerror("valid redis server port number expected"); 4042 else cfg_parser->cfg->redis_server_port = port; 4043 #else 4044 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4045 #endif 4046 free($2); 4047 } 4048 ; 4049 redis_replica_server_port: VAR_CACHEDB_REDISREPLICAPORT STRING_ARG 4050 { 4051 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4052 int port; 4053 OUTYY(("P(redis_replica_server_port:%s)\n", $2)); 4054 port = atoi($2); 4055 if(port == 0 || port < 0 || port > 65535) 4056 yyerror("valid redis server port number expected"); 4057 else cfg_parser->cfg->redis_replica_server_port = port; 4058 #else 4059 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4060 #endif 4061 free($2); 4062 } 4063 ; 4064 redis_server_path: VAR_CACHEDB_REDISPATH STRING_ARG 4065 { 4066 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4067 OUTYY(("P(redis_server_path:%s)\n", $2)); 4068 free(cfg_parser->cfg->redis_server_path); 4069 cfg_parser->cfg->redis_server_path = $2; 4070 #else 4071 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4072 free($2); 4073 #endif 4074 } 4075 ; 4076 redis_replica_server_path: VAR_CACHEDB_REDISREPLICAPATH STRING_ARG 4077 { 4078 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4079 OUTYY(("P(redis_replica_server_path:%s)\n", $2)); 4080 free(cfg_parser->cfg->redis_replica_server_path); 4081 cfg_parser->cfg->redis_replica_server_path = $2; 4082 #else 4083 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4084 free($2); 4085 #endif 4086 } 4087 ; 4088 redis_server_password: VAR_CACHEDB_REDISPASSWORD STRING_ARG 4089 { 4090 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4091 OUTYY(("P(redis_server_password:%s)\n", $2)); 4092 free(cfg_parser->cfg->redis_server_password); 4093 cfg_parser->cfg->redis_server_password = $2; 4094 #else 4095 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4096 free($2); 4097 #endif 4098 } 4099 ; 4100 redis_replica_server_password: VAR_CACHEDB_REDISREPLICAPASSWORD STRING_ARG 4101 { 4102 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4103 OUTYY(("P(redis_replica_server_password:%s)\n", $2)); 4104 free(cfg_parser->cfg->redis_replica_server_password); 4105 cfg_parser->cfg->redis_replica_server_password = $2; 4106 #else 4107 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4108 free($2); 4109 #endif 4110 } 4111 ; 4112 redis_timeout: VAR_CACHEDB_REDISTIMEOUT STRING_ARG 4113 { 4114 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4115 OUTYY(("P(redis_timeout:%s)\n", $2)); 4116 if(atoi($2) == 0) 4117 yyerror("redis timeout value expected"); 4118 else cfg_parser->cfg->redis_timeout = atoi($2); 4119 #else 4120 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4121 #endif 4122 free($2); 4123 } 4124 ; 4125 redis_replica_timeout: VAR_CACHEDB_REDISREPLICATIMEOUT STRING_ARG 4126 { 4127 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4128 OUTYY(("P(redis_replica_timeout:%s)\n", $2)); 4129 if(atoi($2) == 0) 4130 yyerror("redis timeout value expected"); 4131 else cfg_parser->cfg->redis_replica_timeout = atoi($2); 4132 #else 4133 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4134 #endif 4135 free($2); 4136 } 4137 ; 4138 redis_command_timeout: VAR_CACHEDB_REDISCOMMANDTIMEOUT STRING_ARG 4139 { 4140 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4141 OUTYY(("P(redis_command_timeout:%s)\n", $2)); 4142 if(atoi($2) == 0 && strcmp($2, "0") != 0) 4143 yyerror("redis command timeout value expected"); 4144 else cfg_parser->cfg->redis_command_timeout = atoi($2); 4145 #else 4146 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4147 #endif 4148 free($2); 4149 } 4150 ; 4151 redis_replica_command_timeout: VAR_CACHEDB_REDISREPLICACOMMANDTIMEOUT STRING_ARG 4152 { 4153 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4154 OUTYY(("P(redis_replica_command_timeout:%s)\n", $2)); 4155 if(atoi($2) == 0 && strcmp($2, "0") != 0) 4156 yyerror("redis command timeout value expected"); 4157 else cfg_parser->cfg->redis_replica_command_timeout = atoi($2); 4158 #else 4159 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4160 #endif 4161 free($2); 4162 } 4163 ; 4164 redis_connect_timeout: VAR_CACHEDB_REDISCONNECTTIMEOUT STRING_ARG 4165 { 4166 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4167 OUTYY(("P(redis_connect_timeout:%s)\n", $2)); 4168 if(atoi($2) == 0 && strcmp($2, "0") != 0) 4169 yyerror("redis connect timeout value expected"); 4170 else cfg_parser->cfg->redis_connect_timeout = atoi($2); 4171 #else 4172 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4173 #endif 4174 free($2); 4175 } 4176 ; 4177 redis_replica_connect_timeout: VAR_CACHEDB_REDISREPLICACONNECTTIMEOUT STRING_ARG 4178 { 4179 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4180 OUTYY(("P(redis_replica_connect_timeout:%s)\n", $2)); 4181 if(atoi($2) == 0 && strcmp($2, "0") != 0) 4182 yyerror("redis connect timeout value expected"); 4183 else cfg_parser->cfg->redis_replica_connect_timeout = atoi($2); 4184 #else 4185 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4186 #endif 4187 free($2); 4188 } 4189 ; 4190 redis_expire_records: VAR_CACHEDB_REDISEXPIRERECORDS STRING_ARG 4191 { 4192 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4193 OUTYY(("P(redis_expire_records:%s)\n", $2)); 4194 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 4195 yyerror("expected yes or no."); 4196 else cfg_parser->cfg->redis_expire_records = (strcmp($2, "yes")==0); 4197 #else 4198 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4199 #endif 4200 free($2); 4201 } 4202 ; 4203 redis_logical_db: VAR_CACHEDB_REDISLOGICALDB STRING_ARG 4204 { 4205 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4206 int db; 4207 OUTYY(("P(redis_logical_db:%s)\n", $2)); 4208 db = atoi($2); 4209 if((db == 0 && strcmp($2, "0") != 0) || db < 0) 4210 yyerror("valid redis logical database index expected"); 4211 else cfg_parser->cfg->redis_logical_db = db; 4212 #else 4213 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4214 #endif 4215 free($2); 4216 } 4217 ; 4218 redis_replica_logical_db: VAR_CACHEDB_REDISREPLICALOGICALDB STRING_ARG 4219 { 4220 #if defined(USE_CACHEDB) && defined(USE_REDIS) 4221 int db; 4222 OUTYY(("P(redis_replica_logical_db:%s)\n", $2)); 4223 db = atoi($2); 4224 if((db == 0 && strcmp($2, "0") != 0) || db < 0) 4225 yyerror("valid redis logical database index expected"); 4226 else cfg_parser->cfg->redis_replica_logical_db = db; 4227 #else 4228 OUTYY(("P(Compiled without cachedb or redis, ignoring)\n")); 4229 #endif 4230 free($2); 4231 } 4232 ; 4233 server_tcp_connection_limit: VAR_TCP_CONNECTION_LIMIT STRING_ARG STRING_ARG 4234 { 4235 OUTYY(("P(server_tcp_connection_limit:%s %s)\n", $2, $3)); 4236 if (atoi($3) < 0) 4237 yyerror("positive number expected"); 4238 else { 4239 if(!cfg_str2list_insert(&cfg_parser->cfg->tcp_connection_limits, $2, $3)) 4240 yyerror("out of memory"); 4241 } 4242 } 4243 ; 4244 server_answer_cookie: VAR_ANSWER_COOKIE STRING_ARG 4245 { 4246 OUTYY(("P(server_answer_cookie:%s)\n", $2)); 4247 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 4248 yyerror("expected yes or no."); 4249 else cfg_parser->cfg->do_answer_cookie = (strcmp($2, "yes")==0); 4250 free($2); 4251 } 4252 ; 4253 server_cookie_secret: VAR_COOKIE_SECRET STRING_ARG 4254 { 4255 uint8_t secret[32]; 4256 size_t secret_len = sizeof(secret); 4257 4258 OUTYY(("P(server_cookie_secret:%s)\n", $2)); 4259 if(sldns_str2wire_hex_buf($2, secret, &secret_len) 4260 || (secret_len != 16)) 4261 yyerror("expected 128 bit hex string"); 4262 else { 4263 cfg_parser->cfg->cookie_secret_len = secret_len; 4264 memcpy(cfg_parser->cfg->cookie_secret, secret, sizeof(secret)); 4265 } 4266 free($2); 4267 } 4268 ; 4269 server_cookie_secret_file: VAR_COOKIE_SECRET_FILE STRING_ARG 4270 { 4271 OUTYY(("P(cookie_secret_file:%s)\n", $2)); 4272 free(cfg_parser->cfg->cookie_secret_file); 4273 cfg_parser->cfg->cookie_secret_file = $2; 4274 } 4275 ; 4276 server_iter_scrub_ns: VAR_ITER_SCRUB_NS STRING_ARG 4277 { 4278 OUTYY(("P(server_iter_scrub_ns:%s)\n", $2)); 4279 if(atoi($2) < 1) 4280 yyerror("number >= 1 expected"); 4281 else cfg_parser->cfg->iter_scrub_ns = atoi($2); 4282 free($2); 4283 } 4284 ; 4285 server_iter_scrub_cname: VAR_ITER_SCRUB_CNAME STRING_ARG 4286 { 4287 OUTYY(("P(server_iter_scrub_cname:%s)\n", $2)); 4288 if(atoi($2) == 0 && strcmp($2, "0") != 0) 4289 yyerror("number expected"); 4290 else cfg_parser->cfg->iter_scrub_cname = atoi($2); 4291 free($2); 4292 } 4293 ; 4294 server_iter_scrub_rrsig: VAR_ITER_SCRUB_RRSIG STRING_ARG 4295 { 4296 OUTYY(("P(server_iter_scrub_rrsig:%s)\n", $2)); 4297 if(atoi($2) == 0 && strcmp($2, "0") != 0) 4298 yyerror("number expected"); 4299 else cfg_parser->cfg->iter_scrub_rrsig = atoi($2); 4300 free($2); 4301 } 4302 ; 4303 server_max_global_quota: VAR_MAX_GLOBAL_QUOTA STRING_ARG 4304 { 4305 OUTYY(("P(server_max_global_quota:%s)\n", $2)); 4306 if(atoi($2) == 0 && strcmp($2, "0") != 0) 4307 yyerror("number expected"); 4308 else cfg_parser->cfg->max_global_quota = atoi($2); 4309 free($2); 4310 } 4311 ; 4312 server_iter_scrub_promiscuous: VAR_ITER_SCRUB_PROMISCUOUS STRING_ARG 4313 { 4314 OUTYY(("P(server_iter_scrub_promiscuous:%s)\n", $2)); 4315 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 4316 yyerror("expected yes or no."); 4317 else cfg_parser->cfg->iter_scrub_promiscuous = 4318 (strcmp($2, "yes")==0); 4319 free($2); 4320 } 4321 ; 4322 server_val_validation_attempts: VAR_VAL_VALIDATION_ATTEMPTS STRING_ARG 4323 { 4324 OUTYY(("P(server_val_validation_attempts:%s)\n", $2)); 4325 if(atoi($2) == 0 && strcmp($2, "0") != 0) 4326 yyerror("number expected"); 4327 else cfg_parser->cfg->val_validation_attempts = atoi($2); 4328 free($2); 4329 } 4330 ; 4331 server_val_hash_attempts: VAR_VAL_HASH_ATTEMPTS STRING_ARG 4332 { 4333 OUTYY(("P(server_val_hash_attempts:%s)\n", $2)); 4334 if(atoi($2) == 0 && strcmp($2, "0") != 0) 4335 yyerror("number expected"); 4336 else cfg_parser->cfg->val_hash_attempts = atoi($2); 4337 free($2); 4338 } 4339 ; 4340 ipsetstart: VAR_IPSET 4341 { 4342 OUTYY(("\nP(ipset:)\n")); 4343 cfg_parser->started_toplevel = 1; 4344 } 4345 ; 4346 contents_ipset: contents_ipset content_ipset 4347 | ; 4348 content_ipset: ipset_name_v4 | ipset_name_v6 4349 ; 4350 ipset_name_v4: VAR_IPSET_NAME_V4 STRING_ARG 4351 { 4352 #ifdef USE_IPSET 4353 OUTYY(("P(name-v4:%s)\n", $2)); 4354 if(cfg_parser->cfg->ipset_name_v4) 4355 yyerror("ipset name v4 override, there must be one " 4356 "name for ip v4"); 4357 free(cfg_parser->cfg->ipset_name_v4); 4358 cfg_parser->cfg->ipset_name_v4 = $2; 4359 #else 4360 OUTYY(("P(Compiled without ipset, ignoring)\n")); 4361 free($2); 4362 #endif 4363 } 4364 ; 4365 ipset_name_v6: VAR_IPSET_NAME_V6 STRING_ARG 4366 { 4367 #ifdef USE_IPSET 4368 OUTYY(("P(name-v6:%s)\n", $2)); 4369 if(cfg_parser->cfg->ipset_name_v6) 4370 yyerror("ipset name v6 override, there must be one " 4371 "name for ip v6"); 4372 free(cfg_parser->cfg->ipset_name_v6); 4373 cfg_parser->cfg->ipset_name_v6 = $2; 4374 #else 4375 OUTYY(("P(Compiled without ipset, ignoring)\n")); 4376 free($2); 4377 #endif 4378 } 4379 ; 4380 %% 4381 4382 /* parse helper routines could be here */ 4383 static void 4384 validate_respip_action(const char* action) 4385 { 4386 if(strcmp(action, "deny")!=0 && 4387 strcmp(action, "redirect")!=0 && 4388 strcmp(action, "inform")!=0 && 4389 strcmp(action, "inform_deny")!=0 && 4390 strcmp(action, "always_transparent")!=0 && 4391 strcmp(action, "always_refuse")!=0 && 4392 strcmp(action, "always_nxdomain")!=0) 4393 { 4394 yyerror("response-ip action: expected deny, redirect, " 4395 "inform, inform_deny, always_transparent, " 4396 "always_refuse or always_nxdomain"); 4397 } 4398 } 4399 4400 static void 4401 validate_acl_action(const char* action) 4402 { 4403 if(strcmp(action, "deny")!=0 && 4404 strcmp(action, "refuse")!=0 && 4405 strcmp(action, "deny_non_local")!=0 && 4406 strcmp(action, "refuse_non_local")!=0 && 4407 strcmp(action, "allow_setrd")!=0 && 4408 strcmp(action, "allow")!=0 && 4409 strcmp(action, "allow_snoop")!=0 && 4410 strcmp(action, "allow_cookie")!=0) 4411 { 4412 yyerror("expected deny, refuse, deny_non_local, " 4413 "refuse_non_local, allow, allow_setrd, " 4414 "allow_snoop or allow_cookie as access control action"); 4415 } 4416 } 4417