1238106Sdes/*
2238106Sdes * configparser.y -- yacc grammar for unbound configuration files
3238106Sdes *
4238106Sdes * Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
5238106Sdes *
6238106Sdes * Copyright (c) 2007, NLnet Labs. All rights reserved.
7238106Sdes *
8238106Sdes * This software is open source.
9238106Sdes *
10238106Sdes * Redistribution and use in source and binary forms, with or without
11238106Sdes * modification, are permitted provided that the following conditions
12238106Sdes * are met:
13238106Sdes *
14238106Sdes * Redistributions of source code must retain the above copyright notice,
15238106Sdes * this list of conditions and the following disclaimer.
16238106Sdes *
17238106Sdes * Redistributions in binary form must reproduce the above copyright notice,
18238106Sdes * this list of conditions and the following disclaimer in the documentation
19238106Sdes * and/or other materials provided with the distribution.
20238106Sdes *
21238106Sdes * Neither the name of the NLNET LABS nor the names of its contributors may
22238106Sdes * be used to endorse or promote products derived from this software without
23238106Sdes * specific prior written permission.
24238106Sdes *
25238106Sdes * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26269257Sdes * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27269257Sdes * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28269257Sdes * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29269257Sdes * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30269257Sdes * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
31269257Sdes * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32269257Sdes * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33269257Sdes * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34269257Sdes * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35269257Sdes * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36238106Sdes */
37238106Sdes
38238106Sdes%{
39238106Sdes#include "config.h"
40238106Sdes
41238106Sdes#include <stdarg.h>
42238106Sdes#include <stdio.h>
43238106Sdes#include <string.h>
44238106Sdes#include <stdlib.h>
45238106Sdes#include <assert.h>
46238106Sdes
47238106Sdes#include "util/config_file.h"
48238106Sdes#include "util/net_help.h"
49238106Sdes
50238106Sdesint ub_c_lex(void);
51238106Sdesvoid ub_c_error(const char *message);
52238106Sdes
53238106Sdes/* these need to be global, otherwise they cannot be used inside yacc */
54238106Sdesextern struct config_parser_state* cfg_parser;
55238106Sdes
56238106Sdes#if 0
57238106Sdes#define OUTYY(s)  printf s /* used ONLY when debugging */
58238106Sdes#else
59238106Sdes#define OUTYY(s)
60238106Sdes#endif
61238106Sdes
62238106Sdes%}
63238106Sdes%union {
64238106Sdes	char*	str;
65238106Sdes};
66238106Sdes
67238106Sdes%token SPACE LETTER NEWLINE COMMENT COLON ANY ZONESTR
68238106Sdes%token <str> STRING_ARG
69238106Sdes%token VAR_SERVER VAR_VERBOSITY VAR_NUM_THREADS VAR_PORT
70238106Sdes%token VAR_OUTGOING_RANGE VAR_INTERFACE
71238106Sdes%token VAR_DO_IP4 VAR_DO_IP6 VAR_DO_UDP VAR_DO_TCP
72238106Sdes%token VAR_CHROOT VAR_USERNAME VAR_DIRECTORY VAR_LOGFILE VAR_PIDFILE
73238106Sdes%token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS VAR_NUM_QUERIES_PER_THREAD
74238106Sdes%token VAR_RRSET_CACHE_SIZE VAR_RRSET_CACHE_SLABS VAR_OUTGOING_NUM_TCP
75238106Sdes%token VAR_INFRA_HOST_TTL VAR_INFRA_LAME_TTL VAR_INFRA_CACHE_SLABS
76238106Sdes%token VAR_INFRA_CACHE_NUMHOSTS VAR_INFRA_CACHE_LAME_SIZE VAR_NAME
77238106Sdes%token VAR_STUB_ZONE VAR_STUB_HOST VAR_STUB_ADDR VAR_TARGET_FETCH_POLICY
78238106Sdes%token VAR_HARDEN_SHORT_BUFSIZE VAR_HARDEN_LARGE_QUERIES
79238106Sdes%token VAR_FORWARD_ZONE VAR_FORWARD_HOST VAR_FORWARD_ADDR
80238106Sdes%token VAR_DO_NOT_QUERY_ADDRESS VAR_HIDE_IDENTITY VAR_HIDE_VERSION
81238106Sdes%token VAR_IDENTITY VAR_VERSION VAR_HARDEN_GLUE VAR_MODULE_CONF
82238106Sdes%token VAR_TRUST_ANCHOR_FILE VAR_TRUST_ANCHOR VAR_VAL_OVERRIDE_DATE
83238106Sdes%token VAR_BOGUS_TTL VAR_VAL_CLEAN_ADDITIONAL VAR_VAL_PERMISSIVE_MODE
84238106Sdes%token VAR_INCOMING_NUM_TCP VAR_MSG_BUFFER_SIZE VAR_KEY_CACHE_SIZE
85238106Sdes%token VAR_KEY_CACHE_SLABS VAR_TRUSTED_KEYS_FILE
86238106Sdes%token VAR_VAL_NSEC3_KEYSIZE_ITERATIONS VAR_USE_SYSLOG
87238106Sdes%token VAR_OUTGOING_INTERFACE VAR_ROOT_HINTS VAR_DO_NOT_QUERY_LOCALHOST
88238106Sdes%token VAR_CACHE_MAX_TTL VAR_HARDEN_DNSSEC_STRIPPED VAR_ACCESS_CONTROL
89238106Sdes%token VAR_LOCAL_ZONE VAR_LOCAL_DATA VAR_INTERFACE_AUTOMATIC
90238106Sdes%token VAR_STATISTICS_INTERVAL VAR_DO_DAEMONIZE VAR_USE_CAPS_FOR_ID
91238106Sdes%token VAR_STATISTICS_CUMULATIVE VAR_OUTGOING_PORT_PERMIT
92238106Sdes%token VAR_OUTGOING_PORT_AVOID VAR_DLV_ANCHOR_FILE VAR_DLV_ANCHOR
93238106Sdes%token VAR_NEG_CACHE_SIZE VAR_HARDEN_REFERRAL_PATH VAR_PRIVATE_ADDRESS
94238106Sdes%token VAR_PRIVATE_DOMAIN VAR_REMOTE_CONTROL VAR_CONTROL_ENABLE
95238106Sdes%token VAR_CONTROL_INTERFACE VAR_CONTROL_PORT VAR_SERVER_KEY_FILE
96238106Sdes%token VAR_SERVER_CERT_FILE VAR_CONTROL_KEY_FILE VAR_CONTROL_CERT_FILE
97238106Sdes%token VAR_EXTENDED_STATISTICS VAR_LOCAL_DATA_PTR VAR_JOSTLE_TIMEOUT
98238106Sdes%token VAR_STUB_PRIME VAR_UNWANTED_REPLY_THRESHOLD VAR_LOG_TIME_ASCII
99238106Sdes%token VAR_DOMAIN_INSECURE VAR_PYTHON VAR_PYTHON_SCRIPT VAR_VAL_SIG_SKEW_MIN
100238106Sdes%token VAR_VAL_SIG_SKEW_MAX VAR_CACHE_MIN_TTL VAR_VAL_LOG_LEVEL
101238106Sdes%token VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING VAR_ADD_HOLDDOWN
102238106Sdes%token VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE VAR_PREFETCH
103269257Sdes%token VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT VAR_HARDEN_BELOW_NXDOMAIN
104238106Sdes%token VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES VAR_TCP_UPSTREAM VAR_SSL_UPSTREAM
105238106Sdes%token VAR_SSL_SERVICE_KEY VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST
106238106Sdes%token VAR_STUB_FIRST VAR_MINIMAL_RESPONSES VAR_RRSET_ROUNDROBIN
107269257Sdes%token VAR_MAX_UDP_SIZE VAR_DELAY_CLOSE VAR_UNBLOCK_LAN_ZONES
108238106Sdes
109238106Sdes%%
110238106Sdestoplevelvars: /* empty */ | toplevelvars toplevelvar ;
111238106Sdestoplevelvar: serverstart contents_server | stubstart contents_stub |
112238106Sdes	forwardstart contents_forward | pythonstart contents_py |
113238106Sdes	rcstart contents_rc
114238106Sdes	;
115238106Sdes
116238106Sdes/* server: declaration */
117238106Sdesserverstart: VAR_SERVER
118238106Sdes	{
119238106Sdes		OUTYY(("\nP(server:)\n"));
120238106Sdes	}
121238106Sdes	;
122238106Sdescontents_server: contents_server content_server
123238106Sdes	| ;
124238106Sdescontent_server: server_num_threads | server_verbosity | server_port |
125238106Sdes	server_outgoing_range | server_do_ip4 |
126238106Sdes	server_do_ip6 | server_do_udp | server_do_tcp |
127238106Sdes	server_interface | server_chroot | server_username |
128238106Sdes	server_directory | server_logfile | server_pidfile |
129238106Sdes	server_msg_cache_size | server_msg_cache_slabs |
130238106Sdes	server_num_queries_per_thread | server_rrset_cache_size |
131238106Sdes	server_rrset_cache_slabs | server_outgoing_num_tcp |
132238106Sdes	server_infra_host_ttl | server_infra_lame_ttl |
133238106Sdes	server_infra_cache_slabs | server_infra_cache_numhosts |
134238106Sdes	server_infra_cache_lame_size | server_target_fetch_policy |
135238106Sdes	server_harden_short_bufsize | server_harden_large_queries |
136238106Sdes	server_do_not_query_address | server_hide_identity |
137238106Sdes	server_hide_version | server_identity | server_version |
138238106Sdes	server_harden_glue | server_module_conf | server_trust_anchor_file |
139238106Sdes	server_trust_anchor | server_val_override_date | server_bogus_ttl |
140238106Sdes	server_val_clean_additional | server_val_permissive_mode |
141238106Sdes	server_incoming_num_tcp | server_msg_buffer_size |
142238106Sdes	server_key_cache_size | server_key_cache_slabs |
143238106Sdes	server_trusted_keys_file | server_val_nsec3_keysize_iterations |
144238106Sdes	server_use_syslog | server_outgoing_interface | server_root_hints |
145238106Sdes	server_do_not_query_localhost | server_cache_max_ttl |
146238106Sdes	server_harden_dnssec_stripped | server_access_control |
147238106Sdes	server_local_zone | server_local_data | server_interface_automatic |
148238106Sdes	server_statistics_interval | server_do_daemonize |
149238106Sdes	server_use_caps_for_id | server_statistics_cumulative |
150238106Sdes	server_outgoing_port_permit | server_outgoing_port_avoid |
151238106Sdes	server_dlv_anchor_file | server_dlv_anchor | server_neg_cache_size |
152238106Sdes	server_harden_referral_path | server_private_address |
153238106Sdes	server_private_domain | server_extended_statistics |
154238106Sdes	server_local_data_ptr | server_jostle_timeout |
155238106Sdes	server_unwanted_reply_threshold | server_log_time_ascii |
156238106Sdes	server_domain_insecure | server_val_sig_skew_min |
157238106Sdes	server_val_sig_skew_max | server_cache_min_ttl | server_val_log_level |
158238106Sdes	server_auto_trust_anchor_file | server_add_holddown |
159238106Sdes	server_del_holddown | server_keep_missing | server_so_rcvbuf |
160238106Sdes	server_edns_buffer_size | server_prefetch | server_prefetch_key |
161238106Sdes	server_so_sndbuf | server_harden_below_nxdomain | server_ignore_cd_flag |
162238106Sdes	server_log_queries | server_tcp_upstream | server_ssl_upstream |
163238106Sdes	server_ssl_service_key | server_ssl_service_pem | server_ssl_port |
164269257Sdes	server_minimal_responses | server_rrset_roundrobin | server_max_udp_size |
165269257Sdes	server_so_reuseport | server_delay_close | server_unblock_lan_zones
166238106Sdes	;
167238106Sdesstubstart: VAR_STUB_ZONE
168238106Sdes	{
169238106Sdes		struct config_stub* s;
170238106Sdes		OUTYY(("\nP(stub_zone:)\n"));
171238106Sdes		s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
172238106Sdes		if(s) {
173238106Sdes			s->next = cfg_parser->cfg->stubs;
174238106Sdes			cfg_parser->cfg->stubs = s;
175238106Sdes		} else
176238106Sdes			yyerror("out of memory");
177238106Sdes	}
178238106Sdes	;
179238106Sdescontents_stub: contents_stub content_stub
180238106Sdes	| ;
181238106Sdescontent_stub: stub_name | stub_host | stub_addr | stub_prime | stub_first
182238106Sdes	;
183238106Sdesforwardstart: VAR_FORWARD_ZONE
184238106Sdes	{
185238106Sdes		struct config_stub* s;
186238106Sdes		OUTYY(("\nP(forward_zone:)\n"));
187238106Sdes		s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
188238106Sdes		if(s) {
189238106Sdes			s->next = cfg_parser->cfg->forwards;
190238106Sdes			cfg_parser->cfg->forwards = s;
191238106Sdes		} else
192238106Sdes			yyerror("out of memory");
193238106Sdes	}
194238106Sdes	;
195238106Sdescontents_forward: contents_forward content_forward
196238106Sdes	| ;
197238106Sdescontent_forward: forward_name | forward_host | forward_addr | forward_first
198238106Sdes	;
199238106Sdesserver_num_threads: VAR_NUM_THREADS STRING_ARG
200238106Sdes	{
201238106Sdes		OUTYY(("P(server_num_threads:%s)\n", $2));
202238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
203238106Sdes			yyerror("number expected");
204238106Sdes		else cfg_parser->cfg->num_threads = atoi($2);
205238106Sdes		free($2);
206238106Sdes	}
207238106Sdes	;
208238106Sdesserver_verbosity: VAR_VERBOSITY STRING_ARG
209238106Sdes	{
210238106Sdes		OUTYY(("P(server_verbosity:%s)\n", $2));
211238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
212238106Sdes			yyerror("number expected");
213238106Sdes		else cfg_parser->cfg->verbosity = atoi($2);
214238106Sdes		free($2);
215238106Sdes	}
216238106Sdes	;
217238106Sdesserver_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG
218238106Sdes	{
219238106Sdes		OUTYY(("P(server_statistics_interval:%s)\n", $2));
220238106Sdes		if(strcmp($2, "") == 0 || strcmp($2, "0") == 0)
221238106Sdes			cfg_parser->cfg->stat_interval = 0;
222238106Sdes		else if(atoi($2) == 0)
223238106Sdes			yyerror("number expected");
224238106Sdes		else cfg_parser->cfg->stat_interval = atoi($2);
225238106Sdes		free($2);
226238106Sdes	}
227238106Sdes	;
228238106Sdesserver_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG
229238106Sdes	{
230238106Sdes		OUTYY(("P(server_statistics_cumulative:%s)\n", $2));
231238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
232238106Sdes			yyerror("expected yes or no.");
233238106Sdes		else cfg_parser->cfg->stat_cumulative = (strcmp($2, "yes")==0);
234238106Sdes		free($2);
235238106Sdes	}
236238106Sdes	;
237238106Sdesserver_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG
238238106Sdes	{
239238106Sdes		OUTYY(("P(server_extended_statistics:%s)\n", $2));
240238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
241238106Sdes			yyerror("expected yes or no.");
242238106Sdes		else cfg_parser->cfg->stat_extended = (strcmp($2, "yes")==0);
243238106Sdes		free($2);
244238106Sdes	}
245238106Sdes	;
246238106Sdesserver_port: VAR_PORT STRING_ARG
247238106Sdes	{
248238106Sdes		OUTYY(("P(server_port:%s)\n", $2));
249238106Sdes		if(atoi($2) == 0)
250238106Sdes			yyerror("port number expected");
251238106Sdes		else cfg_parser->cfg->port = atoi($2);
252238106Sdes		free($2);
253238106Sdes	}
254238106Sdes	;
255238106Sdesserver_interface: VAR_INTERFACE STRING_ARG
256238106Sdes	{
257238106Sdes		OUTYY(("P(server_interface:%s)\n", $2));
258238106Sdes		if(cfg_parser->cfg->num_ifs == 0)
259238106Sdes			cfg_parser->cfg->ifs = calloc(1, sizeof(char*));
260238106Sdes		else 	cfg_parser->cfg->ifs = realloc(cfg_parser->cfg->ifs,
261238106Sdes				(cfg_parser->cfg->num_ifs+1)*sizeof(char*));
262238106Sdes		if(!cfg_parser->cfg->ifs)
263238106Sdes			yyerror("out of memory");
264238106Sdes		else
265238106Sdes			cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = $2;
266238106Sdes	}
267238106Sdes	;
268238106Sdesserver_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG
269238106Sdes	{
270238106Sdes		OUTYY(("P(server_outgoing_interface:%s)\n", $2));
271238106Sdes		if(cfg_parser->cfg->num_out_ifs == 0)
272238106Sdes			cfg_parser->cfg->out_ifs = calloc(1, sizeof(char*));
273238106Sdes		else 	cfg_parser->cfg->out_ifs = realloc(
274238106Sdes			cfg_parser->cfg->out_ifs,
275238106Sdes			(cfg_parser->cfg->num_out_ifs+1)*sizeof(char*));
276238106Sdes		if(!cfg_parser->cfg->out_ifs)
277238106Sdes			yyerror("out of memory");
278238106Sdes		else
279238106Sdes			cfg_parser->cfg->out_ifs[
280238106Sdes				cfg_parser->cfg->num_out_ifs++] = $2;
281238106Sdes	}
282238106Sdes	;
283238106Sdesserver_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG
284238106Sdes	{
285238106Sdes		OUTYY(("P(server_outgoing_range:%s)\n", $2));
286238106Sdes		if(atoi($2) == 0)
287238106Sdes			yyerror("number expected");
288238106Sdes		else cfg_parser->cfg->outgoing_num_ports = atoi($2);
289238106Sdes		free($2);
290238106Sdes	}
291238106Sdes	;
292238106Sdesserver_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG
293238106Sdes	{
294238106Sdes		OUTYY(("P(server_outgoing_port_permit:%s)\n", $2));
295238106Sdes		if(!cfg_mark_ports($2, 1,
296238106Sdes			cfg_parser->cfg->outgoing_avail_ports, 65536))
297238106Sdes			yyerror("port number or range (\"low-high\") expected");
298238106Sdes		free($2);
299238106Sdes	}
300238106Sdes	;
301238106Sdesserver_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG
302238106Sdes	{
303238106Sdes		OUTYY(("P(server_outgoing_port_avoid:%s)\n", $2));
304238106Sdes		if(!cfg_mark_ports($2, 0,
305238106Sdes			cfg_parser->cfg->outgoing_avail_ports, 65536))
306238106Sdes			yyerror("port number or range (\"low-high\") expected");
307238106Sdes		free($2);
308238106Sdes	}
309238106Sdes	;
310238106Sdesserver_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG
311238106Sdes	{
312238106Sdes		OUTYY(("P(server_outgoing_num_tcp:%s)\n", $2));
313238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
314238106Sdes			yyerror("number expected");
315238106Sdes		else cfg_parser->cfg->outgoing_num_tcp = atoi($2);
316238106Sdes		free($2);
317238106Sdes	}
318238106Sdes	;
319238106Sdesserver_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG
320238106Sdes	{
321238106Sdes		OUTYY(("P(server_incoming_num_tcp:%s)\n", $2));
322238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
323238106Sdes			yyerror("number expected");
324238106Sdes		else cfg_parser->cfg->incoming_num_tcp = atoi($2);
325238106Sdes		free($2);
326238106Sdes	}
327238106Sdes	;
328238106Sdesserver_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG
329238106Sdes	{
330238106Sdes		OUTYY(("P(server_interface_automatic:%s)\n", $2));
331238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
332238106Sdes			yyerror("expected yes or no.");
333238106Sdes		else cfg_parser->cfg->if_automatic = (strcmp($2, "yes")==0);
334238106Sdes		free($2);
335238106Sdes	}
336238106Sdes	;
337238106Sdesserver_do_ip4: VAR_DO_IP4 STRING_ARG
338238106Sdes	{
339238106Sdes		OUTYY(("P(server_do_ip4:%s)\n", $2));
340238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
341238106Sdes			yyerror("expected yes or no.");
342238106Sdes		else cfg_parser->cfg->do_ip4 = (strcmp($2, "yes")==0);
343238106Sdes		free($2);
344238106Sdes	}
345238106Sdes	;
346238106Sdesserver_do_ip6: VAR_DO_IP6 STRING_ARG
347238106Sdes	{
348238106Sdes		OUTYY(("P(server_do_ip6:%s)\n", $2));
349238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
350238106Sdes			yyerror("expected yes or no.");
351238106Sdes		else cfg_parser->cfg->do_ip6 = (strcmp($2, "yes")==0);
352238106Sdes		free($2);
353238106Sdes	}
354238106Sdes	;
355238106Sdesserver_do_udp: VAR_DO_UDP STRING_ARG
356238106Sdes	{
357238106Sdes		OUTYY(("P(server_do_udp:%s)\n", $2));
358238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
359238106Sdes			yyerror("expected yes or no.");
360238106Sdes		else cfg_parser->cfg->do_udp = (strcmp($2, "yes")==0);
361238106Sdes		free($2);
362238106Sdes	}
363238106Sdes	;
364238106Sdesserver_do_tcp: VAR_DO_TCP STRING_ARG
365238106Sdes	{
366238106Sdes		OUTYY(("P(server_do_tcp:%s)\n", $2));
367238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
368238106Sdes			yyerror("expected yes or no.");
369238106Sdes		else cfg_parser->cfg->do_tcp = (strcmp($2, "yes")==0);
370238106Sdes		free($2);
371238106Sdes	}
372238106Sdes	;
373238106Sdesserver_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG
374238106Sdes	{
375238106Sdes		OUTYY(("P(server_tcp_upstream:%s)\n", $2));
376238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
377238106Sdes			yyerror("expected yes or no.");
378238106Sdes		else cfg_parser->cfg->tcp_upstream = (strcmp($2, "yes")==0);
379238106Sdes		free($2);
380238106Sdes	}
381238106Sdes	;
382238106Sdesserver_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG
383238106Sdes	{
384238106Sdes		OUTYY(("P(server_ssl_upstream:%s)\n", $2));
385238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
386238106Sdes			yyerror("expected yes or no.");
387238106Sdes		else cfg_parser->cfg->ssl_upstream = (strcmp($2, "yes")==0);
388238106Sdes		free($2);
389238106Sdes	}
390238106Sdes	;
391238106Sdesserver_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG
392238106Sdes	{
393238106Sdes		OUTYY(("P(server_ssl_service_key:%s)\n", $2));
394238106Sdes		free(cfg_parser->cfg->ssl_service_key);
395238106Sdes		cfg_parser->cfg->ssl_service_key = $2;
396238106Sdes	}
397238106Sdes	;
398238106Sdesserver_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG
399238106Sdes	{
400238106Sdes		OUTYY(("P(server_ssl_service_pem:%s)\n", $2));
401238106Sdes		free(cfg_parser->cfg->ssl_service_pem);
402238106Sdes		cfg_parser->cfg->ssl_service_pem = $2;
403238106Sdes	}
404238106Sdes	;
405238106Sdesserver_ssl_port: VAR_SSL_PORT STRING_ARG
406238106Sdes	{
407238106Sdes		OUTYY(("P(server_ssl_port:%s)\n", $2));
408238106Sdes		if(atoi($2) == 0)
409238106Sdes			yyerror("port number expected");
410238106Sdes		else cfg_parser->cfg->ssl_port = atoi($2);
411238106Sdes		free($2);
412238106Sdes	}
413238106Sdes	;
414238106Sdesserver_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG
415238106Sdes	{
416238106Sdes		OUTYY(("P(server_do_daemonize:%s)\n", $2));
417238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
418238106Sdes			yyerror("expected yes or no.");
419238106Sdes		else cfg_parser->cfg->do_daemonize = (strcmp($2, "yes")==0);
420238106Sdes		free($2);
421238106Sdes	}
422238106Sdes	;
423238106Sdesserver_use_syslog: VAR_USE_SYSLOG STRING_ARG
424238106Sdes	{
425238106Sdes		OUTYY(("P(server_use_syslog:%s)\n", $2));
426238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
427238106Sdes			yyerror("expected yes or no.");
428238106Sdes		else cfg_parser->cfg->use_syslog = (strcmp($2, "yes")==0);
429238106Sdes#if !defined(HAVE_SYSLOG_H) && !defined(UB_ON_WINDOWS)
430238106Sdes		if(strcmp($2, "yes") == 0)
431238106Sdes			yyerror("no syslog services are available. "
432238106Sdes				"(reconfigure and compile to add)");
433238106Sdes#endif
434238106Sdes		free($2);
435238106Sdes	}
436238106Sdes	;
437238106Sdesserver_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG
438238106Sdes	{
439238106Sdes		OUTYY(("P(server_log_time_ascii:%s)\n", $2));
440238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
441238106Sdes			yyerror("expected yes or no.");
442238106Sdes		else cfg_parser->cfg->log_time_ascii = (strcmp($2, "yes")==0);
443238106Sdes		free($2);
444238106Sdes	}
445238106Sdes	;
446238106Sdesserver_log_queries: VAR_LOG_QUERIES STRING_ARG
447238106Sdes	{
448238106Sdes		OUTYY(("P(server_log_queries:%s)\n", $2));
449238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
450238106Sdes			yyerror("expected yes or no.");
451238106Sdes		else cfg_parser->cfg->log_queries = (strcmp($2, "yes")==0);
452238106Sdes		free($2);
453238106Sdes	}
454238106Sdes	;
455238106Sdesserver_chroot: VAR_CHROOT STRING_ARG
456238106Sdes	{
457238106Sdes		OUTYY(("P(server_chroot:%s)\n", $2));
458238106Sdes		free(cfg_parser->cfg->chrootdir);
459238106Sdes		cfg_parser->cfg->chrootdir = $2;
460238106Sdes	}
461238106Sdes	;
462238106Sdesserver_username: VAR_USERNAME STRING_ARG
463238106Sdes	{
464238106Sdes		OUTYY(("P(server_username:%s)\n", $2));
465238106Sdes		free(cfg_parser->cfg->username);
466238106Sdes		cfg_parser->cfg->username = $2;
467238106Sdes	}
468238106Sdes	;
469238106Sdesserver_directory: VAR_DIRECTORY STRING_ARG
470238106Sdes	{
471238106Sdes		OUTYY(("P(server_directory:%s)\n", $2));
472238106Sdes		free(cfg_parser->cfg->directory);
473238106Sdes		cfg_parser->cfg->directory = $2;
474238106Sdes	}
475238106Sdes	;
476238106Sdesserver_logfile: VAR_LOGFILE STRING_ARG
477238106Sdes	{
478238106Sdes		OUTYY(("P(server_logfile:%s)\n", $2));
479238106Sdes		free(cfg_parser->cfg->logfile);
480238106Sdes		cfg_parser->cfg->logfile = $2;
481238106Sdes		cfg_parser->cfg->use_syslog = 0;
482238106Sdes	}
483238106Sdes	;
484238106Sdesserver_pidfile: VAR_PIDFILE STRING_ARG
485238106Sdes	{
486238106Sdes		OUTYY(("P(server_pidfile:%s)\n", $2));
487238106Sdes		free(cfg_parser->cfg->pidfile);
488238106Sdes		cfg_parser->cfg->pidfile = $2;
489238106Sdes	}
490238106Sdes	;
491238106Sdesserver_root_hints: VAR_ROOT_HINTS STRING_ARG
492238106Sdes	{
493238106Sdes		OUTYY(("P(server_root_hints:%s)\n", $2));
494238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, $2))
495238106Sdes			yyerror("out of memory");
496238106Sdes	}
497238106Sdes	;
498238106Sdesserver_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG
499238106Sdes	{
500238106Sdes		OUTYY(("P(server_dlv_anchor_file:%s)\n", $2));
501238106Sdes		free(cfg_parser->cfg->dlv_anchor_file);
502238106Sdes		cfg_parser->cfg->dlv_anchor_file = $2;
503238106Sdes	}
504238106Sdes	;
505238106Sdesserver_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG
506238106Sdes	{
507238106Sdes		OUTYY(("P(server_dlv_anchor:%s)\n", $2));
508238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->dlv_anchor_list, $2))
509238106Sdes			yyerror("out of memory");
510238106Sdes	}
511238106Sdes	;
512238106Sdesserver_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG
513238106Sdes	{
514238106Sdes		OUTYY(("P(server_auto_trust_anchor_file:%s)\n", $2));
515238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->
516238106Sdes			auto_trust_anchor_file_list, $2))
517238106Sdes			yyerror("out of memory");
518238106Sdes	}
519238106Sdes	;
520238106Sdesserver_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG
521238106Sdes	{
522238106Sdes		OUTYY(("P(server_trust_anchor_file:%s)\n", $2));
523238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->
524238106Sdes			trust_anchor_file_list, $2))
525238106Sdes			yyerror("out of memory");
526238106Sdes	}
527238106Sdes	;
528238106Sdesserver_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG
529238106Sdes	{
530238106Sdes		OUTYY(("P(server_trusted_keys_file:%s)\n", $2));
531238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->
532238106Sdes			trusted_keys_file_list, $2))
533238106Sdes			yyerror("out of memory");
534238106Sdes	}
535238106Sdes	;
536238106Sdesserver_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG
537238106Sdes	{
538238106Sdes		OUTYY(("P(server_trust_anchor:%s)\n", $2));
539238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, $2))
540238106Sdes			yyerror("out of memory");
541238106Sdes	}
542238106Sdes	;
543238106Sdesserver_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG
544238106Sdes	{
545238106Sdes		OUTYY(("P(server_domain_insecure:%s)\n", $2));
546238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, $2))
547238106Sdes			yyerror("out of memory");
548238106Sdes	}
549238106Sdes	;
550238106Sdesserver_hide_identity: VAR_HIDE_IDENTITY STRING_ARG
551238106Sdes	{
552238106Sdes		OUTYY(("P(server_hide_identity:%s)\n", $2));
553238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
554238106Sdes			yyerror("expected yes or no.");
555238106Sdes		else cfg_parser->cfg->hide_identity = (strcmp($2, "yes")==0);
556238106Sdes		free($2);
557238106Sdes	}
558238106Sdes	;
559238106Sdesserver_hide_version: VAR_HIDE_VERSION STRING_ARG
560238106Sdes	{
561238106Sdes		OUTYY(("P(server_hide_version:%s)\n", $2));
562238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
563238106Sdes			yyerror("expected yes or no.");
564238106Sdes		else cfg_parser->cfg->hide_version = (strcmp($2, "yes")==0);
565238106Sdes		free($2);
566238106Sdes	}
567238106Sdes	;
568238106Sdesserver_identity: VAR_IDENTITY STRING_ARG
569238106Sdes	{
570238106Sdes		OUTYY(("P(server_identity:%s)\n", $2));
571238106Sdes		free(cfg_parser->cfg->identity);
572238106Sdes		cfg_parser->cfg->identity = $2;
573238106Sdes	}
574238106Sdes	;
575238106Sdesserver_version: VAR_VERSION STRING_ARG
576238106Sdes	{
577238106Sdes		OUTYY(("P(server_version:%s)\n", $2));
578238106Sdes		free(cfg_parser->cfg->version);
579238106Sdes		cfg_parser->cfg->version = $2;
580238106Sdes	}
581238106Sdes	;
582238106Sdesserver_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG
583238106Sdes	{
584238106Sdes		OUTYY(("P(server_so_rcvbuf:%s)\n", $2));
585238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_rcvbuf))
586238106Sdes			yyerror("buffer size expected");
587238106Sdes		free($2);
588238106Sdes	}
589238106Sdes	;
590238106Sdesserver_so_sndbuf: VAR_SO_SNDBUF STRING_ARG
591238106Sdes	{
592238106Sdes		OUTYY(("P(server_so_sndbuf:%s)\n", $2));
593238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_sndbuf))
594238106Sdes			yyerror("buffer size expected");
595238106Sdes		free($2);
596238106Sdes	}
597238106Sdes	;
598269257Sdesserver_so_reuseport: VAR_SO_REUSEPORT STRING_ARG
599269257Sdes    {
600269257Sdes        OUTYY(("P(server_so_reuseport:%s)\n", $2));
601269257Sdes        if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
602269257Sdes            yyerror("expected yes or no.");
603269257Sdes        else cfg_parser->cfg->so_reuseport =
604269257Sdes            (strcmp($2, "yes")==0);
605269257Sdes        free($2);
606269257Sdes    }
607269257Sdes    ;
608238106Sdesserver_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG
609238106Sdes	{
610238106Sdes		OUTYY(("P(server_edns_buffer_size:%s)\n", $2));
611238106Sdes		if(atoi($2) == 0)
612238106Sdes			yyerror("number expected");
613238106Sdes		else if (atoi($2) < 12)
614238106Sdes			yyerror("edns buffer size too small");
615238106Sdes		else if (atoi($2) > 65535)
616238106Sdes			cfg_parser->cfg->edns_buffer_size = 65535;
617238106Sdes		else cfg_parser->cfg->edns_buffer_size = atoi($2);
618238106Sdes		free($2);
619238106Sdes	}
620238106Sdes	;
621238106Sdesserver_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG
622238106Sdes	{
623238106Sdes		OUTYY(("P(server_msg_buffer_size:%s)\n", $2));
624238106Sdes		if(atoi($2) == 0)
625238106Sdes			yyerror("number expected");
626238106Sdes		else if (atoi($2) < 4096)
627238106Sdes			yyerror("message buffer size too small (use 4096)");
628238106Sdes		else cfg_parser->cfg->msg_buffer_size = atoi($2);
629238106Sdes		free($2);
630238106Sdes	}
631238106Sdes	;
632238106Sdesserver_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG
633238106Sdes	{
634238106Sdes		OUTYY(("P(server_msg_cache_size:%s)\n", $2));
635238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->msg_cache_size))
636238106Sdes			yyerror("memory size expected");
637238106Sdes		free($2);
638238106Sdes	}
639238106Sdes	;
640238106Sdesserver_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG
641238106Sdes	{
642238106Sdes		OUTYY(("P(server_msg_cache_slabs:%s)\n", $2));
643238106Sdes		if(atoi($2) == 0)
644238106Sdes			yyerror("number expected");
645238106Sdes		else {
646238106Sdes			cfg_parser->cfg->msg_cache_slabs = atoi($2);
647238106Sdes			if(!is_pow2(cfg_parser->cfg->msg_cache_slabs))
648238106Sdes				yyerror("must be a power of 2");
649238106Sdes		}
650238106Sdes		free($2);
651238106Sdes	}
652238106Sdes	;
653238106Sdesserver_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG
654238106Sdes	{
655238106Sdes		OUTYY(("P(server_num_queries_per_thread:%s)\n", $2));
656238106Sdes		if(atoi($2) == 0)
657238106Sdes			yyerror("number expected");
658238106Sdes		else cfg_parser->cfg->num_queries_per_thread = atoi($2);
659238106Sdes		free($2);
660238106Sdes	}
661238106Sdes	;
662238106Sdesserver_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG
663238106Sdes	{
664238106Sdes		OUTYY(("P(server_jostle_timeout:%s)\n", $2));
665238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
666238106Sdes			yyerror("number expected");
667238106Sdes		else cfg_parser->cfg->jostle_time = atoi($2);
668238106Sdes		free($2);
669238106Sdes	}
670238106Sdes	;
671269257Sdesserver_delay_close: VAR_DELAY_CLOSE STRING_ARG
672269257Sdes	{
673269257Sdes		OUTYY(("P(server_delay_close:%s)\n", $2));
674269257Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
675269257Sdes			yyerror("number expected");
676269257Sdes		else cfg_parser->cfg->delay_close = atoi($2);
677269257Sdes		free($2);
678269257Sdes	}
679269257Sdes	;
680269257Sdesserver_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG
681269257Sdes	{
682269257Sdes		OUTYY(("P(server_unblock_lan_zones:%s)\n", $2));
683269257Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
684269257Sdes			yyerror("expected yes or no.");
685269257Sdes		else cfg_parser->cfg->unblock_lan_zones =
686269257Sdes			(strcmp($2, "yes")==0);
687269257Sdes		free($2);
688269257Sdes	}
689269257Sdes	;
690238106Sdesserver_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG
691238106Sdes	{
692238106Sdes		OUTYY(("P(server_rrset_cache_size:%s)\n", $2));
693238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->rrset_cache_size))
694238106Sdes			yyerror("memory size expected");
695238106Sdes		free($2);
696238106Sdes	}
697238106Sdes	;
698238106Sdesserver_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG
699238106Sdes	{
700238106Sdes		OUTYY(("P(server_rrset_cache_slabs:%s)\n", $2));
701238106Sdes		if(atoi($2) == 0)
702238106Sdes			yyerror("number expected");
703238106Sdes		else {
704238106Sdes			cfg_parser->cfg->rrset_cache_slabs = atoi($2);
705238106Sdes			if(!is_pow2(cfg_parser->cfg->rrset_cache_slabs))
706238106Sdes				yyerror("must be a power of 2");
707238106Sdes		}
708238106Sdes		free($2);
709238106Sdes	}
710238106Sdes	;
711238106Sdesserver_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG
712238106Sdes	{
713238106Sdes		OUTYY(("P(server_infra_host_ttl:%s)\n", $2));
714238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
715238106Sdes			yyerror("number expected");
716238106Sdes		else cfg_parser->cfg->host_ttl = atoi($2);
717238106Sdes		free($2);
718238106Sdes	}
719238106Sdes	;
720238106Sdesserver_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG
721238106Sdes	{
722238106Sdes		OUTYY(("P(server_infra_lame_ttl:%s)\n", $2));
723238106Sdes		verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option "
724238106Sdes			"removed, use infra-host-ttl)", $2);
725238106Sdes		free($2);
726238106Sdes	}
727238106Sdes	;
728238106Sdesserver_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG
729238106Sdes	{
730238106Sdes		OUTYY(("P(server_infra_cache_numhosts:%s)\n", $2));
731238106Sdes		if(atoi($2) == 0)
732238106Sdes			yyerror("number expected");
733238106Sdes		else cfg_parser->cfg->infra_cache_numhosts = atoi($2);
734238106Sdes		free($2);
735238106Sdes	}
736238106Sdes	;
737238106Sdesserver_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG
738238106Sdes	{
739238106Sdes		OUTYY(("P(server_infra_cache_lame_size:%s)\n", $2));
740238106Sdes		verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s "
741238106Sdes			"(option removed, use infra-cache-numhosts)", $2);
742238106Sdes		free($2);
743238106Sdes	}
744238106Sdes	;
745238106Sdesserver_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG
746238106Sdes	{
747238106Sdes		OUTYY(("P(server_infra_cache_slabs:%s)\n", $2));
748238106Sdes		if(atoi($2) == 0)
749238106Sdes			yyerror("number expected");
750238106Sdes		else {
751238106Sdes			cfg_parser->cfg->infra_cache_slabs = atoi($2);
752238106Sdes			if(!is_pow2(cfg_parser->cfg->infra_cache_slabs))
753238106Sdes				yyerror("must be a power of 2");
754238106Sdes		}
755238106Sdes		free($2);
756238106Sdes	}
757238106Sdes	;
758238106Sdesserver_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG
759238106Sdes	{
760238106Sdes		OUTYY(("P(server_target_fetch_policy:%s)\n", $2));
761238106Sdes		free(cfg_parser->cfg->target_fetch_policy);
762238106Sdes		cfg_parser->cfg->target_fetch_policy = $2;
763238106Sdes	}
764238106Sdes	;
765238106Sdesserver_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG
766238106Sdes	{
767238106Sdes		OUTYY(("P(server_harden_short_bufsize:%s)\n", $2));
768238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
769238106Sdes			yyerror("expected yes or no.");
770238106Sdes		else cfg_parser->cfg->harden_short_bufsize =
771238106Sdes			(strcmp($2, "yes")==0);
772238106Sdes		free($2);
773238106Sdes	}
774238106Sdes	;
775238106Sdesserver_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG
776238106Sdes	{
777238106Sdes		OUTYY(("P(server_harden_large_queries:%s)\n", $2));
778238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
779238106Sdes			yyerror("expected yes or no.");
780238106Sdes		else cfg_parser->cfg->harden_large_queries =
781238106Sdes			(strcmp($2, "yes")==0);
782238106Sdes		free($2);
783238106Sdes	}
784238106Sdes	;
785238106Sdesserver_harden_glue: VAR_HARDEN_GLUE STRING_ARG
786238106Sdes	{
787238106Sdes		OUTYY(("P(server_harden_glue:%s)\n", $2));
788238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
789238106Sdes			yyerror("expected yes or no.");
790238106Sdes		else cfg_parser->cfg->harden_glue =
791238106Sdes			(strcmp($2, "yes")==0);
792238106Sdes		free($2);
793238106Sdes	}
794238106Sdes	;
795238106Sdesserver_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG
796238106Sdes	{
797238106Sdes		OUTYY(("P(server_harden_dnssec_stripped:%s)\n", $2));
798238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
799238106Sdes			yyerror("expected yes or no.");
800238106Sdes		else cfg_parser->cfg->harden_dnssec_stripped =
801238106Sdes			(strcmp($2, "yes")==0);
802238106Sdes		free($2);
803238106Sdes	}
804238106Sdes	;
805238106Sdesserver_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG
806238106Sdes	{
807238106Sdes		OUTYY(("P(server_harden_below_nxdomain:%s)\n", $2));
808238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
809238106Sdes			yyerror("expected yes or no.");
810238106Sdes		else cfg_parser->cfg->harden_below_nxdomain =
811238106Sdes			(strcmp($2, "yes")==0);
812238106Sdes		free($2);
813238106Sdes	}
814238106Sdes	;
815238106Sdesserver_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG
816238106Sdes	{
817238106Sdes		OUTYY(("P(server_harden_referral_path:%s)\n", $2));
818238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
819238106Sdes			yyerror("expected yes or no.");
820238106Sdes		else cfg_parser->cfg->harden_referral_path =
821238106Sdes			(strcmp($2, "yes")==0);
822238106Sdes		free($2);
823238106Sdes	}
824238106Sdes	;
825238106Sdesserver_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG
826238106Sdes	{
827238106Sdes		OUTYY(("P(server_use_caps_for_id:%s)\n", $2));
828238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
829238106Sdes			yyerror("expected yes or no.");
830238106Sdes		else cfg_parser->cfg->use_caps_bits_for_id =
831238106Sdes			(strcmp($2, "yes")==0);
832238106Sdes		free($2);
833238106Sdes	}
834238106Sdes	;
835238106Sdesserver_private_address: VAR_PRIVATE_ADDRESS STRING_ARG
836238106Sdes	{
837238106Sdes		OUTYY(("P(server_private_address:%s)\n", $2));
838238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, $2))
839238106Sdes			yyerror("out of memory");
840238106Sdes	}
841238106Sdes	;
842238106Sdesserver_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG
843238106Sdes	{
844238106Sdes		OUTYY(("P(server_private_domain:%s)\n", $2));
845238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, $2))
846238106Sdes			yyerror("out of memory");
847238106Sdes	}
848238106Sdes	;
849238106Sdesserver_prefetch: VAR_PREFETCH STRING_ARG
850238106Sdes	{
851238106Sdes		OUTYY(("P(server_prefetch:%s)\n", $2));
852238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
853238106Sdes			yyerror("expected yes or no.");
854238106Sdes		else cfg_parser->cfg->prefetch = (strcmp($2, "yes")==0);
855238106Sdes		free($2);
856238106Sdes	}
857238106Sdes	;
858238106Sdesserver_prefetch_key: VAR_PREFETCH_KEY STRING_ARG
859238106Sdes	{
860238106Sdes		OUTYY(("P(server_prefetch_key:%s)\n", $2));
861238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
862238106Sdes			yyerror("expected yes or no.");
863238106Sdes		else cfg_parser->cfg->prefetch_key = (strcmp($2, "yes")==0);
864238106Sdes		free($2);
865238106Sdes	}
866238106Sdes	;
867238106Sdesserver_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG
868238106Sdes	{
869238106Sdes		OUTYY(("P(server_unwanted_reply_threshold:%s)\n", $2));
870238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
871238106Sdes			yyerror("number expected");
872238106Sdes		else cfg_parser->cfg->unwanted_threshold = atoi($2);
873238106Sdes		free($2);
874238106Sdes	}
875238106Sdes	;
876238106Sdesserver_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG
877238106Sdes	{
878238106Sdes		OUTYY(("P(server_do_not_query_address:%s)\n", $2));
879238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, $2))
880238106Sdes			yyerror("out of memory");
881238106Sdes	}
882238106Sdes	;
883238106Sdesserver_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG
884238106Sdes	{
885238106Sdes		OUTYY(("P(server_do_not_query_localhost:%s)\n", $2));
886238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
887238106Sdes			yyerror("expected yes or no.");
888238106Sdes		else cfg_parser->cfg->donotquery_localhost =
889238106Sdes			(strcmp($2, "yes")==0);
890238106Sdes		free($2);
891238106Sdes	}
892238106Sdes	;
893238106Sdesserver_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG
894238106Sdes	{
895238106Sdes		OUTYY(("P(server_access_control:%s %s)\n", $2, $3));
896238106Sdes		if(strcmp($3, "deny")!=0 && strcmp($3, "refuse")!=0 &&
897269257Sdes			strcmp($3, "deny_non_local")!=0 &&
898269257Sdes			strcmp($3, "refuse_non_local")!=0 &&
899238106Sdes			strcmp($3, "allow")!=0 &&
900238106Sdes			strcmp($3, "allow_snoop")!=0) {
901269257Sdes			yyerror("expected deny, refuse, deny_non_local, "
902269257Sdes				"refuse_non_local, allow or allow_snoop "
903238106Sdes				"in access control action");
904238106Sdes		} else {
905238106Sdes			if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3))
906238106Sdes				fatal_exit("out of memory adding acl");
907238106Sdes		}
908238106Sdes	}
909238106Sdes	;
910238106Sdesserver_module_conf: VAR_MODULE_CONF STRING_ARG
911238106Sdes	{
912238106Sdes		OUTYY(("P(server_module_conf:%s)\n", $2));
913238106Sdes		free(cfg_parser->cfg->module_conf);
914238106Sdes		cfg_parser->cfg->module_conf = $2;
915238106Sdes	}
916238106Sdes	;
917238106Sdesserver_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG
918238106Sdes	{
919238106Sdes		OUTYY(("P(server_val_override_date:%s)\n", $2));
920238106Sdes		if(strlen($2) == 0 || strcmp($2, "0") == 0) {
921238106Sdes			cfg_parser->cfg->val_date_override = 0;
922238106Sdes		} else if(strlen($2) == 14) {
923238106Sdes			cfg_parser->cfg->val_date_override =
924238106Sdes				cfg_convert_timeval($2);
925238106Sdes			if(!cfg_parser->cfg->val_date_override)
926238106Sdes				yyerror("bad date/time specification");
927238106Sdes		} else {
928238106Sdes			if(atoi($2) == 0)
929238106Sdes				yyerror("number expected");
930238106Sdes			cfg_parser->cfg->val_date_override = atoi($2);
931238106Sdes		}
932238106Sdes		free($2);
933238106Sdes	}
934238106Sdes	;
935238106Sdesserver_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG
936238106Sdes	{
937238106Sdes		OUTYY(("P(server_val_sig_skew_min:%s)\n", $2));
938238106Sdes		if(strlen($2) == 0 || strcmp($2, "0") == 0) {
939238106Sdes			cfg_parser->cfg->val_sig_skew_min = 0;
940238106Sdes		} else {
941238106Sdes			cfg_parser->cfg->val_sig_skew_min = atoi($2);
942238106Sdes			if(!cfg_parser->cfg->val_sig_skew_min)
943238106Sdes				yyerror("number expected");
944238106Sdes		}
945238106Sdes		free($2);
946238106Sdes	}
947238106Sdes	;
948238106Sdesserver_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG
949238106Sdes	{
950238106Sdes		OUTYY(("P(server_val_sig_skew_max:%s)\n", $2));
951238106Sdes		if(strlen($2) == 0 || strcmp($2, "0") == 0) {
952238106Sdes			cfg_parser->cfg->val_sig_skew_max = 0;
953238106Sdes		} else {
954238106Sdes			cfg_parser->cfg->val_sig_skew_max = atoi($2);
955238106Sdes			if(!cfg_parser->cfg->val_sig_skew_max)
956238106Sdes				yyerror("number expected");
957238106Sdes		}
958238106Sdes		free($2);
959238106Sdes	}
960238106Sdes	;
961238106Sdesserver_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG
962238106Sdes	{
963238106Sdes		OUTYY(("P(server_cache_max_ttl:%s)\n", $2));
964238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
965238106Sdes			yyerror("number expected");
966238106Sdes		else cfg_parser->cfg->max_ttl = atoi($2);
967238106Sdes		free($2);
968238106Sdes	}
969238106Sdes	;
970238106Sdesserver_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG
971238106Sdes	{
972238106Sdes		OUTYY(("P(server_cache_min_ttl:%s)\n", $2));
973238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
974238106Sdes			yyerror("number expected");
975238106Sdes		else cfg_parser->cfg->min_ttl = atoi($2);
976238106Sdes		free($2);
977238106Sdes	}
978238106Sdes	;
979238106Sdesserver_bogus_ttl: VAR_BOGUS_TTL STRING_ARG
980238106Sdes	{
981238106Sdes		OUTYY(("P(server_bogus_ttl:%s)\n", $2));
982238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
983238106Sdes			yyerror("number expected");
984238106Sdes		else cfg_parser->cfg->bogus_ttl = atoi($2);
985238106Sdes		free($2);
986238106Sdes	}
987238106Sdes	;
988238106Sdesserver_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG
989238106Sdes	{
990238106Sdes		OUTYY(("P(server_val_clean_additional:%s)\n", $2));
991238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
992238106Sdes			yyerror("expected yes or no.");
993238106Sdes		else cfg_parser->cfg->val_clean_additional =
994238106Sdes			(strcmp($2, "yes")==0);
995238106Sdes		free($2);
996238106Sdes	}
997238106Sdes	;
998238106Sdesserver_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG
999238106Sdes	{
1000238106Sdes		OUTYY(("P(server_val_permissive_mode:%s)\n", $2));
1001238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1002238106Sdes			yyerror("expected yes or no.");
1003238106Sdes		else cfg_parser->cfg->val_permissive_mode =
1004238106Sdes			(strcmp($2, "yes")==0);
1005238106Sdes		free($2);
1006238106Sdes	}
1007238106Sdes	;
1008238106Sdesserver_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG
1009238106Sdes	{
1010238106Sdes		OUTYY(("P(server_ignore_cd_flag:%s)\n", $2));
1011238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1012238106Sdes			yyerror("expected yes or no.");
1013238106Sdes		else cfg_parser->cfg->ignore_cd = (strcmp($2, "yes")==0);
1014238106Sdes		free($2);
1015238106Sdes	}
1016238106Sdes	;
1017238106Sdesserver_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG
1018238106Sdes	{
1019238106Sdes		OUTYY(("P(server_val_log_level:%s)\n", $2));
1020238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1021238106Sdes			yyerror("number expected");
1022238106Sdes		else cfg_parser->cfg->val_log_level = atoi($2);
1023238106Sdes		free($2);
1024238106Sdes	}
1025238106Sdes	;
1026238106Sdesserver_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG
1027238106Sdes	{
1028238106Sdes		OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", $2));
1029238106Sdes		free(cfg_parser->cfg->val_nsec3_key_iterations);
1030238106Sdes		cfg_parser->cfg->val_nsec3_key_iterations = $2;
1031238106Sdes	}
1032238106Sdes	;
1033238106Sdesserver_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG
1034238106Sdes	{
1035238106Sdes		OUTYY(("P(server_add_holddown:%s)\n", $2));
1036238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1037238106Sdes			yyerror("number expected");
1038238106Sdes		else cfg_parser->cfg->add_holddown = atoi($2);
1039238106Sdes		free($2);
1040238106Sdes	}
1041238106Sdes	;
1042238106Sdesserver_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG
1043238106Sdes	{
1044238106Sdes		OUTYY(("P(server_del_holddown:%s)\n", $2));
1045238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1046238106Sdes			yyerror("number expected");
1047238106Sdes		else cfg_parser->cfg->del_holddown = atoi($2);
1048238106Sdes		free($2);
1049238106Sdes	}
1050238106Sdes	;
1051238106Sdesserver_keep_missing: VAR_KEEP_MISSING STRING_ARG
1052238106Sdes	{
1053238106Sdes		OUTYY(("P(server_keep_missing:%s)\n", $2));
1054238106Sdes		if(atoi($2) == 0 && strcmp($2, "0") != 0)
1055238106Sdes			yyerror("number expected");
1056238106Sdes		else cfg_parser->cfg->keep_missing = atoi($2);
1057238106Sdes		free($2);
1058238106Sdes	}
1059238106Sdes	;
1060238106Sdesserver_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG
1061238106Sdes	{
1062238106Sdes		OUTYY(("P(server_key_cache_size:%s)\n", $2));
1063238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->key_cache_size))
1064238106Sdes			yyerror("memory size expected");
1065238106Sdes		free($2);
1066238106Sdes	}
1067238106Sdes	;
1068238106Sdesserver_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG
1069238106Sdes	{
1070238106Sdes		OUTYY(("P(server_key_cache_slabs:%s)\n", $2));
1071238106Sdes		if(atoi($2) == 0)
1072238106Sdes			yyerror("number expected");
1073238106Sdes		else {
1074238106Sdes			cfg_parser->cfg->key_cache_slabs = atoi($2);
1075238106Sdes			if(!is_pow2(cfg_parser->cfg->key_cache_slabs))
1076238106Sdes				yyerror("must be a power of 2");
1077238106Sdes		}
1078238106Sdes		free($2);
1079238106Sdes	}
1080238106Sdes	;
1081238106Sdesserver_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG
1082238106Sdes	{
1083238106Sdes		OUTYY(("P(server_neg_cache_size:%s)\n", $2));
1084238106Sdes		if(!cfg_parse_memsize($2, &cfg_parser->cfg->neg_cache_size))
1085238106Sdes			yyerror("memory size expected");
1086238106Sdes		free($2);
1087238106Sdes	}
1088238106Sdes	;
1089238106Sdesserver_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
1090238106Sdes	{
1091238106Sdes		OUTYY(("P(server_local_zone:%s %s)\n", $2, $3));
1092238106Sdes		if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 &&
1093238106Sdes		   strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 &&
1094238106Sdes		   strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0
1095238106Sdes		   && strcmp($3, "typetransparent")!=0)
1096238106Sdes			yyerror("local-zone type: expected static, deny, "
1097238106Sdes				"refuse, redirect, transparent, "
1098238106Sdes				"typetransparent or nodefault");
1099238106Sdes		else if(strcmp($3, "nodefault")==0) {
1100238106Sdes			if(!cfg_strlist_insert(&cfg_parser->cfg->
1101238106Sdes				local_zones_nodefault, $2))
1102238106Sdes				fatal_exit("out of memory adding local-zone");
1103238106Sdes			free($3);
1104238106Sdes		} else {
1105238106Sdes			if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones,
1106238106Sdes				$2, $3))
1107238106Sdes				fatal_exit("out of memory adding local-zone");
1108238106Sdes		}
1109238106Sdes	}
1110238106Sdes	;
1111238106Sdesserver_local_data: VAR_LOCAL_DATA STRING_ARG
1112238106Sdes	{
1113238106Sdes		OUTYY(("P(server_local_data:%s)\n", $2));
1114238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, $2))
1115238106Sdes			fatal_exit("out of memory adding local-data");
1116238106Sdes	}
1117238106Sdes	;
1118238106Sdesserver_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG
1119238106Sdes	{
1120238106Sdes		char* ptr;
1121238106Sdes		OUTYY(("P(server_local_data_ptr:%s)\n", $2));
1122238106Sdes		ptr = cfg_ptr_reverse($2);
1123238106Sdes		free($2);
1124238106Sdes		if(ptr) {
1125238106Sdes			if(!cfg_strlist_insert(&cfg_parser->cfg->
1126238106Sdes				local_data, ptr))
1127238106Sdes				fatal_exit("out of memory adding local-data");
1128238106Sdes		} else {
1129238106Sdes			yyerror("local-data-ptr could not be reversed");
1130238106Sdes		}
1131238106Sdes	}
1132238106Sdes	;
1133238106Sdesserver_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG
1134238106Sdes	{
1135238106Sdes		OUTYY(("P(server_minimal_responses:%s)\n", $2));
1136238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1137238106Sdes			yyerror("expected yes or no.");
1138238106Sdes		else cfg_parser->cfg->minimal_responses =
1139238106Sdes			(strcmp($2, "yes")==0);
1140238106Sdes		free($2);
1141238106Sdes	}
1142238106Sdes	;
1143238106Sdesserver_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG
1144238106Sdes	{
1145238106Sdes		OUTYY(("P(server_rrset_roundrobin:%s)\n", $2));
1146238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1147238106Sdes			yyerror("expected yes or no.");
1148238106Sdes		else cfg_parser->cfg->rrset_roundrobin =
1149238106Sdes			(strcmp($2, "yes")==0);
1150238106Sdes		free($2);
1151238106Sdes	}
1152238106Sdes	;
1153269257Sdesserver_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG
1154269257Sdes	{
1155269257Sdes		OUTYY(("P(server_max_udp_size:%s)\n", $2));
1156269257Sdes		cfg_parser->cfg->max_udp_size = atoi($2);
1157269257Sdes		free($2);
1158269257Sdes	}
1159269257Sdes	;
1160238106Sdesstub_name: VAR_NAME STRING_ARG
1161238106Sdes	{
1162238106Sdes		OUTYY(("P(name:%s)\n", $2));
1163238106Sdes		if(cfg_parser->cfg->stubs->name)
1164238106Sdes			yyerror("stub name override, there must be one name "
1165238106Sdes				"for one stub-zone");
1166238106Sdes		free(cfg_parser->cfg->stubs->name);
1167238106Sdes		cfg_parser->cfg->stubs->name = $2;
1168238106Sdes	}
1169238106Sdes	;
1170238106Sdesstub_host: VAR_STUB_HOST STRING_ARG
1171238106Sdes	{
1172238106Sdes		OUTYY(("P(stub-host:%s)\n", $2));
1173238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, $2))
1174238106Sdes			yyerror("out of memory");
1175238106Sdes	}
1176238106Sdes	;
1177238106Sdesstub_addr: VAR_STUB_ADDR STRING_ARG
1178238106Sdes	{
1179238106Sdes		OUTYY(("P(stub-addr:%s)\n", $2));
1180238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, $2))
1181238106Sdes			yyerror("out of memory");
1182238106Sdes	}
1183238106Sdes	;
1184238106Sdesstub_first: VAR_STUB_FIRST STRING_ARG
1185238106Sdes	{
1186238106Sdes		OUTYY(("P(stub-first:%s)\n", $2));
1187238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1188238106Sdes			yyerror("expected yes or no.");
1189238106Sdes		else cfg_parser->cfg->stubs->isfirst=(strcmp($2, "yes")==0);
1190238106Sdes		free($2);
1191238106Sdes	}
1192238106Sdes	;
1193238106Sdesstub_prime: VAR_STUB_PRIME STRING_ARG
1194238106Sdes	{
1195238106Sdes		OUTYY(("P(stub-prime:%s)\n", $2));
1196238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1197238106Sdes			yyerror("expected yes or no.");
1198238106Sdes		else cfg_parser->cfg->stubs->isprime =
1199238106Sdes			(strcmp($2, "yes")==0);
1200238106Sdes		free($2);
1201238106Sdes	}
1202238106Sdes	;
1203238106Sdesforward_name: VAR_NAME STRING_ARG
1204238106Sdes	{
1205238106Sdes		OUTYY(("P(name:%s)\n", $2));
1206238106Sdes		if(cfg_parser->cfg->forwards->name)
1207238106Sdes			yyerror("forward name override, there must be one "
1208238106Sdes				"name for one forward-zone");
1209238106Sdes		free(cfg_parser->cfg->forwards->name);
1210238106Sdes		cfg_parser->cfg->forwards->name = $2;
1211238106Sdes	}
1212238106Sdes	;
1213238106Sdesforward_host: VAR_FORWARD_HOST STRING_ARG
1214238106Sdes	{
1215238106Sdes		OUTYY(("P(forward-host:%s)\n", $2));
1216238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, $2))
1217238106Sdes			yyerror("out of memory");
1218238106Sdes	}
1219238106Sdes	;
1220238106Sdesforward_addr: VAR_FORWARD_ADDR STRING_ARG
1221238106Sdes	{
1222238106Sdes		OUTYY(("P(forward-addr:%s)\n", $2));
1223238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, $2))
1224238106Sdes			yyerror("out of memory");
1225238106Sdes	}
1226238106Sdes	;
1227238106Sdesforward_first: VAR_FORWARD_FIRST STRING_ARG
1228238106Sdes	{
1229238106Sdes		OUTYY(("P(forward-first:%s)\n", $2));
1230238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1231238106Sdes			yyerror("expected yes or no.");
1232238106Sdes		else cfg_parser->cfg->forwards->isfirst=(strcmp($2, "yes")==0);
1233238106Sdes		free($2);
1234238106Sdes	}
1235238106Sdes	;
1236238106Sdesrcstart: VAR_REMOTE_CONTROL
1237238106Sdes	{
1238238106Sdes		OUTYY(("\nP(remote-control:)\n"));
1239238106Sdes	}
1240238106Sdes	;
1241238106Sdescontents_rc: contents_rc content_rc
1242238106Sdes	| ;
1243238106Sdescontent_rc: rc_control_enable | rc_control_interface | rc_control_port |
1244238106Sdes	rc_server_key_file | rc_server_cert_file | rc_control_key_file |
1245238106Sdes	rc_control_cert_file
1246238106Sdes	;
1247238106Sdesrc_control_enable: VAR_CONTROL_ENABLE STRING_ARG
1248238106Sdes	{
1249238106Sdes		OUTYY(("P(control_enable:%s)\n", $2));
1250238106Sdes		if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1251238106Sdes			yyerror("expected yes or no.");
1252238106Sdes		else cfg_parser->cfg->remote_control_enable =
1253238106Sdes			(strcmp($2, "yes")==0);
1254238106Sdes		free($2);
1255238106Sdes	}
1256238106Sdes	;
1257238106Sdesrc_control_port: VAR_CONTROL_PORT STRING_ARG
1258238106Sdes	{
1259238106Sdes		OUTYY(("P(control_port:%s)\n", $2));
1260238106Sdes		if(atoi($2) == 0)
1261238106Sdes			yyerror("control port number expected");
1262238106Sdes		else cfg_parser->cfg->control_port = atoi($2);
1263238106Sdes		free($2);
1264238106Sdes	}
1265238106Sdes	;
1266238106Sdesrc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG
1267238106Sdes	{
1268238106Sdes		OUTYY(("P(control_interface:%s)\n", $2));
1269238106Sdes		if(!cfg_strlist_insert(&cfg_parser->cfg->control_ifs, $2))
1270238106Sdes			yyerror("out of memory");
1271238106Sdes	}
1272238106Sdes	;
1273238106Sdesrc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG
1274238106Sdes	{
1275238106Sdes		OUTYY(("P(rc_server_key_file:%s)\n", $2));
1276238106Sdes		free(cfg_parser->cfg->server_key_file);
1277238106Sdes		cfg_parser->cfg->server_key_file = $2;
1278238106Sdes	}
1279238106Sdes	;
1280238106Sdesrc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG
1281238106Sdes	{
1282238106Sdes		OUTYY(("P(rc_server_cert_file:%s)\n", $2));
1283238106Sdes		free(cfg_parser->cfg->server_cert_file);
1284238106Sdes		cfg_parser->cfg->server_cert_file = $2;
1285238106Sdes	}
1286238106Sdes	;
1287238106Sdesrc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG
1288238106Sdes	{
1289238106Sdes		OUTYY(("P(rc_control_key_file:%s)\n", $2));
1290238106Sdes		free(cfg_parser->cfg->control_key_file);
1291238106Sdes		cfg_parser->cfg->control_key_file = $2;
1292238106Sdes	}
1293238106Sdes	;
1294238106Sdesrc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG
1295238106Sdes	{
1296238106Sdes		OUTYY(("P(rc_control_cert_file:%s)\n", $2));
1297238106Sdes		free(cfg_parser->cfg->control_cert_file);
1298238106Sdes		cfg_parser->cfg->control_cert_file = $2;
1299238106Sdes	}
1300238106Sdes	;
1301238106Sdespythonstart: VAR_PYTHON
1302238106Sdes	{
1303238106Sdes		OUTYY(("\nP(python:)\n"));
1304238106Sdes	}
1305238106Sdes	;
1306238106Sdescontents_py: contents_py content_py
1307238106Sdes	| ;
1308238106Sdescontent_py: py_script
1309238106Sdes	;
1310238106Sdespy_script: VAR_PYTHON_SCRIPT STRING_ARG
1311238106Sdes	{
1312238106Sdes		OUTYY(("P(python-script:%s)\n", $2));
1313238106Sdes		free(cfg_parser->cfg->python_script);
1314238106Sdes		cfg_parser->cfg->python_script = $2;
1315238106Sdes	}
1316238106Sdes%%
1317238106Sdes
1318238106Sdes/* parse helper routines could be here */
1319