configparser.y revision 287917
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
51int ub_c_lex(void);
52void ub_c_error(const char *message);
53
54/* these need to be global, otherwise they cannot be used inside yacc */
55extern 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%%
127toplevelvars: /* empty */ | toplevelvars toplevelvar ;
128toplevelvar: 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 */
134serverstart: VAR_SERVER
135	{
136		OUTYY(("\nP(server:)\n"));
137	}
138	;
139contents_server: contents_server content_server
140	| ;
141content_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	;
190stubstart: 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	;
202contents_stub: contents_stub content_stub
203	| ;
204content_stub: stub_name | stub_host | stub_addr | stub_prime | stub_first
205	;
206forwardstart: 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	;
218contents_forward: contents_forward content_forward
219	| ;
220content_forward: forward_name | forward_host | forward_addr | forward_first
221	;
222server_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	;
231server_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	;
240server_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	;
251server_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	;
260server_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	;
269server_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	;
278server_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	;
291server_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	;
306server_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	;
315server_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	;
324server_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	;
333server_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	;
342server_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	;
351server_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	;
360server_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	;
369server_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	;
378server_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	;
387server_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	;
396server_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	;
405server_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	;
414server_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	;
421server_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	;
428server_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	;
437server_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	;
446server_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	;
460server_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	;
469server_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	;
478server_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	;
485server_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	;
492server_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	;
499server_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	;
507server_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	;
514server_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	;
521server_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	;
528server_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	;
535server_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	;
543server_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	;
551server_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	;
559server_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	;
566server_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	;
573server_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	;
582server_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	;
591server_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	;
598server_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	;
605server_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	;
613server_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	;
621server_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    ;
631server_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    ;
641server_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	;
654server_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	;
665server_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	;
673server_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	;
686server_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	;
695server_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	;
704server_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	;
713server_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	;
723server_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	;
731server_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	;
744server_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	;
753server_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	;
761server_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	;
770server_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	;
778server_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	;
791server_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	;
800server_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	;
807server_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	;
817server_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	;
827server_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	;
837server_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	;
847server_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	;
857server_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	;
867server_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	;
877server_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	;
887server_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	;
894server_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	;
901server_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	;
908server_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	;
917server_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	;
926server_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	;
935server_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	;
942server_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	;
952server_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	;
969server_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	;
976server_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	;
994server_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	;
1007server_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	;
1020server_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	;
1029server_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	;
1038server_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	;
1047server_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	;
1056server_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	;
1066server_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	;
1076server_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	;
1085server_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	;
1094server_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	;
1101server_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	;
1110server_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	;
1119server_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	;
1128server_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	;
1136server_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	;
1149server_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	;
1157server_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	;
1181server_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	;
1188server_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	;
1203server_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	;
1213server_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	;
1223server_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	;
1230server_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	;
1237server_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	;
1246server_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	;
1255server_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	;
1263server_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	;
1276server_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	;
1289server_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	;
1302server_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	;
1311stub_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	;
1321stub_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	;
1328stub_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	;
1335stub_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	;
1344stub_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	;
1354forward_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	;
1364forward_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	;
1371forward_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	;
1378forward_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	;
1387rcstart: VAR_REMOTE_CONTROL
1388	{
1389		OUTYY(("\nP(remote-control:)\n"));
1390	}
1391	;
1392contents_rc: contents_rc content_rc
1393	| ;
1394content_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	;
1398rc_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	;
1408rc_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	;
1417rc_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	;
1424rc_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	;
1434rc_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	;
1441rc_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	;
1448rc_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	;
1455rc_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	;
1462dtstart: VAR_DNSTAP
1463	{
1464		OUTYY(("\nP(dnstap:)\n"));
1465	}
1466	;
1467contents_dt: contents_dt content_dt
1468	| ;
1469content_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	;
1479dt_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	;
1487dt_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	;
1494dt_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	;
1502dt_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	;
1510dt_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	;
1517dt_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	;
1524dt_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	;
1533dt_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	;
1542dt_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	;
1551dt_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	;
1560dt_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	;
1569dt_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	;
1578pythonstart: VAR_PYTHON
1579	{
1580		OUTYY(("\nP(python:)\n"));
1581	}
1582	;
1583contents_py: contents_py content_py
1584	| ;
1585content_py: py_script
1586	;
1587py_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