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