]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/unbound/util/configparser.y
MFV illumos
[FreeBSD/FreeBSD.git] / contrib / unbound / util / configparser.y
1 /*
2  * configparser.y -- yacc grammar for unbound configuration files
3  *
4  * Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
5  *
6  * Copyright (c) 2007, NLnet Labs. All rights reserved.
7  * 
8  * This software is open source.
9  * 
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 
14  * Redistributions of source code must retain the above copyright notice,
15  * this list of conditions and the following disclaimer.
16  * 
17  * Redistributions in binary form must reproduce the above copyright notice,
18  * this list of conditions and the following disclaimer in the documentation
19  * and/or other materials provided with the distribution.
20  * 
21  * Neither the name of the NLNET LABS nor the names of its contributors may
22  * be used to endorse or promote products derived from this software without
23  * specific prior written permission.
24  * 
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
31  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  */
37
38 %{
39 #include "config.h"
40
41 #include <stdarg.h>
42 #include <stdio.h>
43 #include <string.h>
44 #include <stdlib.h>
45 #include <assert.h>
46
47 #include "util/configyyrename.h"
48 #include "util/config_file.h"
49 #include "util/net_help.h"
50
51 int ub_c_lex(void);
52 void ub_c_error(const char *message);
53
54 /* these need to be global, otherwise they cannot be used inside yacc */
55 extern struct config_parser_state* cfg_parser;
56
57 #if 0
58 #define OUTYY(s)  printf s /* used ONLY when debugging */
59 #else
60 #define OUTYY(s)
61 #endif
62
63 %}
64 %union {
65         char*   str;
66 };
67
68 %token SPACE LETTER NEWLINE COMMENT COLON ANY ZONESTR
69 %token <str> STRING_ARG
70 %token VAR_SERVER VAR_VERBOSITY VAR_NUM_THREADS VAR_PORT
71 %token VAR_OUTGOING_RANGE VAR_INTERFACE
72 %token VAR_DO_IP4 VAR_DO_IP6 VAR_DO_UDP VAR_DO_TCP 
73 %token VAR_CHROOT VAR_USERNAME VAR_DIRECTORY VAR_LOGFILE VAR_PIDFILE
74 %token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS VAR_NUM_QUERIES_PER_THREAD
75 %token VAR_RRSET_CACHE_SIZE VAR_RRSET_CACHE_SLABS VAR_OUTGOING_NUM_TCP
76 %token VAR_INFRA_HOST_TTL VAR_INFRA_LAME_TTL VAR_INFRA_CACHE_SLABS
77 %token VAR_INFRA_CACHE_NUMHOSTS VAR_INFRA_CACHE_LAME_SIZE VAR_NAME
78 %token VAR_STUB_ZONE VAR_STUB_HOST VAR_STUB_ADDR VAR_TARGET_FETCH_POLICY
79 %token VAR_HARDEN_SHORT_BUFSIZE VAR_HARDEN_LARGE_QUERIES
80 %token VAR_FORWARD_ZONE VAR_FORWARD_HOST VAR_FORWARD_ADDR
81 %token VAR_DO_NOT_QUERY_ADDRESS VAR_HIDE_IDENTITY VAR_HIDE_VERSION
82 %token VAR_IDENTITY VAR_VERSION VAR_HARDEN_GLUE VAR_MODULE_CONF
83 %token VAR_TRUST_ANCHOR_FILE VAR_TRUST_ANCHOR VAR_VAL_OVERRIDE_DATE
84 %token VAR_BOGUS_TTL VAR_VAL_CLEAN_ADDITIONAL VAR_VAL_PERMISSIVE_MODE
85 %token VAR_INCOMING_NUM_TCP VAR_MSG_BUFFER_SIZE VAR_KEY_CACHE_SIZE
86 %token VAR_KEY_CACHE_SLABS VAR_TRUSTED_KEYS_FILE 
87 %token VAR_VAL_NSEC3_KEYSIZE_ITERATIONS VAR_USE_SYSLOG 
88 %token VAR_OUTGOING_INTERFACE VAR_ROOT_HINTS VAR_DO_NOT_QUERY_LOCALHOST
89 %token VAR_CACHE_MAX_TTL VAR_HARDEN_DNSSEC_STRIPPED VAR_ACCESS_CONTROL
90 %token VAR_LOCAL_ZONE VAR_LOCAL_DATA VAR_INTERFACE_AUTOMATIC
91 %token VAR_STATISTICS_INTERVAL VAR_DO_DAEMONIZE VAR_USE_CAPS_FOR_ID
92 %token VAR_STATISTICS_CUMULATIVE VAR_OUTGOING_PORT_PERMIT 
93 %token VAR_OUTGOING_PORT_AVOID VAR_DLV_ANCHOR_FILE VAR_DLV_ANCHOR
94 %token VAR_NEG_CACHE_SIZE VAR_HARDEN_REFERRAL_PATH VAR_PRIVATE_ADDRESS
95 %token VAR_PRIVATE_DOMAIN VAR_REMOTE_CONTROL VAR_CONTROL_ENABLE
96 %token VAR_CONTROL_INTERFACE VAR_CONTROL_PORT VAR_SERVER_KEY_FILE
97 %token VAR_SERVER_CERT_FILE VAR_CONTROL_KEY_FILE VAR_CONTROL_CERT_FILE
98 %token VAR_EXTENDED_STATISTICS VAR_LOCAL_DATA_PTR VAR_JOSTLE_TIMEOUT
99 %token VAR_STUB_PRIME VAR_UNWANTED_REPLY_THRESHOLD VAR_LOG_TIME_ASCII
100 %token VAR_DOMAIN_INSECURE VAR_PYTHON VAR_PYTHON_SCRIPT VAR_VAL_SIG_SKEW_MIN
101 %token VAR_VAL_SIG_SKEW_MAX VAR_CACHE_MIN_TTL VAR_VAL_LOG_LEVEL
102 %token VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING VAR_ADD_HOLDDOWN 
103 %token VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE VAR_PREFETCH
104 %token VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT VAR_HARDEN_BELOW_NXDOMAIN
105 %token VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES VAR_TCP_UPSTREAM VAR_SSL_UPSTREAM
106 %token VAR_SSL_SERVICE_KEY VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST
107 %token VAR_STUB_FIRST VAR_MINIMAL_RESPONSES VAR_RRSET_ROUNDROBIN
108 %token VAR_MAX_UDP_SIZE VAR_DELAY_CLOSE
109
110 %%
111 toplevelvars: /* empty */ | toplevelvars toplevelvar ;
112 toplevelvar: serverstart contents_server | stubstart contents_stub |
113         forwardstart contents_forward | pythonstart contents_py | 
114         rcstart contents_rc
115         ;
116
117 /* server: declaration */
118 serverstart: VAR_SERVER
119         { 
120                 OUTYY(("\nP(server:)\n")); 
121         }
122         ;
123 contents_server: contents_server content_server 
124         | ;
125 content_server: server_num_threads | server_verbosity | server_port |
126         server_outgoing_range | server_do_ip4 |
127         server_do_ip6 | server_do_udp | server_do_tcp | 
128         server_interface | server_chroot | server_username | 
129         server_directory | server_logfile | server_pidfile |
130         server_msg_cache_size | server_msg_cache_slabs |
131         server_num_queries_per_thread | server_rrset_cache_size | 
132         server_rrset_cache_slabs | server_outgoing_num_tcp | 
133         server_infra_host_ttl | server_infra_lame_ttl | 
134         server_infra_cache_slabs | server_infra_cache_numhosts |
135         server_infra_cache_lame_size | server_target_fetch_policy | 
136         server_harden_short_bufsize | server_harden_large_queries |
137         server_do_not_query_address | server_hide_identity |
138         server_hide_version | server_identity | server_version |
139         server_harden_glue | server_module_conf | server_trust_anchor_file |
140         server_trust_anchor | server_val_override_date | server_bogus_ttl |
141         server_val_clean_additional | server_val_permissive_mode |
142         server_incoming_num_tcp | server_msg_buffer_size | 
143         server_key_cache_size | server_key_cache_slabs | 
144         server_trusted_keys_file | server_val_nsec3_keysize_iterations |
145         server_use_syslog | server_outgoing_interface | server_root_hints |
146         server_do_not_query_localhost | server_cache_max_ttl |
147         server_harden_dnssec_stripped | server_access_control |
148         server_local_zone | server_local_data | server_interface_automatic |
149         server_statistics_interval | server_do_daemonize | 
150         server_use_caps_for_id | server_statistics_cumulative |
151         server_outgoing_port_permit | server_outgoing_port_avoid |
152         server_dlv_anchor_file | server_dlv_anchor | server_neg_cache_size |
153         server_harden_referral_path | server_private_address |
154         server_private_domain | server_extended_statistics | 
155         server_local_data_ptr | server_jostle_timeout | 
156         server_unwanted_reply_threshold | server_log_time_ascii | 
157         server_domain_insecure | server_val_sig_skew_min | 
158         server_val_sig_skew_max | server_cache_min_ttl | server_val_log_level |
159         server_auto_trust_anchor_file | server_add_holddown | 
160         server_del_holddown | server_keep_missing | server_so_rcvbuf |
161         server_edns_buffer_size | server_prefetch | server_prefetch_key |
162         server_so_sndbuf | server_harden_below_nxdomain | server_ignore_cd_flag |
163         server_log_queries | server_tcp_upstream | server_ssl_upstream |
164         server_ssl_service_key | server_ssl_service_pem | server_ssl_port |
165         server_minimal_responses | server_rrset_roundrobin | server_max_udp_size |
166     server_so_reuseport | server_delay_close
167         ;
168 stubstart: VAR_STUB_ZONE
169         {
170                 struct config_stub* s;
171                 OUTYY(("\nP(stub_zone:)\n")); 
172                 s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
173                 if(s) {
174                         s->next = cfg_parser->cfg->stubs;
175                         cfg_parser->cfg->stubs = s;
176                 } else 
177                         yyerror("out of memory");
178         }
179         ;
180 contents_stub: contents_stub content_stub 
181         | ;
182 content_stub: stub_name | stub_host | stub_addr | stub_prime | stub_first
183         ;
184 forwardstart: VAR_FORWARD_ZONE
185         {
186                 struct config_stub* s;
187                 OUTYY(("\nP(forward_zone:)\n")); 
188                 s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
189                 if(s) {
190                         s->next = cfg_parser->cfg->forwards;
191                         cfg_parser->cfg->forwards = s;
192                 } else 
193                         yyerror("out of memory");
194         }
195         ;
196 contents_forward: contents_forward content_forward 
197         | ;
198 content_forward: forward_name | forward_host | forward_addr | forward_first
199         ;
200 server_num_threads: VAR_NUM_THREADS STRING_ARG 
201         { 
202                 OUTYY(("P(server_num_threads:%s)\n", $2)); 
203                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
204                         yyerror("number expected");
205                 else cfg_parser->cfg->num_threads = atoi($2);
206                 free($2);
207         }
208         ;
209 server_verbosity: VAR_VERBOSITY STRING_ARG 
210         { 
211                 OUTYY(("P(server_verbosity:%s)\n", $2)); 
212                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
213                         yyerror("number expected");
214                 else cfg_parser->cfg->verbosity = atoi($2);
215                 free($2);
216         }
217         ;
218 server_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG 
219         { 
220                 OUTYY(("P(server_statistics_interval:%s)\n", $2)); 
221                 if(strcmp($2, "") == 0 || strcmp($2, "0") == 0)
222                         cfg_parser->cfg->stat_interval = 0;
223                 else if(atoi($2) == 0)
224                         yyerror("number expected");
225                 else cfg_parser->cfg->stat_interval = atoi($2);
226                 free($2);
227         }
228         ;
229 server_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG
230         {
231                 OUTYY(("P(server_statistics_cumulative:%s)\n", $2));
232                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
233                         yyerror("expected yes or no.");
234                 else cfg_parser->cfg->stat_cumulative = (strcmp($2, "yes")==0);
235                 free($2);
236         }
237         ;
238 server_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG
239         {
240                 OUTYY(("P(server_extended_statistics:%s)\n", $2));
241                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
242                         yyerror("expected yes or no.");
243                 else cfg_parser->cfg->stat_extended = (strcmp($2, "yes")==0);
244                 free($2);
245         }
246         ;
247 server_port: VAR_PORT STRING_ARG
248         {
249                 OUTYY(("P(server_port:%s)\n", $2));
250                 if(atoi($2) == 0)
251                         yyerror("port number expected");
252                 else cfg_parser->cfg->port = atoi($2);
253                 free($2);
254         }
255         ;
256 server_interface: VAR_INTERFACE STRING_ARG
257         {
258                 OUTYY(("P(server_interface:%s)\n", $2));
259                 if(cfg_parser->cfg->num_ifs == 0)
260                         cfg_parser->cfg->ifs = calloc(1, sizeof(char*));
261                 else    cfg_parser->cfg->ifs = realloc(cfg_parser->cfg->ifs,
262                                 (cfg_parser->cfg->num_ifs+1)*sizeof(char*));
263                 if(!cfg_parser->cfg->ifs)
264                         yyerror("out of memory");
265                 else
266                         cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = $2;
267         }
268         ;
269 server_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG
270         {
271                 OUTYY(("P(server_outgoing_interface:%s)\n", $2));
272                 if(cfg_parser->cfg->num_out_ifs == 0)
273                         cfg_parser->cfg->out_ifs = calloc(1, sizeof(char*));
274                 else    cfg_parser->cfg->out_ifs = realloc(
275                         cfg_parser->cfg->out_ifs, 
276                         (cfg_parser->cfg->num_out_ifs+1)*sizeof(char*));
277                 if(!cfg_parser->cfg->out_ifs)
278                         yyerror("out of memory");
279                 else
280                         cfg_parser->cfg->out_ifs[
281                                 cfg_parser->cfg->num_out_ifs++] = $2;
282         }
283         ;
284 server_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG
285         {
286                 OUTYY(("P(server_outgoing_range:%s)\n", $2));
287                 if(atoi($2) == 0)
288                         yyerror("number expected");
289                 else cfg_parser->cfg->outgoing_num_ports = atoi($2);
290                 free($2);
291         }
292         ;
293 server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG
294         {
295                 OUTYY(("P(server_outgoing_port_permit:%s)\n", $2));
296                 if(!cfg_mark_ports($2, 1, 
297                         cfg_parser->cfg->outgoing_avail_ports, 65536))
298                         yyerror("port number or range (\"low-high\") expected");
299                 free($2);
300         }
301         ;
302 server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG
303         {
304                 OUTYY(("P(server_outgoing_port_avoid:%s)\n", $2));
305                 if(!cfg_mark_ports($2, 0, 
306                         cfg_parser->cfg->outgoing_avail_ports, 65536))
307                         yyerror("port number or range (\"low-high\") expected");
308                 free($2);
309         }
310         ;
311 server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG
312         {
313                 OUTYY(("P(server_outgoing_num_tcp:%s)\n", $2));
314                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
315                         yyerror("number expected");
316                 else cfg_parser->cfg->outgoing_num_tcp = atoi($2);
317                 free($2);
318         }
319         ;
320 server_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG
321         {
322                 OUTYY(("P(server_incoming_num_tcp:%s)\n", $2));
323                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
324                         yyerror("number expected");
325                 else cfg_parser->cfg->incoming_num_tcp = atoi($2);
326                 free($2);
327         }
328         ;
329 server_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG
330         {
331                 OUTYY(("P(server_interface_automatic:%s)\n", $2));
332                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
333                         yyerror("expected yes or no.");
334                 else cfg_parser->cfg->if_automatic = (strcmp($2, "yes")==0);
335                 free($2);
336         }
337         ;
338 server_do_ip4: VAR_DO_IP4 STRING_ARG
339         {
340                 OUTYY(("P(server_do_ip4:%s)\n", $2));
341                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
342                         yyerror("expected yes or no.");
343                 else cfg_parser->cfg->do_ip4 = (strcmp($2, "yes")==0);
344                 free($2);
345         }
346         ;
347 server_do_ip6: VAR_DO_IP6 STRING_ARG
348         {
349                 OUTYY(("P(server_do_ip6:%s)\n", $2));
350                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
351                         yyerror("expected yes or no.");
352                 else cfg_parser->cfg->do_ip6 = (strcmp($2, "yes")==0);
353                 free($2);
354         }
355         ;
356 server_do_udp: VAR_DO_UDP STRING_ARG
357         {
358                 OUTYY(("P(server_do_udp:%s)\n", $2));
359                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
360                         yyerror("expected yes or no.");
361                 else cfg_parser->cfg->do_udp = (strcmp($2, "yes")==0);
362                 free($2);
363         }
364         ;
365 server_do_tcp: VAR_DO_TCP STRING_ARG
366         {
367                 OUTYY(("P(server_do_tcp:%s)\n", $2));
368                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
369                         yyerror("expected yes or no.");
370                 else cfg_parser->cfg->do_tcp = (strcmp($2, "yes")==0);
371                 free($2);
372         }
373         ;
374 server_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG
375         {
376                 OUTYY(("P(server_tcp_upstream:%s)\n", $2));
377                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
378                         yyerror("expected yes or no.");
379                 else cfg_parser->cfg->tcp_upstream = (strcmp($2, "yes")==0);
380                 free($2);
381         }
382         ;
383 server_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG
384         {
385                 OUTYY(("P(server_ssl_upstream:%s)\n", $2));
386                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
387                         yyerror("expected yes or no.");
388                 else cfg_parser->cfg->ssl_upstream = (strcmp($2, "yes")==0);
389                 free($2);
390         }
391         ;
392 server_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG
393         {
394                 OUTYY(("P(server_ssl_service_key:%s)\n", $2));
395                 free(cfg_parser->cfg->ssl_service_key);
396                 cfg_parser->cfg->ssl_service_key = $2;
397         }
398         ;
399 server_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG
400         {
401                 OUTYY(("P(server_ssl_service_pem:%s)\n", $2));
402                 free(cfg_parser->cfg->ssl_service_pem);
403                 cfg_parser->cfg->ssl_service_pem = $2;
404         }
405         ;
406 server_ssl_port: VAR_SSL_PORT STRING_ARG
407         {
408                 OUTYY(("P(server_ssl_port:%s)\n", $2));
409                 if(atoi($2) == 0)
410                         yyerror("port number expected");
411                 else cfg_parser->cfg->ssl_port = atoi($2);
412                 free($2);
413         }
414         ;
415 server_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG
416         {
417                 OUTYY(("P(server_do_daemonize:%s)\n", $2));
418                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
419                         yyerror("expected yes or no.");
420                 else cfg_parser->cfg->do_daemonize = (strcmp($2, "yes")==0);
421                 free($2);
422         }
423         ;
424 server_use_syslog: VAR_USE_SYSLOG STRING_ARG
425         {
426                 OUTYY(("P(server_use_syslog:%s)\n", $2));
427                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
428                         yyerror("expected yes or no.");
429                 else cfg_parser->cfg->use_syslog = (strcmp($2, "yes")==0);
430 #if !defined(HAVE_SYSLOG_H) && !defined(UB_ON_WINDOWS)
431                 if(strcmp($2, "yes") == 0)
432                         yyerror("no syslog services are available. "
433                                 "(reconfigure and compile to add)");
434 #endif
435                 free($2);
436         }
437         ;
438 server_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG
439         {
440                 OUTYY(("P(server_log_time_ascii:%s)\n", $2));
441                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
442                         yyerror("expected yes or no.");
443                 else cfg_parser->cfg->log_time_ascii = (strcmp($2, "yes")==0);
444                 free($2);
445         }
446         ;
447 server_log_queries: VAR_LOG_QUERIES STRING_ARG
448         {
449                 OUTYY(("P(server_log_queries:%s)\n", $2));
450                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
451                         yyerror("expected yes or no.");
452                 else cfg_parser->cfg->log_queries = (strcmp($2, "yes")==0);
453                 free($2);
454         }
455         ;
456 server_chroot: VAR_CHROOT STRING_ARG
457         {
458                 OUTYY(("P(server_chroot:%s)\n", $2));
459                 free(cfg_parser->cfg->chrootdir);
460                 cfg_parser->cfg->chrootdir = $2;
461         }
462         ;
463 server_username: VAR_USERNAME STRING_ARG
464         {
465                 OUTYY(("P(server_username:%s)\n", $2));
466                 free(cfg_parser->cfg->username);
467                 cfg_parser->cfg->username = $2;
468         }
469         ;
470 server_directory: VAR_DIRECTORY STRING_ARG
471         {
472                 OUTYY(("P(server_directory:%s)\n", $2));
473                 free(cfg_parser->cfg->directory);
474                 cfg_parser->cfg->directory = $2;
475         }
476         ;
477 server_logfile: VAR_LOGFILE STRING_ARG
478         {
479                 OUTYY(("P(server_logfile:%s)\n", $2));
480                 free(cfg_parser->cfg->logfile);
481                 cfg_parser->cfg->logfile = $2;
482                 cfg_parser->cfg->use_syslog = 0;
483         }
484         ;
485 server_pidfile: VAR_PIDFILE STRING_ARG
486         {
487                 OUTYY(("P(server_pidfile:%s)\n", $2));
488                 free(cfg_parser->cfg->pidfile);
489                 cfg_parser->cfg->pidfile = $2;
490         }
491         ;
492 server_root_hints: VAR_ROOT_HINTS STRING_ARG
493         {
494                 OUTYY(("P(server_root_hints:%s)\n", $2));
495                 if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, $2))
496                         yyerror("out of memory");
497         }
498         ;
499 server_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG
500         {
501                 OUTYY(("P(server_dlv_anchor_file:%s)\n", $2));
502                 free(cfg_parser->cfg->dlv_anchor_file);
503                 cfg_parser->cfg->dlv_anchor_file = $2;
504         }
505         ;
506 server_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG
507         {
508                 OUTYY(("P(server_dlv_anchor:%s)\n", $2));
509                 if(!cfg_strlist_insert(&cfg_parser->cfg->dlv_anchor_list, $2))
510                         yyerror("out of memory");
511         }
512         ;
513 server_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG
514         {
515                 OUTYY(("P(server_auto_trust_anchor_file:%s)\n", $2));
516                 if(!cfg_strlist_insert(&cfg_parser->cfg->
517                         auto_trust_anchor_file_list, $2))
518                         yyerror("out of memory");
519         }
520         ;
521 server_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG
522         {
523                 OUTYY(("P(server_trust_anchor_file:%s)\n", $2));
524                 if(!cfg_strlist_insert(&cfg_parser->cfg->
525                         trust_anchor_file_list, $2))
526                         yyerror("out of memory");
527         }
528         ;
529 server_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG
530         {
531                 OUTYY(("P(server_trusted_keys_file:%s)\n", $2));
532                 if(!cfg_strlist_insert(&cfg_parser->cfg->
533                         trusted_keys_file_list, $2))
534                         yyerror("out of memory");
535         }
536         ;
537 server_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG
538         {
539                 OUTYY(("P(server_trust_anchor:%s)\n", $2));
540                 if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, $2))
541                         yyerror("out of memory");
542         }
543         ;
544 server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG
545         {
546                 OUTYY(("P(server_domain_insecure:%s)\n", $2));
547                 if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, $2))
548                         yyerror("out of memory");
549         }
550         ;
551 server_hide_identity: VAR_HIDE_IDENTITY STRING_ARG
552         {
553                 OUTYY(("P(server_hide_identity:%s)\n", $2));
554                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
555                         yyerror("expected yes or no.");
556                 else cfg_parser->cfg->hide_identity = (strcmp($2, "yes")==0);
557                 free($2);
558         }
559         ;
560 server_hide_version: VAR_HIDE_VERSION STRING_ARG
561         {
562                 OUTYY(("P(server_hide_version:%s)\n", $2));
563                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
564                         yyerror("expected yes or no.");
565                 else cfg_parser->cfg->hide_version = (strcmp($2, "yes")==0);
566                 free($2);
567         }
568         ;
569 server_identity: VAR_IDENTITY STRING_ARG
570         {
571                 OUTYY(("P(server_identity:%s)\n", $2));
572                 free(cfg_parser->cfg->identity);
573                 cfg_parser->cfg->identity = $2;
574         }
575         ;
576 server_version: VAR_VERSION STRING_ARG
577         {
578                 OUTYY(("P(server_version:%s)\n", $2));
579                 free(cfg_parser->cfg->version);
580                 cfg_parser->cfg->version = $2;
581         }
582         ;
583 server_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG
584         {
585                 OUTYY(("P(server_so_rcvbuf:%s)\n", $2));
586                 if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_rcvbuf))
587                         yyerror("buffer size expected");
588                 free($2);
589         }
590         ;
591 server_so_sndbuf: VAR_SO_SNDBUF STRING_ARG
592         {
593                 OUTYY(("P(server_so_sndbuf:%s)\n", $2));
594                 if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_sndbuf))
595                         yyerror("buffer size expected");
596                 free($2);
597         }
598         ;
599 server_so_reuseport: VAR_SO_REUSEPORT STRING_ARG
600     {
601         OUTYY(("P(server_so_reuseport:%s)\n", $2));
602         if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
603             yyerror("expected yes or no.");
604         else cfg_parser->cfg->so_reuseport =
605             (strcmp($2, "yes")==0);
606         free($2);
607     }
608     ;
609 server_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG
610         {
611                 OUTYY(("P(server_edns_buffer_size:%s)\n", $2));
612                 if(atoi($2) == 0)
613                         yyerror("number expected");
614                 else if (atoi($2) < 12)
615                         yyerror("edns buffer size too small");
616                 else if (atoi($2) > 65535)
617                         cfg_parser->cfg->edns_buffer_size = 65535;
618                 else cfg_parser->cfg->edns_buffer_size = atoi($2);
619                 free($2);
620         }
621         ;
622 server_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG
623         {
624                 OUTYY(("P(server_msg_buffer_size:%s)\n", $2));
625                 if(atoi($2) == 0)
626                         yyerror("number expected");
627                 else if (atoi($2) < 4096)
628                         yyerror("message buffer size too small (use 4096)");
629                 else cfg_parser->cfg->msg_buffer_size = atoi($2);
630                 free($2);
631         }
632         ;
633 server_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG
634         {
635                 OUTYY(("P(server_msg_cache_size:%s)\n", $2));
636                 if(!cfg_parse_memsize($2, &cfg_parser->cfg->msg_cache_size))
637                         yyerror("memory size expected");
638                 free($2);
639         }
640         ;
641 server_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG
642         {
643                 OUTYY(("P(server_msg_cache_slabs:%s)\n", $2));
644                 if(atoi($2) == 0)
645                         yyerror("number expected");
646                 else {
647                         cfg_parser->cfg->msg_cache_slabs = atoi($2);
648                         if(!is_pow2(cfg_parser->cfg->msg_cache_slabs))
649                                 yyerror("must be a power of 2");
650                 }
651                 free($2);
652         }
653         ;
654 server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG
655         {
656                 OUTYY(("P(server_num_queries_per_thread:%s)\n", $2));
657                 if(atoi($2) == 0)
658                         yyerror("number expected");
659                 else cfg_parser->cfg->num_queries_per_thread = atoi($2);
660                 free($2);
661         }
662         ;
663 server_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG
664         {
665                 OUTYY(("P(server_jostle_timeout:%s)\n", $2));
666                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
667                         yyerror("number expected");
668                 else cfg_parser->cfg->jostle_time = atoi($2);
669                 free($2);
670         }
671         ;
672 server_delay_close: VAR_DELAY_CLOSE STRING_ARG
673         {
674                 OUTYY(("P(server_delay_close:%s)\n", $2));
675                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
676                         yyerror("number expected");
677                 else cfg_parser->cfg->delay_close = atoi($2);
678                 free($2);
679         }
680         ;
681 server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG
682         {
683                 OUTYY(("P(server_rrset_cache_size:%s)\n", $2));
684                 if(!cfg_parse_memsize($2, &cfg_parser->cfg->rrset_cache_size))
685                         yyerror("memory size expected");
686                 free($2);
687         }
688         ;
689 server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG
690         {
691                 OUTYY(("P(server_rrset_cache_slabs:%s)\n", $2));
692                 if(atoi($2) == 0)
693                         yyerror("number expected");
694                 else {
695                         cfg_parser->cfg->rrset_cache_slabs = atoi($2);
696                         if(!is_pow2(cfg_parser->cfg->rrset_cache_slabs))
697                                 yyerror("must be a power of 2");
698                 }
699                 free($2);
700         }
701         ;
702 server_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG
703         {
704                 OUTYY(("P(server_infra_host_ttl:%s)\n", $2));
705                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
706                         yyerror("number expected");
707                 else cfg_parser->cfg->host_ttl = atoi($2);
708                 free($2);
709         }
710         ;
711 server_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG
712         {
713                 OUTYY(("P(server_infra_lame_ttl:%s)\n", $2));
714                 verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option "
715                         "removed, use infra-host-ttl)", $2);
716                 free($2);
717         }
718         ;
719 server_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG
720         {
721                 OUTYY(("P(server_infra_cache_numhosts:%s)\n", $2));
722                 if(atoi($2) == 0)
723                         yyerror("number expected");
724                 else cfg_parser->cfg->infra_cache_numhosts = atoi($2);
725                 free($2);
726         }
727         ;
728 server_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG
729         {
730                 OUTYY(("P(server_infra_cache_lame_size:%s)\n", $2));
731                 verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s "
732                         "(option removed, use infra-cache-numhosts)", $2);
733                 free($2);
734         }
735         ;
736 server_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG
737         {
738                 OUTYY(("P(server_infra_cache_slabs:%s)\n", $2));
739                 if(atoi($2) == 0)
740                         yyerror("number expected");
741                 else {
742                         cfg_parser->cfg->infra_cache_slabs = atoi($2);
743                         if(!is_pow2(cfg_parser->cfg->infra_cache_slabs))
744                                 yyerror("must be a power of 2");
745                 }
746                 free($2);
747         }
748         ;
749 server_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG
750         {
751                 OUTYY(("P(server_target_fetch_policy:%s)\n", $2));
752                 free(cfg_parser->cfg->target_fetch_policy);
753                 cfg_parser->cfg->target_fetch_policy = $2;
754         }
755         ;
756 server_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG
757         {
758                 OUTYY(("P(server_harden_short_bufsize:%s)\n", $2));
759                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
760                         yyerror("expected yes or no.");
761                 else cfg_parser->cfg->harden_short_bufsize = 
762                         (strcmp($2, "yes")==0);
763                 free($2);
764         }
765         ;
766 server_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG
767         {
768                 OUTYY(("P(server_harden_large_queries:%s)\n", $2));
769                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
770                         yyerror("expected yes or no.");
771                 else cfg_parser->cfg->harden_large_queries = 
772                         (strcmp($2, "yes")==0);
773                 free($2);
774         }
775         ;
776 server_harden_glue: VAR_HARDEN_GLUE STRING_ARG
777         {
778                 OUTYY(("P(server_harden_glue:%s)\n", $2));
779                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
780                         yyerror("expected yes or no.");
781                 else cfg_parser->cfg->harden_glue = 
782                         (strcmp($2, "yes")==0);
783                 free($2);
784         }
785         ;
786 server_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG
787         {
788                 OUTYY(("P(server_harden_dnssec_stripped:%s)\n", $2));
789                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
790                         yyerror("expected yes or no.");
791                 else cfg_parser->cfg->harden_dnssec_stripped = 
792                         (strcmp($2, "yes")==0);
793                 free($2);
794         }
795         ;
796 server_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG
797         {
798                 OUTYY(("P(server_harden_below_nxdomain:%s)\n", $2));
799                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
800                         yyerror("expected yes or no.");
801                 else cfg_parser->cfg->harden_below_nxdomain = 
802                         (strcmp($2, "yes")==0);
803                 free($2);
804         }
805         ;
806 server_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG
807         {
808                 OUTYY(("P(server_harden_referral_path:%s)\n", $2));
809                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
810                         yyerror("expected yes or no.");
811                 else cfg_parser->cfg->harden_referral_path = 
812                         (strcmp($2, "yes")==0);
813                 free($2);
814         }
815         ;
816 server_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG
817         {
818                 OUTYY(("P(server_use_caps_for_id:%s)\n", $2));
819                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
820                         yyerror("expected yes or no.");
821                 else cfg_parser->cfg->use_caps_bits_for_id = 
822                         (strcmp($2, "yes")==0);
823                 free($2);
824         }
825         ;
826 server_private_address: VAR_PRIVATE_ADDRESS STRING_ARG
827         {
828                 OUTYY(("P(server_private_address:%s)\n", $2));
829                 if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, $2))
830                         yyerror("out of memory");
831         }
832         ;
833 server_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG
834         {
835                 OUTYY(("P(server_private_domain:%s)\n", $2));
836                 if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, $2))
837                         yyerror("out of memory");
838         }
839         ;
840 server_prefetch: VAR_PREFETCH STRING_ARG
841         {
842                 OUTYY(("P(server_prefetch:%s)\n", $2));
843                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
844                         yyerror("expected yes or no.");
845                 else cfg_parser->cfg->prefetch = (strcmp($2, "yes")==0);
846                 free($2);
847         }
848         ;
849 server_prefetch_key: VAR_PREFETCH_KEY STRING_ARG
850         {
851                 OUTYY(("P(server_prefetch_key:%s)\n", $2));
852                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
853                         yyerror("expected yes or no.");
854                 else cfg_parser->cfg->prefetch_key = (strcmp($2, "yes")==0);
855                 free($2);
856         }
857         ;
858 server_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG
859         {
860                 OUTYY(("P(server_unwanted_reply_threshold:%s)\n", $2));
861                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
862                         yyerror("number expected");
863                 else cfg_parser->cfg->unwanted_threshold = atoi($2);
864                 free($2);
865         }
866         ;
867 server_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG
868         {
869                 OUTYY(("P(server_do_not_query_address:%s)\n", $2));
870                 if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, $2))
871                         yyerror("out of memory");
872         }
873         ;
874 server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG
875         {
876                 OUTYY(("P(server_do_not_query_localhost:%s)\n", $2));
877                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
878                         yyerror("expected yes or no.");
879                 else cfg_parser->cfg->donotquery_localhost = 
880                         (strcmp($2, "yes")==0);
881                 free($2);
882         }
883         ;
884 server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG
885         {
886                 OUTYY(("P(server_access_control:%s %s)\n", $2, $3));
887                 if(strcmp($3, "deny")!=0 && strcmp($3, "refuse")!=0 &&
888                         strcmp($3, "deny_non_local")!=0 &&
889                         strcmp($3, "refuse_non_local")!=0 &&
890                         strcmp($3, "allow")!=0 && 
891                         strcmp($3, "allow_snoop")!=0) {
892                         yyerror("expected deny, refuse, deny_non_local, "
893                                 "refuse_non_local, allow or allow_snoop "
894                                 "in access control action");
895                 } else {
896                         if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3))
897                                 fatal_exit("out of memory adding acl");
898                 }
899         }
900         ;
901 server_module_conf: VAR_MODULE_CONF STRING_ARG
902         {
903                 OUTYY(("P(server_module_conf:%s)\n", $2));
904                 free(cfg_parser->cfg->module_conf);
905                 cfg_parser->cfg->module_conf = $2;
906         }
907         ;
908 server_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG
909         {
910                 OUTYY(("P(server_val_override_date:%s)\n", $2));
911                 if(strlen($2) == 0 || strcmp($2, "0") == 0) {
912                         cfg_parser->cfg->val_date_override = 0;
913                 } else if(strlen($2) == 14) {
914                         cfg_parser->cfg->val_date_override = 
915                                 cfg_convert_timeval($2);
916                         if(!cfg_parser->cfg->val_date_override)
917                                 yyerror("bad date/time specification");
918                 } else {
919                         if(atoi($2) == 0)
920                                 yyerror("number expected");
921                         cfg_parser->cfg->val_date_override = atoi($2);
922                 }
923                 free($2);
924         }
925         ;
926 server_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG
927         {
928                 OUTYY(("P(server_val_sig_skew_min:%s)\n", $2));
929                 if(strlen($2) == 0 || strcmp($2, "0") == 0) {
930                         cfg_parser->cfg->val_sig_skew_min = 0;
931                 } else {
932                         cfg_parser->cfg->val_sig_skew_min = atoi($2);
933                         if(!cfg_parser->cfg->val_sig_skew_min)
934                                 yyerror("number expected");
935                 }
936                 free($2);
937         }
938         ;
939 server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG
940         {
941                 OUTYY(("P(server_val_sig_skew_max:%s)\n", $2));
942                 if(strlen($2) == 0 || strcmp($2, "0") == 0) {
943                         cfg_parser->cfg->val_sig_skew_max = 0;
944                 } else {
945                         cfg_parser->cfg->val_sig_skew_max = atoi($2);
946                         if(!cfg_parser->cfg->val_sig_skew_max)
947                                 yyerror("number expected");
948                 }
949                 free($2);
950         }
951         ;
952 server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG
953         {
954                 OUTYY(("P(server_cache_max_ttl:%s)\n", $2));
955                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
956                         yyerror("number expected");
957                 else cfg_parser->cfg->max_ttl = atoi($2);
958                 free($2);
959         }
960         ;
961 server_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG
962         {
963                 OUTYY(("P(server_cache_min_ttl:%s)\n", $2));
964                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
965                         yyerror("number expected");
966                 else cfg_parser->cfg->min_ttl = atoi($2);
967                 free($2);
968         }
969         ;
970 server_bogus_ttl: VAR_BOGUS_TTL STRING_ARG
971         {
972                 OUTYY(("P(server_bogus_ttl:%s)\n", $2));
973                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
974                         yyerror("number expected");
975                 else cfg_parser->cfg->bogus_ttl = atoi($2);
976                 free($2);
977         }
978         ;
979 server_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG
980         {
981                 OUTYY(("P(server_val_clean_additional:%s)\n", $2));
982                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
983                         yyerror("expected yes or no.");
984                 else cfg_parser->cfg->val_clean_additional = 
985                         (strcmp($2, "yes")==0);
986                 free($2);
987         }
988         ;
989 server_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG
990         {
991                 OUTYY(("P(server_val_permissive_mode:%s)\n", $2));
992                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
993                         yyerror("expected yes or no.");
994                 else cfg_parser->cfg->val_permissive_mode = 
995                         (strcmp($2, "yes")==0);
996                 free($2);
997         }
998         ;
999 server_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG
1000         {
1001                 OUTYY(("P(server_ignore_cd_flag:%s)\n", $2));
1002                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1003                         yyerror("expected yes or no.");
1004                 else cfg_parser->cfg->ignore_cd = (strcmp($2, "yes")==0);
1005                 free($2);
1006         }
1007         ;
1008 server_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG
1009         {
1010                 OUTYY(("P(server_val_log_level:%s)\n", $2));
1011                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
1012                         yyerror("number expected");
1013                 else cfg_parser->cfg->val_log_level = atoi($2);
1014                 free($2);
1015         }
1016         ;
1017 server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG
1018         {
1019                 OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", $2));
1020                 free(cfg_parser->cfg->val_nsec3_key_iterations);
1021                 cfg_parser->cfg->val_nsec3_key_iterations = $2;
1022         }
1023         ;
1024 server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG
1025         {
1026                 OUTYY(("P(server_add_holddown:%s)\n", $2));
1027                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
1028                         yyerror("number expected");
1029                 else cfg_parser->cfg->add_holddown = atoi($2);
1030                 free($2);
1031         }
1032         ;
1033 server_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG
1034         {
1035                 OUTYY(("P(server_del_holddown:%s)\n", $2));
1036                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
1037                         yyerror("number expected");
1038                 else cfg_parser->cfg->del_holddown = atoi($2);
1039                 free($2);
1040         }
1041         ;
1042 server_keep_missing: VAR_KEEP_MISSING STRING_ARG
1043         {
1044                 OUTYY(("P(server_keep_missing:%s)\n", $2));
1045                 if(atoi($2) == 0 && strcmp($2, "0") != 0)
1046                         yyerror("number expected");
1047                 else cfg_parser->cfg->keep_missing = atoi($2);
1048                 free($2);
1049         }
1050         ;
1051 server_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG
1052         {
1053                 OUTYY(("P(server_key_cache_size:%s)\n", $2));
1054                 if(!cfg_parse_memsize($2, &cfg_parser->cfg->key_cache_size))
1055                         yyerror("memory size expected");
1056                 free($2);
1057         }
1058         ;
1059 server_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG
1060         {
1061                 OUTYY(("P(server_key_cache_slabs:%s)\n", $2));
1062                 if(atoi($2) == 0)
1063                         yyerror("number expected");
1064                 else {
1065                         cfg_parser->cfg->key_cache_slabs = atoi($2);
1066                         if(!is_pow2(cfg_parser->cfg->key_cache_slabs))
1067                                 yyerror("must be a power of 2");
1068                 }
1069                 free($2);
1070         }
1071         ;
1072 server_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG
1073         {
1074                 OUTYY(("P(server_neg_cache_size:%s)\n", $2));
1075                 if(!cfg_parse_memsize($2, &cfg_parser->cfg->neg_cache_size))
1076                         yyerror("memory size expected");
1077                 free($2);
1078         }
1079         ;
1080 server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
1081         {
1082                 OUTYY(("P(server_local_zone:%s %s)\n", $2, $3));
1083                 if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 &&
1084                    strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 &&
1085                    strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0
1086                    && strcmp($3, "typetransparent")!=0)
1087                         yyerror("local-zone type: expected static, deny, "
1088                                 "refuse, redirect, transparent, "
1089                                 "typetransparent or nodefault");
1090                 else if(strcmp($3, "nodefault")==0) {
1091                         if(!cfg_strlist_insert(&cfg_parser->cfg->
1092                                 local_zones_nodefault, $2))
1093                                 fatal_exit("out of memory adding local-zone");
1094                         free($3);
1095                 } else {
1096                         if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones, 
1097                                 $2, $3))
1098                                 fatal_exit("out of memory adding local-zone");
1099                 }
1100         }
1101         ;
1102 server_local_data: VAR_LOCAL_DATA STRING_ARG
1103         {
1104                 OUTYY(("P(server_local_data:%s)\n", $2));
1105                 if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, $2))
1106                         fatal_exit("out of memory adding local-data");
1107         }
1108         ;
1109 server_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG
1110         {
1111                 char* ptr;
1112                 OUTYY(("P(server_local_data_ptr:%s)\n", $2));
1113                 ptr = cfg_ptr_reverse($2);
1114                 free($2);
1115                 if(ptr) {
1116                         if(!cfg_strlist_insert(&cfg_parser->cfg->
1117                                 local_data, ptr))
1118                                 fatal_exit("out of memory adding local-data");
1119                 } else {
1120                         yyerror("local-data-ptr could not be reversed");
1121                 }
1122         }
1123         ;
1124 server_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG
1125         {
1126                 OUTYY(("P(server_minimal_responses:%s)\n", $2));
1127                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1128                         yyerror("expected yes or no.");
1129                 else cfg_parser->cfg->minimal_responses =
1130                         (strcmp($2, "yes")==0);
1131                 free($2);
1132         }
1133         ;
1134 server_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG
1135         {
1136                 OUTYY(("P(server_rrset_roundrobin:%s)\n", $2));
1137                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1138                         yyerror("expected yes or no.");
1139                 else cfg_parser->cfg->rrset_roundrobin =
1140                         (strcmp($2, "yes")==0);
1141                 free($2);
1142         }
1143         ;
1144 server_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG
1145         {
1146                 OUTYY(("P(server_max_udp_size:%s)\n", $2));
1147                 cfg_parser->cfg->max_udp_size = atoi($2);
1148                 free($2);
1149         }
1150         ;
1151 stub_name: VAR_NAME STRING_ARG
1152         {
1153                 OUTYY(("P(name:%s)\n", $2));
1154                 if(cfg_parser->cfg->stubs->name)
1155                         yyerror("stub name override, there must be one name "
1156                                 "for one stub-zone");
1157                 free(cfg_parser->cfg->stubs->name);
1158                 cfg_parser->cfg->stubs->name = $2;
1159         }
1160         ;
1161 stub_host: VAR_STUB_HOST STRING_ARG
1162         {
1163                 OUTYY(("P(stub-host:%s)\n", $2));
1164                 if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, $2))
1165                         yyerror("out of memory");
1166         }
1167         ;
1168 stub_addr: VAR_STUB_ADDR STRING_ARG
1169         {
1170                 OUTYY(("P(stub-addr:%s)\n", $2));
1171                 if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, $2))
1172                         yyerror("out of memory");
1173         }
1174         ;
1175 stub_first: VAR_STUB_FIRST STRING_ARG
1176         {
1177                 OUTYY(("P(stub-first:%s)\n", $2));
1178                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1179                         yyerror("expected yes or no.");
1180                 else cfg_parser->cfg->stubs->isfirst=(strcmp($2, "yes")==0);
1181                 free($2);
1182         }
1183         ;
1184 stub_prime: VAR_STUB_PRIME STRING_ARG
1185         {
1186                 OUTYY(("P(stub-prime:%s)\n", $2));
1187                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1188                         yyerror("expected yes or no.");
1189                 else cfg_parser->cfg->stubs->isprime = 
1190                         (strcmp($2, "yes")==0);
1191                 free($2);
1192         }
1193         ;
1194 forward_name: VAR_NAME STRING_ARG
1195         {
1196                 OUTYY(("P(name:%s)\n", $2));
1197                 if(cfg_parser->cfg->forwards->name)
1198                         yyerror("forward name override, there must be one "
1199                                 "name for one forward-zone");
1200                 free(cfg_parser->cfg->forwards->name);
1201                 cfg_parser->cfg->forwards->name = $2;
1202         }
1203         ;
1204 forward_host: VAR_FORWARD_HOST STRING_ARG
1205         {
1206                 OUTYY(("P(forward-host:%s)\n", $2));
1207                 if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, $2))
1208                         yyerror("out of memory");
1209         }
1210         ;
1211 forward_addr: VAR_FORWARD_ADDR STRING_ARG
1212         {
1213                 OUTYY(("P(forward-addr:%s)\n", $2));
1214                 if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, $2))
1215                         yyerror("out of memory");
1216         }
1217         ;
1218 forward_first: VAR_FORWARD_FIRST STRING_ARG
1219         {
1220                 OUTYY(("P(forward-first:%s)\n", $2));
1221                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1222                         yyerror("expected yes or no.");
1223                 else cfg_parser->cfg->forwards->isfirst=(strcmp($2, "yes")==0);
1224                 free($2);
1225         }
1226         ;
1227 rcstart: VAR_REMOTE_CONTROL
1228         { 
1229                 OUTYY(("\nP(remote-control:)\n")); 
1230         }
1231         ;
1232 contents_rc: contents_rc content_rc 
1233         | ;
1234 content_rc: rc_control_enable | rc_control_interface | rc_control_port |
1235         rc_server_key_file | rc_server_cert_file | rc_control_key_file |
1236         rc_control_cert_file
1237         ;
1238 rc_control_enable: VAR_CONTROL_ENABLE STRING_ARG
1239         {
1240                 OUTYY(("P(control_enable:%s)\n", $2));
1241                 if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
1242                         yyerror("expected yes or no.");
1243                 else cfg_parser->cfg->remote_control_enable = 
1244                         (strcmp($2, "yes")==0);
1245                 free($2);
1246         }
1247         ;
1248 rc_control_port: VAR_CONTROL_PORT STRING_ARG
1249         {
1250                 OUTYY(("P(control_port:%s)\n", $2));
1251                 if(atoi($2) == 0)
1252                         yyerror("control port number expected");
1253                 else cfg_parser->cfg->control_port = atoi($2);
1254                 free($2);
1255         }
1256         ;
1257 rc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG
1258         {
1259                 OUTYY(("P(control_interface:%s)\n", $2));
1260                 if(!cfg_strlist_insert(&cfg_parser->cfg->control_ifs, $2))
1261                         yyerror("out of memory");
1262         }
1263         ;
1264 rc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG
1265         {
1266                 OUTYY(("P(rc_server_key_file:%s)\n", $2));
1267                 free(cfg_parser->cfg->server_key_file);
1268                 cfg_parser->cfg->server_key_file = $2;
1269         }
1270         ;
1271 rc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG
1272         {
1273                 OUTYY(("P(rc_server_cert_file:%s)\n", $2));
1274                 free(cfg_parser->cfg->server_cert_file);
1275                 cfg_parser->cfg->server_cert_file = $2;
1276         }
1277         ;
1278 rc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG
1279         {
1280                 OUTYY(("P(rc_control_key_file:%s)\n", $2));
1281                 free(cfg_parser->cfg->control_key_file);
1282                 cfg_parser->cfg->control_key_file = $2;
1283         }
1284         ;
1285 rc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG
1286         {
1287                 OUTYY(("P(rc_control_cert_file:%s)\n", $2));
1288                 free(cfg_parser->cfg->control_cert_file);
1289                 cfg_parser->cfg->control_cert_file = $2;
1290         }
1291         ;
1292 pythonstart: VAR_PYTHON
1293         { 
1294                 OUTYY(("\nP(python:)\n")); 
1295         }
1296         ;
1297 contents_py: contents_py content_py
1298         | ;
1299 content_py: py_script
1300         ;
1301 py_script: VAR_PYTHON_SCRIPT STRING_ARG
1302         {
1303                 OUTYY(("P(python-script:%s)\n", $2));
1304                 free(cfg_parser->cfg->python_script);
1305                 cfg_parser->cfg->python_script = $2;
1306         }
1307 %%
1308
1309 /* parse helper routines could be here */