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 51 int ub_c_lex(void); 52 void ub_c_error(const char *message); 53 54 /* these need to be global, otherwise they cannot be used inside yacc */ 55 extern struct config_parser_state* cfg_parser; 56 57 #if 0 58 #define OUTYY(s) printf s /* used ONLY when debugging */ 59 #else 60 #define OUTYY(s) 61 #endif 62 63 %} 64 %union { 65 char* str; 66 }; 67 68 %token SPACE LETTER NEWLINE COMMENT COLON ANY ZONESTR 69 %token <str> STRING_ARG 70 %token VAR_SERVER VAR_VERBOSITY VAR_NUM_THREADS VAR_PORT 71 %token VAR_OUTGOING_RANGE VAR_INTERFACE 72 %token VAR_DO_IP4 VAR_DO_IP6 VAR_DO_UDP VAR_DO_TCP 73 %token VAR_CHROOT VAR_USERNAME VAR_DIRECTORY VAR_LOGFILE VAR_PIDFILE 74 %token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS VAR_NUM_QUERIES_PER_THREAD 75 %token VAR_RRSET_CACHE_SIZE VAR_RRSET_CACHE_SLABS VAR_OUTGOING_NUM_TCP 76 %token VAR_INFRA_HOST_TTL VAR_INFRA_LAME_TTL VAR_INFRA_CACHE_SLABS 77 %token VAR_INFRA_CACHE_NUMHOSTS VAR_INFRA_CACHE_LAME_SIZE VAR_NAME 78 %token VAR_STUB_ZONE VAR_STUB_HOST VAR_STUB_ADDR VAR_TARGET_FETCH_POLICY 79 %token VAR_HARDEN_SHORT_BUFSIZE VAR_HARDEN_LARGE_QUERIES 80 %token VAR_FORWARD_ZONE VAR_FORWARD_HOST VAR_FORWARD_ADDR 81 %token VAR_DO_NOT_QUERY_ADDRESS VAR_HIDE_IDENTITY VAR_HIDE_VERSION 82 %token VAR_IDENTITY VAR_VERSION VAR_HARDEN_GLUE VAR_MODULE_CONF 83 %token VAR_TRUST_ANCHOR_FILE VAR_TRUST_ANCHOR VAR_VAL_OVERRIDE_DATE 84 %token VAR_BOGUS_TTL VAR_VAL_CLEAN_ADDITIONAL VAR_VAL_PERMISSIVE_MODE 85 %token VAR_INCOMING_NUM_TCP VAR_MSG_BUFFER_SIZE VAR_KEY_CACHE_SIZE 86 %token VAR_KEY_CACHE_SLABS VAR_TRUSTED_KEYS_FILE 87 %token VAR_VAL_NSEC3_KEYSIZE_ITERATIONS VAR_USE_SYSLOG 88 %token VAR_OUTGOING_INTERFACE VAR_ROOT_HINTS VAR_DO_NOT_QUERY_LOCALHOST 89 %token VAR_CACHE_MAX_TTL VAR_HARDEN_DNSSEC_STRIPPED VAR_ACCESS_CONTROL 90 %token VAR_LOCAL_ZONE VAR_LOCAL_DATA VAR_INTERFACE_AUTOMATIC 91 %token VAR_STATISTICS_INTERVAL VAR_DO_DAEMONIZE VAR_USE_CAPS_FOR_ID 92 %token VAR_STATISTICS_CUMULATIVE VAR_OUTGOING_PORT_PERMIT 93 %token VAR_OUTGOING_PORT_AVOID VAR_DLV_ANCHOR_FILE VAR_DLV_ANCHOR 94 %token VAR_NEG_CACHE_SIZE VAR_HARDEN_REFERRAL_PATH VAR_PRIVATE_ADDRESS 95 %token VAR_PRIVATE_DOMAIN VAR_REMOTE_CONTROL VAR_CONTROL_ENABLE 96 %token VAR_CONTROL_INTERFACE VAR_CONTROL_PORT VAR_SERVER_KEY_FILE 97 %token VAR_SERVER_CERT_FILE VAR_CONTROL_KEY_FILE VAR_CONTROL_CERT_FILE 98 %token VAR_CONTROL_USE_CERT 99 %token VAR_EXTENDED_STATISTICS VAR_LOCAL_DATA_PTR VAR_JOSTLE_TIMEOUT 100 %token VAR_STUB_PRIME VAR_UNWANTED_REPLY_THRESHOLD VAR_LOG_TIME_ASCII 101 %token VAR_DOMAIN_INSECURE VAR_PYTHON VAR_PYTHON_SCRIPT VAR_VAL_SIG_SKEW_MIN 102 %token VAR_VAL_SIG_SKEW_MAX VAR_CACHE_MIN_TTL VAR_VAL_LOG_LEVEL 103 %token VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING VAR_ADD_HOLDDOWN 104 %token VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE VAR_PREFETCH 105 %token VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT VAR_HARDEN_BELOW_NXDOMAIN 106 %token VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES VAR_TCP_UPSTREAM VAR_SSL_UPSTREAM 107 %token VAR_SSL_SERVICE_KEY VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST 108 %token VAR_STUB_FIRST VAR_MINIMAL_RESPONSES VAR_RRSET_ROUNDROBIN 109 %token VAR_MAX_UDP_SIZE VAR_DELAY_CLOSE VAR_UNBLOCK_LAN_ZONES 110 %token VAR_INFRA_CACHE_MIN_RTT 111 %token VAR_DNS64_PREFIX VAR_DNS64_SYNTHALL 112 %token VAR_DNSTAP VAR_DNSTAP_ENABLE VAR_DNSTAP_SOCKET_PATH 113 %token VAR_DNSTAP_SEND_IDENTITY VAR_DNSTAP_SEND_VERSION 114 %token VAR_DNSTAP_IDENTITY VAR_DNSTAP_VERSION 115 %token VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 116 %token VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 117 %token VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 118 %token VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 119 %token VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 120 %token VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 121 %token VAR_HARDEN_ALGO_DOWNGRADE VAR_IP_TRANSPARENT 122 %token VAR_RATELIMIT VAR_RATELIMIT_SLABS VAR_RATELIMIT_SIZE 123 %token VAR_RATELIMIT_FOR_DOMAIN VAR_RATELIMIT_BELOW_DOMAIN VAR_RATELIMIT_FACTOR 124 %token VAR_CAPS_WHITELIST VAR_CACHE_MAX_NEGATIVE_TTL 125 126 %% 127 toplevelvars: /* empty */ | toplevelvars toplevelvar ; 128 toplevelvar: serverstart contents_server | stubstart contents_stub | 129 forwardstart contents_forward | pythonstart contents_py | 130 rcstart contents_rc | dtstart contents_dt 131 ; 132 133 /* server: declaration */ 134 serverstart: VAR_SERVER 135 { 136 OUTYY(("\nP(server:)\n")); 137 } 138 ; 139 contents_server: contents_server content_server 140 | ; 141 content_server: server_num_threads | server_verbosity | server_port | 142 server_outgoing_range | server_do_ip4 | 143 server_do_ip6 | server_do_udp | server_do_tcp | 144 server_interface | server_chroot | server_username | 145 server_directory | server_logfile | server_pidfile | 146 server_msg_cache_size | server_msg_cache_slabs | 147 server_num_queries_per_thread | server_rrset_cache_size | 148 server_rrset_cache_slabs | server_outgoing_num_tcp | 149 server_infra_host_ttl | server_infra_lame_ttl | 150 server_infra_cache_slabs | server_infra_cache_numhosts | 151 server_infra_cache_lame_size | server_target_fetch_policy | 152 server_harden_short_bufsize | server_harden_large_queries | 153 server_do_not_query_address | server_hide_identity | 154 server_hide_version | server_identity | server_version | 155 server_harden_glue | server_module_conf | server_trust_anchor_file | 156 server_trust_anchor | server_val_override_date | server_bogus_ttl | 157 server_val_clean_additional | server_val_permissive_mode | 158 server_incoming_num_tcp | server_msg_buffer_size | 159 server_key_cache_size | server_key_cache_slabs | 160 server_trusted_keys_file | server_val_nsec3_keysize_iterations | 161 server_use_syslog | server_outgoing_interface | server_root_hints | 162 server_do_not_query_localhost | server_cache_max_ttl | 163 server_harden_dnssec_stripped | server_access_control | 164 server_local_zone | server_local_data | server_interface_automatic | 165 server_statistics_interval | server_do_daemonize | 166 server_use_caps_for_id | server_statistics_cumulative | 167 server_outgoing_port_permit | server_outgoing_port_avoid | 168 server_dlv_anchor_file | server_dlv_anchor | server_neg_cache_size | 169 server_harden_referral_path | server_private_address | 170 server_private_domain | server_extended_statistics | 171 server_local_data_ptr | server_jostle_timeout | 172 server_unwanted_reply_threshold | server_log_time_ascii | 173 server_domain_insecure | server_val_sig_skew_min | 174 server_val_sig_skew_max | server_cache_min_ttl | server_val_log_level | 175 server_auto_trust_anchor_file | server_add_holddown | 176 server_del_holddown | server_keep_missing | server_so_rcvbuf | 177 server_edns_buffer_size | server_prefetch | server_prefetch_key | 178 server_so_sndbuf | server_harden_below_nxdomain | server_ignore_cd_flag | 179 server_log_queries | server_tcp_upstream | server_ssl_upstream | 180 server_ssl_service_key | server_ssl_service_pem | server_ssl_port | 181 server_minimal_responses | server_rrset_roundrobin | server_max_udp_size | 182 server_so_reuseport | server_delay_close | server_unblock_lan_zones | 183 server_dns64_prefix | server_dns64_synthall | 184 server_infra_cache_min_rtt | server_harden_algo_downgrade | 185 server_ip_transparent | server_ratelimit | server_ratelimit_slabs | 186 server_ratelimit_size | server_ratelimit_for_domain | 187 server_ratelimit_below_domain | server_ratelimit_factor | 188 server_caps_whitelist | server_cache_max_negative_ttl 189 ; 190 stubstart: VAR_STUB_ZONE 191 { 192 struct config_stub* s; 193 OUTYY(("\nP(stub_zone:)\n")); 194 s = (struct config_stub*)calloc(1, sizeof(struct config_stub)); 195 if(s) { 196 s->next = cfg_parser->cfg->stubs; 197 cfg_parser->cfg->stubs = s; 198 } else 199 yyerror("out of memory"); 200 } 201 ; 202 contents_stub: contents_stub content_stub 203 | ; 204 content_stub: stub_name | stub_host | stub_addr | stub_prime | stub_first 205 ; 206 forwardstart: VAR_FORWARD_ZONE 207 { 208 struct config_stub* s; 209 OUTYY(("\nP(forward_zone:)\n")); 210 s = (struct config_stub*)calloc(1, sizeof(struct config_stub)); 211 if(s) { 212 s->next = cfg_parser->cfg->forwards; 213 cfg_parser->cfg->forwards = s; 214 } else 215 yyerror("out of memory"); 216 } 217 ; 218 contents_forward: contents_forward content_forward 219 | ; 220 content_forward: forward_name | forward_host | forward_addr | forward_first 221 ; 222 server_num_threads: VAR_NUM_THREADS STRING_ARG 223 { 224 OUTYY(("P(server_num_threads:%s)\n", $2)); 225 if(atoi($2) == 0 && strcmp($2, "0") != 0) 226 yyerror("number expected"); 227 else cfg_parser->cfg->num_threads = atoi($2); 228 free($2); 229 } 230 ; 231 server_verbosity: VAR_VERBOSITY STRING_ARG 232 { 233 OUTYY(("P(server_verbosity:%s)\n", $2)); 234 if(atoi($2) == 0 && strcmp($2, "0") != 0) 235 yyerror("number expected"); 236 else cfg_parser->cfg->verbosity = atoi($2); 237 free($2); 238 } 239 ; 240 server_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG 241 { 242 OUTYY(("P(server_statistics_interval:%s)\n", $2)); 243 if(strcmp($2, "") == 0 || strcmp($2, "0") == 0) 244 cfg_parser->cfg->stat_interval = 0; 245 else if(atoi($2) == 0) 246 yyerror("number expected"); 247 else cfg_parser->cfg->stat_interval = atoi($2); 248 free($2); 249 } 250 ; 251 server_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG 252 { 253 OUTYY(("P(server_statistics_cumulative:%s)\n", $2)); 254 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 255 yyerror("expected yes or no."); 256 else cfg_parser->cfg->stat_cumulative = (strcmp($2, "yes")==0); 257 free($2); 258 } 259 ; 260 server_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG 261 { 262 OUTYY(("P(server_extended_statistics:%s)\n", $2)); 263 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 264 yyerror("expected yes or no."); 265 else cfg_parser->cfg->stat_extended = (strcmp($2, "yes")==0); 266 free($2); 267 } 268 ; 269 server_port: VAR_PORT STRING_ARG 270 { 271 OUTYY(("P(server_port:%s)\n", $2)); 272 if(atoi($2) == 0) 273 yyerror("port number expected"); 274 else cfg_parser->cfg->port = atoi($2); 275 free($2); 276 } 277 ; 278 server_interface: VAR_INTERFACE STRING_ARG 279 { 280 OUTYY(("P(server_interface:%s)\n", $2)); 281 if(cfg_parser->cfg->num_ifs == 0) 282 cfg_parser->cfg->ifs = calloc(1, sizeof(char*)); 283 else cfg_parser->cfg->ifs = realloc(cfg_parser->cfg->ifs, 284 (cfg_parser->cfg->num_ifs+1)*sizeof(char*)); 285 if(!cfg_parser->cfg->ifs) 286 yyerror("out of memory"); 287 else 288 cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = $2; 289 } 290 ; 291 server_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG 292 { 293 OUTYY(("P(server_outgoing_interface:%s)\n", $2)); 294 if(cfg_parser->cfg->num_out_ifs == 0) 295 cfg_parser->cfg->out_ifs = calloc(1, sizeof(char*)); 296 else cfg_parser->cfg->out_ifs = realloc( 297 cfg_parser->cfg->out_ifs, 298 (cfg_parser->cfg->num_out_ifs+1)*sizeof(char*)); 299 if(!cfg_parser->cfg->out_ifs) 300 yyerror("out of memory"); 301 else 302 cfg_parser->cfg->out_ifs[ 303 cfg_parser->cfg->num_out_ifs++] = $2; 304 } 305 ; 306 server_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG 307 { 308 OUTYY(("P(server_outgoing_range:%s)\n", $2)); 309 if(atoi($2) == 0) 310 yyerror("number expected"); 311 else cfg_parser->cfg->outgoing_num_ports = atoi($2); 312 free($2); 313 } 314 ; 315 server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG 316 { 317 OUTYY(("P(server_outgoing_port_permit:%s)\n", $2)); 318 if(!cfg_mark_ports($2, 1, 319 cfg_parser->cfg->outgoing_avail_ports, 65536)) 320 yyerror("port number or range (\"low-high\") expected"); 321 free($2); 322 } 323 ; 324 server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG 325 { 326 OUTYY(("P(server_outgoing_port_avoid:%s)\n", $2)); 327 if(!cfg_mark_ports($2, 0, 328 cfg_parser->cfg->outgoing_avail_ports, 65536)) 329 yyerror("port number or range (\"low-high\") expected"); 330 free($2); 331 } 332 ; 333 server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG 334 { 335 OUTYY(("P(server_outgoing_num_tcp:%s)\n", $2)); 336 if(atoi($2) == 0 && strcmp($2, "0") != 0) 337 yyerror("number expected"); 338 else cfg_parser->cfg->outgoing_num_tcp = atoi($2); 339 free($2); 340 } 341 ; 342 server_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG 343 { 344 OUTYY(("P(server_incoming_num_tcp:%s)\n", $2)); 345 if(atoi($2) == 0 && strcmp($2, "0") != 0) 346 yyerror("number expected"); 347 else cfg_parser->cfg->incoming_num_tcp = atoi($2); 348 free($2); 349 } 350 ; 351 server_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG 352 { 353 OUTYY(("P(server_interface_automatic:%s)\n", $2)); 354 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 355 yyerror("expected yes or no."); 356 else cfg_parser->cfg->if_automatic = (strcmp($2, "yes")==0); 357 free($2); 358 } 359 ; 360 server_do_ip4: VAR_DO_IP4 STRING_ARG 361 { 362 OUTYY(("P(server_do_ip4:%s)\n", $2)); 363 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 364 yyerror("expected yes or no."); 365 else cfg_parser->cfg->do_ip4 = (strcmp($2, "yes")==0); 366 free($2); 367 } 368 ; 369 server_do_ip6: VAR_DO_IP6 STRING_ARG 370 { 371 OUTYY(("P(server_do_ip6:%s)\n", $2)); 372 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 373 yyerror("expected yes or no."); 374 else cfg_parser->cfg->do_ip6 = (strcmp($2, "yes")==0); 375 free($2); 376 } 377 ; 378 server_do_udp: VAR_DO_UDP STRING_ARG 379 { 380 OUTYY(("P(server_do_udp:%s)\n", $2)); 381 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 382 yyerror("expected yes or no."); 383 else cfg_parser->cfg->do_udp = (strcmp($2, "yes")==0); 384 free($2); 385 } 386 ; 387 server_do_tcp: VAR_DO_TCP STRING_ARG 388 { 389 OUTYY(("P(server_do_tcp:%s)\n", $2)); 390 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 391 yyerror("expected yes or no."); 392 else cfg_parser->cfg->do_tcp = (strcmp($2, "yes")==0); 393 free($2); 394 } 395 ; 396 server_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG 397 { 398 OUTYY(("P(server_tcp_upstream:%s)\n", $2)); 399 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 400 yyerror("expected yes or no."); 401 else cfg_parser->cfg->tcp_upstream = (strcmp($2, "yes")==0); 402 free($2); 403 } 404 ; 405 server_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG 406 { 407 OUTYY(("P(server_ssl_upstream:%s)\n", $2)); 408 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 409 yyerror("expected yes or no."); 410 else cfg_parser->cfg->ssl_upstream = (strcmp($2, "yes")==0); 411 free($2); 412 } 413 ; 414 server_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG 415 { 416 OUTYY(("P(server_ssl_service_key:%s)\n", $2)); 417 free(cfg_parser->cfg->ssl_service_key); 418 cfg_parser->cfg->ssl_service_key = $2; 419 } 420 ; 421 server_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG 422 { 423 OUTYY(("P(server_ssl_service_pem:%s)\n", $2)); 424 free(cfg_parser->cfg->ssl_service_pem); 425 cfg_parser->cfg->ssl_service_pem = $2; 426 } 427 ; 428 server_ssl_port: VAR_SSL_PORT STRING_ARG 429 { 430 OUTYY(("P(server_ssl_port:%s)\n", $2)); 431 if(atoi($2) == 0) 432 yyerror("port number expected"); 433 else cfg_parser->cfg->ssl_port = atoi($2); 434 free($2); 435 } 436 ; 437 server_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG 438 { 439 OUTYY(("P(server_do_daemonize:%s)\n", $2)); 440 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 441 yyerror("expected yes or no."); 442 else cfg_parser->cfg->do_daemonize = (strcmp($2, "yes")==0); 443 free($2); 444 } 445 ; 446 server_use_syslog: VAR_USE_SYSLOG STRING_ARG 447 { 448 OUTYY(("P(server_use_syslog:%s)\n", $2)); 449 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 450 yyerror("expected yes or no."); 451 else cfg_parser->cfg->use_syslog = (strcmp($2, "yes")==0); 452 #if !defined(HAVE_SYSLOG_H) && !defined(UB_ON_WINDOWS) 453 if(strcmp($2, "yes") == 0) 454 yyerror("no syslog services are available. " 455 "(reconfigure and compile to add)"); 456 #endif 457 free($2); 458 } 459 ; 460 server_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG 461 { 462 OUTYY(("P(server_log_time_ascii:%s)\n", $2)); 463 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 464 yyerror("expected yes or no."); 465 else cfg_parser->cfg->log_time_ascii = (strcmp($2, "yes")==0); 466 free($2); 467 } 468 ; 469 server_log_queries: VAR_LOG_QUERIES STRING_ARG 470 { 471 OUTYY(("P(server_log_queries:%s)\n", $2)); 472 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 473 yyerror("expected yes or no."); 474 else cfg_parser->cfg->log_queries = (strcmp($2, "yes")==0); 475 free($2); 476 } 477 ; 478 server_chroot: VAR_CHROOT STRING_ARG 479 { 480 OUTYY(("P(server_chroot:%s)\n", $2)); 481 free(cfg_parser->cfg->chrootdir); 482 cfg_parser->cfg->chrootdir = $2; 483 } 484 ; 485 server_username: VAR_USERNAME STRING_ARG 486 { 487 OUTYY(("P(server_username:%s)\n", $2)); 488 free(cfg_parser->cfg->username); 489 cfg_parser->cfg->username = $2; 490 } 491 ; 492 server_directory: VAR_DIRECTORY STRING_ARG 493 { 494 OUTYY(("P(server_directory:%s)\n", $2)); 495 free(cfg_parser->cfg->directory); 496 cfg_parser->cfg->directory = $2; 497 } 498 ; 499 server_logfile: VAR_LOGFILE STRING_ARG 500 { 501 OUTYY(("P(server_logfile:%s)\n", $2)); 502 free(cfg_parser->cfg->logfile); 503 cfg_parser->cfg->logfile = $2; 504 cfg_parser->cfg->use_syslog = 0; 505 } 506 ; 507 server_pidfile: VAR_PIDFILE STRING_ARG 508 { 509 OUTYY(("P(server_pidfile:%s)\n", $2)); 510 free(cfg_parser->cfg->pidfile); 511 cfg_parser->cfg->pidfile = $2; 512 } 513 ; 514 server_root_hints: VAR_ROOT_HINTS STRING_ARG 515 { 516 OUTYY(("P(server_root_hints:%s)\n", $2)); 517 if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, $2)) 518 yyerror("out of memory"); 519 } 520 ; 521 server_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG 522 { 523 OUTYY(("P(server_dlv_anchor_file:%s)\n", $2)); 524 free(cfg_parser->cfg->dlv_anchor_file); 525 cfg_parser->cfg->dlv_anchor_file = $2; 526 } 527 ; 528 server_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG 529 { 530 OUTYY(("P(server_dlv_anchor:%s)\n", $2)); 531 if(!cfg_strlist_insert(&cfg_parser->cfg->dlv_anchor_list, $2)) 532 yyerror("out of memory"); 533 } 534 ; 535 server_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG 536 { 537 OUTYY(("P(server_auto_trust_anchor_file:%s)\n", $2)); 538 if(!cfg_strlist_insert(&cfg_parser->cfg-> 539 auto_trust_anchor_file_list, $2)) 540 yyerror("out of memory"); 541 } 542 ; 543 server_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG 544 { 545 OUTYY(("P(server_trust_anchor_file:%s)\n", $2)); 546 if(!cfg_strlist_insert(&cfg_parser->cfg-> 547 trust_anchor_file_list, $2)) 548 yyerror("out of memory"); 549 } 550 ; 551 server_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG 552 { 553 OUTYY(("P(server_trusted_keys_file:%s)\n", $2)); 554 if(!cfg_strlist_insert(&cfg_parser->cfg-> 555 trusted_keys_file_list, $2)) 556 yyerror("out of memory"); 557 } 558 ; 559 server_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG 560 { 561 OUTYY(("P(server_trust_anchor:%s)\n", $2)); 562 if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, $2)) 563 yyerror("out of memory"); 564 } 565 ; 566 server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG 567 { 568 OUTYY(("P(server_domain_insecure:%s)\n", $2)); 569 if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, $2)) 570 yyerror("out of memory"); 571 } 572 ; 573 server_hide_identity: VAR_HIDE_IDENTITY STRING_ARG 574 { 575 OUTYY(("P(server_hide_identity:%s)\n", $2)); 576 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 577 yyerror("expected yes or no."); 578 else cfg_parser->cfg->hide_identity = (strcmp($2, "yes")==0); 579 free($2); 580 } 581 ; 582 server_hide_version: VAR_HIDE_VERSION STRING_ARG 583 { 584 OUTYY(("P(server_hide_version:%s)\n", $2)); 585 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 586 yyerror("expected yes or no."); 587 else cfg_parser->cfg->hide_version = (strcmp($2, "yes")==0); 588 free($2); 589 } 590 ; 591 server_identity: VAR_IDENTITY STRING_ARG 592 { 593 OUTYY(("P(server_identity:%s)\n", $2)); 594 free(cfg_parser->cfg->identity); 595 cfg_parser->cfg->identity = $2; 596 } 597 ; 598 server_version: VAR_VERSION STRING_ARG 599 { 600 OUTYY(("P(server_version:%s)\n", $2)); 601 free(cfg_parser->cfg->version); 602 cfg_parser->cfg->version = $2; 603 } 604 ; 605 server_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG 606 { 607 OUTYY(("P(server_so_rcvbuf:%s)\n", $2)); 608 if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_rcvbuf)) 609 yyerror("buffer size expected"); 610 free($2); 611 } 612 ; 613 server_so_sndbuf: VAR_SO_SNDBUF STRING_ARG 614 { 615 OUTYY(("P(server_so_sndbuf:%s)\n", $2)); 616 if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_sndbuf)) 617 yyerror("buffer size expected"); 618 free($2); 619 } 620 ; 621 server_so_reuseport: VAR_SO_REUSEPORT STRING_ARG 622 { 623 OUTYY(("P(server_so_reuseport:%s)\n", $2)); 624 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 625 yyerror("expected yes or no."); 626 else cfg_parser->cfg->so_reuseport = 627 (strcmp($2, "yes")==0); 628 free($2); 629 } 630 ; 631 server_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG 632 { 633 OUTYY(("P(server_ip_transparent:%s)\n", $2)); 634 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 635 yyerror("expected yes or no."); 636 else cfg_parser->cfg->ip_transparent = 637 (strcmp($2, "yes")==0); 638 free($2); 639 } 640 ; 641 server_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG 642 { 643 OUTYY(("P(server_edns_buffer_size:%s)\n", $2)); 644 if(atoi($2) == 0) 645 yyerror("number expected"); 646 else if (atoi($2) < 12) 647 yyerror("edns buffer size too small"); 648 else if (atoi($2) > 65535) 649 cfg_parser->cfg->edns_buffer_size = 65535; 650 else cfg_parser->cfg->edns_buffer_size = atoi($2); 651 free($2); 652 } 653 ; 654 server_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG 655 { 656 OUTYY(("P(server_msg_buffer_size:%s)\n", $2)); 657 if(atoi($2) == 0) 658 yyerror("number expected"); 659 else if (atoi($2) < 4096) 660 yyerror("message buffer size too small (use 4096)"); 661 else cfg_parser->cfg->msg_buffer_size = atoi($2); 662 free($2); 663 } 664 ; 665 server_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG 666 { 667 OUTYY(("P(server_msg_cache_size:%s)\n", $2)); 668 if(!cfg_parse_memsize($2, &cfg_parser->cfg->msg_cache_size)) 669 yyerror("memory size expected"); 670 free($2); 671 } 672 ; 673 server_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG 674 { 675 OUTYY(("P(server_msg_cache_slabs:%s)\n", $2)); 676 if(atoi($2) == 0) 677 yyerror("number expected"); 678 else { 679 cfg_parser->cfg->msg_cache_slabs = atoi($2); 680 if(!is_pow2(cfg_parser->cfg->msg_cache_slabs)) 681 yyerror("must be a power of 2"); 682 } 683 free($2); 684 } 685 ; 686 server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG 687 { 688 OUTYY(("P(server_num_queries_per_thread:%s)\n", $2)); 689 if(atoi($2) == 0) 690 yyerror("number expected"); 691 else cfg_parser->cfg->num_queries_per_thread = atoi($2); 692 free($2); 693 } 694 ; 695 server_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG 696 { 697 OUTYY(("P(server_jostle_timeout:%s)\n", $2)); 698 if(atoi($2) == 0 && strcmp($2, "0") != 0) 699 yyerror("number expected"); 700 else cfg_parser->cfg->jostle_time = atoi($2); 701 free($2); 702 } 703 ; 704 server_delay_close: VAR_DELAY_CLOSE STRING_ARG 705 { 706 OUTYY(("P(server_delay_close:%s)\n", $2)); 707 if(atoi($2) == 0 && strcmp($2, "0") != 0) 708 yyerror("number expected"); 709 else cfg_parser->cfg->delay_close = atoi($2); 710 free($2); 711 } 712 ; 713 server_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG 714 { 715 OUTYY(("P(server_unblock_lan_zones:%s)\n", $2)); 716 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 717 yyerror("expected yes or no."); 718 else cfg_parser->cfg->unblock_lan_zones = 719 (strcmp($2, "yes")==0); 720 free($2); 721 } 722 ; 723 server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG 724 { 725 OUTYY(("P(server_rrset_cache_size:%s)\n", $2)); 726 if(!cfg_parse_memsize($2, &cfg_parser->cfg->rrset_cache_size)) 727 yyerror("memory size expected"); 728 free($2); 729 } 730 ; 731 server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG 732 { 733 OUTYY(("P(server_rrset_cache_slabs:%s)\n", $2)); 734 if(atoi($2) == 0) 735 yyerror("number expected"); 736 else { 737 cfg_parser->cfg->rrset_cache_slabs = atoi($2); 738 if(!is_pow2(cfg_parser->cfg->rrset_cache_slabs)) 739 yyerror("must be a power of 2"); 740 } 741 free($2); 742 } 743 ; 744 server_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG 745 { 746 OUTYY(("P(server_infra_host_ttl:%s)\n", $2)); 747 if(atoi($2) == 0 && strcmp($2, "0") != 0) 748 yyerror("number expected"); 749 else cfg_parser->cfg->host_ttl = atoi($2); 750 free($2); 751 } 752 ; 753 server_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG 754 { 755 OUTYY(("P(server_infra_lame_ttl:%s)\n", $2)); 756 verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option " 757 "removed, use infra-host-ttl)", $2); 758 free($2); 759 } 760 ; 761 server_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG 762 { 763 OUTYY(("P(server_infra_cache_numhosts:%s)\n", $2)); 764 if(atoi($2) == 0) 765 yyerror("number expected"); 766 else cfg_parser->cfg->infra_cache_numhosts = atoi($2); 767 free($2); 768 } 769 ; 770 server_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG 771 { 772 OUTYY(("P(server_infra_cache_lame_size:%s)\n", $2)); 773 verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s " 774 "(option removed, use infra-cache-numhosts)", $2); 775 free($2); 776 } 777 ; 778 server_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG 779 { 780 OUTYY(("P(server_infra_cache_slabs:%s)\n", $2)); 781 if(atoi($2) == 0) 782 yyerror("number expected"); 783 else { 784 cfg_parser->cfg->infra_cache_slabs = atoi($2); 785 if(!is_pow2(cfg_parser->cfg->infra_cache_slabs)) 786 yyerror("must be a power of 2"); 787 } 788 free($2); 789 } 790 ; 791 server_infra_cache_min_rtt: VAR_INFRA_CACHE_MIN_RTT STRING_ARG 792 { 793 OUTYY(("P(server_infra_cache_min_rtt:%s)\n", $2)); 794 if(atoi($2) == 0 && strcmp($2, "0") != 0) 795 yyerror("number expected"); 796 else cfg_parser->cfg->infra_cache_min_rtt = atoi($2); 797 free($2); 798 } 799 ; 800 server_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG 801 { 802 OUTYY(("P(server_target_fetch_policy:%s)\n", $2)); 803 free(cfg_parser->cfg->target_fetch_policy); 804 cfg_parser->cfg->target_fetch_policy = $2; 805 } 806 ; 807 server_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG 808 { 809 OUTYY(("P(server_harden_short_bufsize:%s)\n", $2)); 810 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 811 yyerror("expected yes or no."); 812 else cfg_parser->cfg->harden_short_bufsize = 813 (strcmp($2, "yes")==0); 814 free($2); 815 } 816 ; 817 server_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG 818 { 819 OUTYY(("P(server_harden_large_queries:%s)\n", $2)); 820 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 821 yyerror("expected yes or no."); 822 else cfg_parser->cfg->harden_large_queries = 823 (strcmp($2, "yes")==0); 824 free($2); 825 } 826 ; 827 server_harden_glue: VAR_HARDEN_GLUE STRING_ARG 828 { 829 OUTYY(("P(server_harden_glue:%s)\n", $2)); 830 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 831 yyerror("expected yes or no."); 832 else cfg_parser->cfg->harden_glue = 833 (strcmp($2, "yes")==0); 834 free($2); 835 } 836 ; 837 server_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG 838 { 839 OUTYY(("P(server_harden_dnssec_stripped:%s)\n", $2)); 840 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 841 yyerror("expected yes or no."); 842 else cfg_parser->cfg->harden_dnssec_stripped = 843 (strcmp($2, "yes")==0); 844 free($2); 845 } 846 ; 847 server_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG 848 { 849 OUTYY(("P(server_harden_below_nxdomain:%s)\n", $2)); 850 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 851 yyerror("expected yes or no."); 852 else cfg_parser->cfg->harden_below_nxdomain = 853 (strcmp($2, "yes")==0); 854 free($2); 855 } 856 ; 857 server_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG 858 { 859 OUTYY(("P(server_harden_referral_path:%s)\n", $2)); 860 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 861 yyerror("expected yes or no."); 862 else cfg_parser->cfg->harden_referral_path = 863 (strcmp($2, "yes")==0); 864 free($2); 865 } 866 ; 867 server_harden_algo_downgrade: VAR_HARDEN_ALGO_DOWNGRADE STRING_ARG 868 { 869 OUTYY(("P(server_harden_algo_downgrade:%s)\n", $2)); 870 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 871 yyerror("expected yes or no."); 872 else cfg_parser->cfg->harden_algo_downgrade = 873 (strcmp($2, "yes")==0); 874 free($2); 875 } 876 ; 877 server_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG 878 { 879 OUTYY(("P(server_use_caps_for_id:%s)\n", $2)); 880 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 881 yyerror("expected yes or no."); 882 else cfg_parser->cfg->use_caps_bits_for_id = 883 (strcmp($2, "yes")==0); 884 free($2); 885 } 886 ; 887 server_caps_whitelist: VAR_CAPS_WHITELIST STRING_ARG 888 { 889 OUTYY(("P(server_caps_whitelist:%s)\n", $2)); 890 if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, $2)) 891 yyerror("out of memory"); 892 } 893 ; 894 server_private_address: VAR_PRIVATE_ADDRESS STRING_ARG 895 { 896 OUTYY(("P(server_private_address:%s)\n", $2)); 897 if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, $2)) 898 yyerror("out of memory"); 899 } 900 ; 901 server_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG 902 { 903 OUTYY(("P(server_private_domain:%s)\n", $2)); 904 if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, $2)) 905 yyerror("out of memory"); 906 } 907 ; 908 server_prefetch: VAR_PREFETCH STRING_ARG 909 { 910 OUTYY(("P(server_prefetch:%s)\n", $2)); 911 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 912 yyerror("expected yes or no."); 913 else cfg_parser->cfg->prefetch = (strcmp($2, "yes")==0); 914 free($2); 915 } 916 ; 917 server_prefetch_key: VAR_PREFETCH_KEY STRING_ARG 918 { 919 OUTYY(("P(server_prefetch_key:%s)\n", $2)); 920 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 921 yyerror("expected yes or no."); 922 else cfg_parser->cfg->prefetch_key = (strcmp($2, "yes")==0); 923 free($2); 924 } 925 ; 926 server_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG 927 { 928 OUTYY(("P(server_unwanted_reply_threshold:%s)\n", $2)); 929 if(atoi($2) == 0 && strcmp($2, "0") != 0) 930 yyerror("number expected"); 931 else cfg_parser->cfg->unwanted_threshold = atoi($2); 932 free($2); 933 } 934 ; 935 server_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG 936 { 937 OUTYY(("P(server_do_not_query_address:%s)\n", $2)); 938 if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, $2)) 939 yyerror("out of memory"); 940 } 941 ; 942 server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG 943 { 944 OUTYY(("P(server_do_not_query_localhost:%s)\n", $2)); 945 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 946 yyerror("expected yes or no."); 947 else cfg_parser->cfg->donotquery_localhost = 948 (strcmp($2, "yes")==0); 949 free($2); 950 } 951 ; 952 server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG 953 { 954 OUTYY(("P(server_access_control:%s %s)\n", $2, $3)); 955 if(strcmp($3, "deny")!=0 && strcmp($3, "refuse")!=0 && 956 strcmp($3, "deny_non_local")!=0 && 957 strcmp($3, "refuse_non_local")!=0 && 958 strcmp($3, "allow")!=0 && 959 strcmp($3, "allow_snoop")!=0) { 960 yyerror("expected deny, refuse, deny_non_local, " 961 "refuse_non_local, allow or allow_snoop " 962 "in access control action"); 963 } else { 964 if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3)) 965 fatal_exit("out of memory adding acl"); 966 } 967 } 968 ; 969 server_module_conf: VAR_MODULE_CONF STRING_ARG 970 { 971 OUTYY(("P(server_module_conf:%s)\n", $2)); 972 free(cfg_parser->cfg->module_conf); 973 cfg_parser->cfg->module_conf = $2; 974 } 975 ; 976 server_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG 977 { 978 OUTYY(("P(server_val_override_date:%s)\n", $2)); 979 if(strlen($2) == 0 || strcmp($2, "0") == 0) { 980 cfg_parser->cfg->val_date_override = 0; 981 } else if(strlen($2) == 14) { 982 cfg_parser->cfg->val_date_override = 983 cfg_convert_timeval($2); 984 if(!cfg_parser->cfg->val_date_override) 985 yyerror("bad date/time specification"); 986 } else { 987 if(atoi($2) == 0) 988 yyerror("number expected"); 989 cfg_parser->cfg->val_date_override = atoi($2); 990 } 991 free($2); 992 } 993 ; 994 server_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG 995 { 996 OUTYY(("P(server_val_sig_skew_min:%s)\n", $2)); 997 if(strlen($2) == 0 || strcmp($2, "0") == 0) { 998 cfg_parser->cfg->val_sig_skew_min = 0; 999 } else { 1000 cfg_parser->cfg->val_sig_skew_min = atoi($2); 1001 if(!cfg_parser->cfg->val_sig_skew_min) 1002 yyerror("number expected"); 1003 } 1004 free($2); 1005 } 1006 ; 1007 server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG 1008 { 1009 OUTYY(("P(server_val_sig_skew_max:%s)\n", $2)); 1010 if(strlen($2) == 0 || strcmp($2, "0") == 0) { 1011 cfg_parser->cfg->val_sig_skew_max = 0; 1012 } else { 1013 cfg_parser->cfg->val_sig_skew_max = atoi($2); 1014 if(!cfg_parser->cfg->val_sig_skew_max) 1015 yyerror("number expected"); 1016 } 1017 free($2); 1018 } 1019 ; 1020 server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG 1021 { 1022 OUTYY(("P(server_cache_max_ttl:%s)\n", $2)); 1023 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1024 yyerror("number expected"); 1025 else cfg_parser->cfg->max_ttl = atoi($2); 1026 free($2); 1027 } 1028 ; 1029 server_cache_max_negative_ttl: VAR_CACHE_MAX_NEGATIVE_TTL STRING_ARG 1030 { 1031 OUTYY(("P(server_cache_max_negative_ttl:%s)\n", $2)); 1032 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1033 yyerror("number expected"); 1034 else cfg_parser->cfg->max_negative_ttl = atoi($2); 1035 free($2); 1036 } 1037 ; 1038 server_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG 1039 { 1040 OUTYY(("P(server_cache_min_ttl:%s)\n", $2)); 1041 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1042 yyerror("number expected"); 1043 else cfg_parser->cfg->min_ttl = atoi($2); 1044 free($2); 1045 } 1046 ; 1047 server_bogus_ttl: VAR_BOGUS_TTL STRING_ARG 1048 { 1049 OUTYY(("P(server_bogus_ttl:%s)\n", $2)); 1050 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1051 yyerror("number expected"); 1052 else cfg_parser->cfg->bogus_ttl = atoi($2); 1053 free($2); 1054 } 1055 ; 1056 server_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG 1057 { 1058 OUTYY(("P(server_val_clean_additional:%s)\n", $2)); 1059 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1060 yyerror("expected yes or no."); 1061 else cfg_parser->cfg->val_clean_additional = 1062 (strcmp($2, "yes")==0); 1063 free($2); 1064 } 1065 ; 1066 server_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG 1067 { 1068 OUTYY(("P(server_val_permissive_mode:%s)\n", $2)); 1069 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1070 yyerror("expected yes or no."); 1071 else cfg_parser->cfg->val_permissive_mode = 1072 (strcmp($2, "yes")==0); 1073 free($2); 1074 } 1075 ; 1076 server_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG 1077 { 1078 OUTYY(("P(server_ignore_cd_flag:%s)\n", $2)); 1079 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1080 yyerror("expected yes or no."); 1081 else cfg_parser->cfg->ignore_cd = (strcmp($2, "yes")==0); 1082 free($2); 1083 } 1084 ; 1085 server_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG 1086 { 1087 OUTYY(("P(server_val_log_level:%s)\n", $2)); 1088 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1089 yyerror("number expected"); 1090 else cfg_parser->cfg->val_log_level = atoi($2); 1091 free($2); 1092 } 1093 ; 1094 server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG 1095 { 1096 OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", $2)); 1097 free(cfg_parser->cfg->val_nsec3_key_iterations); 1098 cfg_parser->cfg->val_nsec3_key_iterations = $2; 1099 } 1100 ; 1101 server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG 1102 { 1103 OUTYY(("P(server_add_holddown:%s)\n", $2)); 1104 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1105 yyerror("number expected"); 1106 else cfg_parser->cfg->add_holddown = atoi($2); 1107 free($2); 1108 } 1109 ; 1110 server_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG 1111 { 1112 OUTYY(("P(server_del_holddown:%s)\n", $2)); 1113 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1114 yyerror("number expected"); 1115 else cfg_parser->cfg->del_holddown = atoi($2); 1116 free($2); 1117 } 1118 ; 1119 server_keep_missing: VAR_KEEP_MISSING STRING_ARG 1120 { 1121 OUTYY(("P(server_keep_missing:%s)\n", $2)); 1122 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1123 yyerror("number expected"); 1124 else cfg_parser->cfg->keep_missing = atoi($2); 1125 free($2); 1126 } 1127 ; 1128 server_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG 1129 { 1130 OUTYY(("P(server_key_cache_size:%s)\n", $2)); 1131 if(!cfg_parse_memsize($2, &cfg_parser->cfg->key_cache_size)) 1132 yyerror("memory size expected"); 1133 free($2); 1134 } 1135 ; 1136 server_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG 1137 { 1138 OUTYY(("P(server_key_cache_slabs:%s)\n", $2)); 1139 if(atoi($2) == 0) 1140 yyerror("number expected"); 1141 else { 1142 cfg_parser->cfg->key_cache_slabs = atoi($2); 1143 if(!is_pow2(cfg_parser->cfg->key_cache_slabs)) 1144 yyerror("must be a power of 2"); 1145 } 1146 free($2); 1147 } 1148 ; 1149 server_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG 1150 { 1151 OUTYY(("P(server_neg_cache_size:%s)\n", $2)); 1152 if(!cfg_parse_memsize($2, &cfg_parser->cfg->neg_cache_size)) 1153 yyerror("memory size expected"); 1154 free($2); 1155 } 1156 ; 1157 server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG 1158 { 1159 OUTYY(("P(server_local_zone:%s %s)\n", $2, $3)); 1160 if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 && 1161 strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 && 1162 strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0 1163 && strcmp($3, "typetransparent")!=0 && 1164 strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0) 1165 yyerror("local-zone type: expected static, deny, " 1166 "refuse, redirect, transparent, " 1167 "typetransparent, inform, inform_deny " 1168 "or nodefault"); 1169 else if(strcmp($3, "nodefault")==0) { 1170 if(!cfg_strlist_insert(&cfg_parser->cfg-> 1171 local_zones_nodefault, $2)) 1172 fatal_exit("out of memory adding local-zone"); 1173 free($3); 1174 } else { 1175 if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones, 1176 $2, $3)) 1177 fatal_exit("out of memory adding local-zone"); 1178 } 1179 } 1180 ; 1181 server_local_data: VAR_LOCAL_DATA STRING_ARG 1182 { 1183 OUTYY(("P(server_local_data:%s)\n", $2)); 1184 if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, $2)) 1185 fatal_exit("out of memory adding local-data"); 1186 } 1187 ; 1188 server_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG 1189 { 1190 char* ptr; 1191 OUTYY(("P(server_local_data_ptr:%s)\n", $2)); 1192 ptr = cfg_ptr_reverse($2); 1193 free($2); 1194 if(ptr) { 1195 if(!cfg_strlist_insert(&cfg_parser->cfg-> 1196 local_data, ptr)) 1197 fatal_exit("out of memory adding local-data"); 1198 } else { 1199 yyerror("local-data-ptr could not be reversed"); 1200 } 1201 } 1202 ; 1203 server_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG 1204 { 1205 OUTYY(("P(server_minimal_responses:%s)\n", $2)); 1206 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1207 yyerror("expected yes or no."); 1208 else cfg_parser->cfg->minimal_responses = 1209 (strcmp($2, "yes")==0); 1210 free($2); 1211 } 1212 ; 1213 server_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG 1214 { 1215 OUTYY(("P(server_rrset_roundrobin:%s)\n", $2)); 1216 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1217 yyerror("expected yes or no."); 1218 else cfg_parser->cfg->rrset_roundrobin = 1219 (strcmp($2, "yes")==0); 1220 free($2); 1221 } 1222 ; 1223 server_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG 1224 { 1225 OUTYY(("P(server_max_udp_size:%s)\n", $2)); 1226 cfg_parser->cfg->max_udp_size = atoi($2); 1227 free($2); 1228 } 1229 ; 1230 server_dns64_prefix: VAR_DNS64_PREFIX STRING_ARG 1231 { 1232 OUTYY(("P(dns64_prefix:%s)\n", $2)); 1233 free(cfg_parser->cfg->dns64_prefix); 1234 cfg_parser->cfg->dns64_prefix = $2; 1235 } 1236 ; 1237 server_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG 1238 { 1239 OUTYY(("P(server_dns64_synthall:%s)\n", $2)); 1240 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1241 yyerror("expected yes or no."); 1242 else cfg_parser->cfg->dns64_synthall = (strcmp($2, "yes")==0); 1243 free($2); 1244 } 1245 ; 1246 server_ratelimit: VAR_RATELIMIT STRING_ARG 1247 { 1248 OUTYY(("P(server_ratelimit:%s)\n", $2)); 1249 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1250 yyerror("number expected"); 1251 else cfg_parser->cfg->ratelimit = atoi($2); 1252 free($2); 1253 } 1254 ; 1255 server_ratelimit_size: VAR_RATELIMIT_SIZE STRING_ARG 1256 { 1257 OUTYY(("P(server_ratelimit_size:%s)\n", $2)); 1258 if(!cfg_parse_memsize($2, &cfg_parser->cfg->ratelimit_size)) 1259 yyerror("memory size expected"); 1260 free($2); 1261 } 1262 ; 1263 server_ratelimit_slabs: VAR_RATELIMIT_SLABS STRING_ARG 1264 { 1265 OUTYY(("P(server_ratelimit_slabs:%s)\n", $2)); 1266 if(atoi($2) == 0) 1267 yyerror("number expected"); 1268 else { 1269 cfg_parser->cfg->ratelimit_slabs = atoi($2); 1270 if(!is_pow2(cfg_parser->cfg->ratelimit_slabs)) 1271 yyerror("must be a power of 2"); 1272 } 1273 free($2); 1274 } 1275 ; 1276 server_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG 1277 { 1278 OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", $2, $3)); 1279 if(atoi($3) == 0 && strcmp($3, "0") != 0) { 1280 yyerror("number expected"); 1281 } else { 1282 if(!cfg_str2list_insert(&cfg_parser->cfg-> 1283 ratelimit_for_domain, $2, $3)) 1284 fatal_exit("out of memory adding " 1285 "ratelimit-for-domain"); 1286 } 1287 } 1288 ; 1289 server_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG 1290 { 1291 OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", $2, $3)); 1292 if(atoi($3) == 0 && strcmp($3, "0") != 0) { 1293 yyerror("number expected"); 1294 } else { 1295 if(!cfg_str2list_insert(&cfg_parser->cfg-> 1296 ratelimit_below_domain, $2, $3)) 1297 fatal_exit("out of memory adding " 1298 "ratelimit-below-domain"); 1299 } 1300 } 1301 ; 1302 server_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG 1303 { 1304 OUTYY(("P(server_ratelimit_factor:%s)\n", $2)); 1305 if(atoi($2) == 0 && strcmp($2, "0") != 0) 1306 yyerror("number expected"); 1307 else cfg_parser->cfg->ratelimit_factor = atoi($2); 1308 free($2); 1309 } 1310 ; 1311 stub_name: VAR_NAME STRING_ARG 1312 { 1313 OUTYY(("P(name:%s)\n", $2)); 1314 if(cfg_parser->cfg->stubs->name) 1315 yyerror("stub name override, there must be one name " 1316 "for one stub-zone"); 1317 free(cfg_parser->cfg->stubs->name); 1318 cfg_parser->cfg->stubs->name = $2; 1319 } 1320 ; 1321 stub_host: VAR_STUB_HOST STRING_ARG 1322 { 1323 OUTYY(("P(stub-host:%s)\n", $2)); 1324 if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, $2)) 1325 yyerror("out of memory"); 1326 } 1327 ; 1328 stub_addr: VAR_STUB_ADDR STRING_ARG 1329 { 1330 OUTYY(("P(stub-addr:%s)\n", $2)); 1331 if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, $2)) 1332 yyerror("out of memory"); 1333 } 1334 ; 1335 stub_first: VAR_STUB_FIRST STRING_ARG 1336 { 1337 OUTYY(("P(stub-first:%s)\n", $2)); 1338 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1339 yyerror("expected yes or no."); 1340 else cfg_parser->cfg->stubs->isfirst=(strcmp($2, "yes")==0); 1341 free($2); 1342 } 1343 ; 1344 stub_prime: VAR_STUB_PRIME STRING_ARG 1345 { 1346 OUTYY(("P(stub-prime:%s)\n", $2)); 1347 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1348 yyerror("expected yes or no."); 1349 else cfg_parser->cfg->stubs->isprime = 1350 (strcmp($2, "yes")==0); 1351 free($2); 1352 } 1353 ; 1354 forward_name: VAR_NAME STRING_ARG 1355 { 1356 OUTYY(("P(name:%s)\n", $2)); 1357 if(cfg_parser->cfg->forwards->name) 1358 yyerror("forward name override, there must be one " 1359 "name for one forward-zone"); 1360 free(cfg_parser->cfg->forwards->name); 1361 cfg_parser->cfg->forwards->name = $2; 1362 } 1363 ; 1364 forward_host: VAR_FORWARD_HOST STRING_ARG 1365 { 1366 OUTYY(("P(forward-host:%s)\n", $2)); 1367 if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, $2)) 1368 yyerror("out of memory"); 1369 } 1370 ; 1371 forward_addr: VAR_FORWARD_ADDR STRING_ARG 1372 { 1373 OUTYY(("P(forward-addr:%s)\n", $2)); 1374 if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, $2)) 1375 yyerror("out of memory"); 1376 } 1377 ; 1378 forward_first: VAR_FORWARD_FIRST STRING_ARG 1379 { 1380 OUTYY(("P(forward-first:%s)\n", $2)); 1381 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1382 yyerror("expected yes or no."); 1383 else cfg_parser->cfg->forwards->isfirst=(strcmp($2, "yes")==0); 1384 free($2); 1385 } 1386 ; 1387 rcstart: VAR_REMOTE_CONTROL 1388 { 1389 OUTYY(("\nP(remote-control:)\n")); 1390 } 1391 ; 1392 contents_rc: contents_rc content_rc 1393 | ; 1394 content_rc: rc_control_enable | rc_control_interface | rc_control_port | 1395 rc_server_key_file | rc_server_cert_file | rc_control_key_file | 1396 rc_control_cert_file | rc_control_use_cert 1397 ; 1398 rc_control_enable: VAR_CONTROL_ENABLE STRING_ARG 1399 { 1400 OUTYY(("P(control_enable:%s)\n", $2)); 1401 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1402 yyerror("expected yes or no."); 1403 else cfg_parser->cfg->remote_control_enable = 1404 (strcmp($2, "yes")==0); 1405 free($2); 1406 } 1407 ; 1408 rc_control_port: VAR_CONTROL_PORT STRING_ARG 1409 { 1410 OUTYY(("P(control_port:%s)\n", $2)); 1411 if(atoi($2) == 0) 1412 yyerror("control port number expected"); 1413 else cfg_parser->cfg->control_port = atoi($2); 1414 free($2); 1415 } 1416 ; 1417 rc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG 1418 { 1419 OUTYY(("P(control_interface:%s)\n", $2)); 1420 if(!cfg_strlist_insert(&cfg_parser->cfg->control_ifs, $2)) 1421 yyerror("out of memory"); 1422 } 1423 ; 1424 rc_control_use_cert: VAR_CONTROL_USE_CERT STRING_ARG 1425 { 1426 OUTYY(("P(control_use_cert:%s)\n", $2)); 1427 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1428 yyerror("expected yes or no."); 1429 else cfg_parser->cfg->remote_control_use_cert = 1430 (strcmp($2, "yes")==0); 1431 free($2); 1432 } 1433 ; 1434 rc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG 1435 { 1436 OUTYY(("P(rc_server_key_file:%s)\n", $2)); 1437 free(cfg_parser->cfg->server_key_file); 1438 cfg_parser->cfg->server_key_file = $2; 1439 } 1440 ; 1441 rc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG 1442 { 1443 OUTYY(("P(rc_server_cert_file:%s)\n", $2)); 1444 free(cfg_parser->cfg->server_cert_file); 1445 cfg_parser->cfg->server_cert_file = $2; 1446 } 1447 ; 1448 rc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG 1449 { 1450 OUTYY(("P(rc_control_key_file:%s)\n", $2)); 1451 free(cfg_parser->cfg->control_key_file); 1452 cfg_parser->cfg->control_key_file = $2; 1453 } 1454 ; 1455 rc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG 1456 { 1457 OUTYY(("P(rc_control_cert_file:%s)\n", $2)); 1458 free(cfg_parser->cfg->control_cert_file); 1459 cfg_parser->cfg->control_cert_file = $2; 1460 } 1461 ; 1462 dtstart: VAR_DNSTAP 1463 { 1464 OUTYY(("\nP(dnstap:)\n")); 1465 } 1466 ; 1467 contents_dt: contents_dt content_dt 1468 | ; 1469 content_dt: dt_dnstap_enable | dt_dnstap_socket_path | 1470 dt_dnstap_send_identity | dt_dnstap_send_version | 1471 dt_dnstap_identity | dt_dnstap_version | 1472 dt_dnstap_log_resolver_query_messages | 1473 dt_dnstap_log_resolver_response_messages | 1474 dt_dnstap_log_client_query_messages | 1475 dt_dnstap_log_client_response_messages | 1476 dt_dnstap_log_forwarder_query_messages | 1477 dt_dnstap_log_forwarder_response_messages 1478 ; 1479 dt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG 1480 { 1481 OUTYY(("P(dt_dnstap_enable:%s)\n", $2)); 1482 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1483 yyerror("expected yes or no."); 1484 else cfg_parser->cfg->dnstap = (strcmp($2, "yes")==0); 1485 } 1486 ; 1487 dt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG 1488 { 1489 OUTYY(("P(dt_dnstap_socket_path:%s)\n", $2)); 1490 free(cfg_parser->cfg->dnstap_socket_path); 1491 cfg_parser->cfg->dnstap_socket_path = $2; 1492 } 1493 ; 1494 dt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG 1495 { 1496 OUTYY(("P(dt_dnstap_send_identity:%s)\n", $2)); 1497 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1498 yyerror("expected yes or no."); 1499 else cfg_parser->cfg->dnstap_send_identity = (strcmp($2, "yes")==0); 1500 } 1501 ; 1502 dt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG 1503 { 1504 OUTYY(("P(dt_dnstap_send_version:%s)\n", $2)); 1505 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1506 yyerror("expected yes or no."); 1507 else cfg_parser->cfg->dnstap_send_version = (strcmp($2, "yes")==0); 1508 } 1509 ; 1510 dt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG 1511 { 1512 OUTYY(("P(dt_dnstap_identity:%s)\n", $2)); 1513 free(cfg_parser->cfg->dnstap_identity); 1514 cfg_parser->cfg->dnstap_identity = $2; 1515 } 1516 ; 1517 dt_dnstap_version: VAR_DNSTAP_VERSION STRING_ARG 1518 { 1519 OUTYY(("P(dt_dnstap_version:%s)\n", $2)); 1520 free(cfg_parser->cfg->dnstap_version); 1521 cfg_parser->cfg->dnstap_version = $2; 1522 } 1523 ; 1524 dt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES STRING_ARG 1525 { 1526 OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", $2)); 1527 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1528 yyerror("expected yes or no."); 1529 else cfg_parser->cfg->dnstap_log_resolver_query_messages = 1530 (strcmp($2, "yes")==0); 1531 } 1532 ; 1533 dt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG 1534 { 1535 OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", $2)); 1536 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1537 yyerror("expected yes or no."); 1538 else cfg_parser->cfg->dnstap_log_resolver_response_messages = 1539 (strcmp($2, "yes")==0); 1540 } 1541 ; 1542 dt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG 1543 { 1544 OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", $2)); 1545 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1546 yyerror("expected yes or no."); 1547 else cfg_parser->cfg->dnstap_log_client_query_messages = 1548 (strcmp($2, "yes")==0); 1549 } 1550 ; 1551 dt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG 1552 { 1553 OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", $2)); 1554 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1555 yyerror("expected yes or no."); 1556 else cfg_parser->cfg->dnstap_log_client_response_messages = 1557 (strcmp($2, "yes")==0); 1558 } 1559 ; 1560 dt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG 1561 { 1562 OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", $2)); 1563 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1564 yyerror("expected yes or no."); 1565 else cfg_parser->cfg->dnstap_log_forwarder_query_messages = 1566 (strcmp($2, "yes")==0); 1567 } 1568 ; 1569 dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG 1570 { 1571 OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", $2)); 1572 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) 1573 yyerror("expected yes or no."); 1574 else cfg_parser->cfg->dnstap_log_forwarder_response_messages = 1575 (strcmp($2, "yes")==0); 1576 } 1577 ; 1578 pythonstart: VAR_PYTHON 1579 { 1580 OUTYY(("\nP(python:)\n")); 1581 } 1582 ; 1583 contents_py: contents_py content_py 1584 | ; 1585 content_py: py_script 1586 ; 1587 py_script: VAR_PYTHON_SCRIPT STRING_ARG 1588 { 1589 OUTYY(("P(python-script:%s)\n", $2)); 1590 free(cfg_parser->cfg->python_script); 1591 cfg_parser->cfg->python_script = $2; 1592 } 1593 %% 1594 1595 /* parse helper routines could be here */ 1596