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