]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Fix #397: [Feature request] add new type always_null to local-zone
authorW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Tue, 12 Jan 2021 12:35:05 +0000 (13:35 +0100)
committerW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Tue, 12 Jan 2021 12:35:05 +0000 (13:35 +0100)
  similar to always_nxdomain.

doc/Changelog
doc/example.conf.in
doc/unbound.conf.5.in
services/localzone.c
services/localzone.h
testdata/localdata.rpl
util/configparser.c
util/configparser.y

index 58a5bf69e113e4d11f8c76b30ff1dc8fa6253685..2cd7baf00b28858b52cd6a2cc0ba604e924eae47 100644 (file)
@@ -1,3 +1,7 @@
+12 January 2021: Wouter
+       - Fix #397: [Feature request] add new type always_null to local-zone
+         similar to always_nxdomain.
+
 8 January 2021: Wouter
        - Merge PR #391 from fhriley: Add start_time to reply callbacks so
          modules can compute the response time.
index 9269461cf7270da1a5de8848c896ee35e2467fb7..c3c7c0f26d2b41f0b9320ac006a641463c21fc20 100644 (file)
@@ -706,6 +706,7 @@ server:
        # o inform_redirect redirects queries and logs client IP address
        # o always_transparent, always_refuse, always_nxdomain, resolve in
        #   that way but ignore local data for that name
+       # o always_null returns 0.0.0.0 or ::0 for any name in the zone.
        # o noview breaks out of that view towards global local-zones.
        #
        # defaults are localhost address, reverse for 127.0.0.1 and ::1
index fa6f91b7c42751bd36fa07b55896bbac13eba32b..4eeb41bf9e42ec0dceb2309eaf3d721ff3762c3b 100644 (file)
@@ -1231,7 +1231,7 @@ address space are not validated.  This is usually required whenever
 Configure a local zone. The type determines the answer to give if
 there is no match from local\-data. The types are deny, refuse, static,
 transparent, redirect, nodefault, typetransparent, inform, inform_deny,
-inform_redirect, always_transparent, always_refuse, always_nxdomain, noview,
+inform_redirect, always_transparent, always_refuse, always_nxdomain, always_null, noview,
 and are explained below. After that the default settings are listed. Use
 local\-data: to enter data into the local zone. Answers for local zones
 are authoritative DNS answers. By default the zones are class IN.
@@ -1305,6 +1305,11 @@ Like refuse, but ignores local data and refuses the query.
 \h'5'\fIalways_nxdomain\fR
 Like static, but ignores local data and returns nxdomain for the query.
 .TP 10
+\h'5'\fIalways_null\fR
+Always returns 0.0.0.0 or ::0 for every name in the zone.  Like redirect
+with zero data for A and AAAA.  Ignores local data in the zone.  Used for
+some block lists.
+.TP 10
 \h'5'\fInoview\fR
 Breaks out of that view and moves towards the global local zones for answer
 to the query.  If the view first is no, it'll resolve normally.  If view first
index c7ae95888b3ce31ffaae68e72eae955c812fd3e4..ed0d2c56558790206ef372e9bbeab66fd9612af5 100644 (file)
@@ -1558,6 +1558,46 @@ local_zones_zone_answer(struct local_zone* z, struct module_env* env,
                || lz_type == local_zone_always_transparent) {
                /* no NODATA or NXDOMAINS for this zone type */
                return 0;
+       } else if(lz_type == local_zone_always_null) {
+               /* 0.0.0.0 or ::0 or noerror/nodata for this zone type,
+                * used for blocklists. */
+               if(qinfo->qtype == LDNS_RR_TYPE_A ||
+                       qinfo->qtype == LDNS_RR_TYPE_AAAA) {
+                       struct ub_packed_rrset_key lrr;
+                       struct packed_rrset_data d;
+                       time_t rr_ttl = 3600;
+                       size_t rr_len = 0;
+                       uint8_t rr_data[2+16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+                       uint8_t* rr_datas = rr_data;
+                       memset(&lrr, 0, sizeof(lrr));
+                       memset(&d, 0, sizeof(d));
+                       lrr.entry.data = &d;
+                       lrr.rk.dname = qinfo->qname;
+                       lrr.rk.dname_len = qinfo->qname_len;
+                       lrr.rk.type = htons(qinfo->qtype);
+                       lrr.rk.rrset_class = htons(qinfo->qclass);
+                       if(qinfo->qtype == LDNS_RR_TYPE_A) {
+                               rr_len = 4;
+                               sldns_write_uint16(rr_data, rr_len);
+                               rr_len += 2;
+                       } else {
+                               rr_len = 16;
+                               sldns_write_uint16(rr_data, rr_len);
+                               rr_len += 2;
+                       }
+                       d.ttl = rr_ttl;
+                       d.count = 1;
+                       d.rr_len = &rr_len;
+                       d.rr_data = &rr_datas;
+                       d.rr_ttl = &rr_ttl;
+                       return local_encode(qinfo, env, edns, repinfo, buf, temp,
+                               &lrr, 1, LDNS_RCODE_NOERROR);
+               } else {
+                       local_error_encode(qinfo, env, edns, repinfo, buf,
+                               temp, LDNS_RCODE_NOERROR,
+                               (LDNS_RCODE_NOERROR|BIT_AA));
+               }
+               return 1;
        }
        /* else lz_type == local_zone_transparent */
 
@@ -1762,6 +1802,7 @@ const char* local_zone_type2str(enum localzone_type t)
                case local_zone_always_nxdomain: return "always_nxdomain";
                case local_zone_always_nodata: return "always_nodata";
                case local_zone_always_deny: return "always_deny";
+               case local_zone_always_null: return "always_null";
                case local_zone_noview: return "noview";
                case local_zone_invalid: return "invalid";
        }
@@ -1798,6 +1839,8 @@ int local_zone_str2type(const char* type, enum localzone_type* t)
                *t = local_zone_always_nodata;
        else if(strcmp(type, "always_deny") == 0)
                *t = local_zone_always_deny;
+       else if(strcmp(type, "always_null") == 0)
+               *t = local_zone_always_null;
        else if(strcmp(type, "noview") == 0)
                *t = local_zone_noview;
        else if(strcmp(type, "nodefault") == 0)
index bb35939366a7d53899a1c6812282ffffa399a49d..492629936dad04152b0e39c26fde3c37851f365d 100644 (file)
@@ -96,6 +96,9 @@ enum localzone_type {
        local_zone_always_nodata,
        /** drop query, even when there is local data */
        local_zone_always_deny,
+       /** answer with 0.0.0.0 or ::0 or noerror/nodata, even when there is
+        * local data */
+       local_zone_always_null,
        /** answer not from the view, but global or no-answer */
        local_zone_noview,
        /** Invalid type, cannot be used to generate answer */
index a2e7eeba2949fad7322c1871aa7cf888af53163e..eb25ef573d74c61ead5850234346d68cd8267942 100644 (file)
@@ -35,6 +35,9 @@ server:
        local-zone: "redirect.top." redirect
        local-data: "redirect.top. A 20.30.40.54"
 
+       ; null zone
+       local-zone: "null.top." always_null
+
        ; create implicit data in the IN domain as well
        local-data: "a.a.implicit. A 20.30.41.50"
        local-data: "b.a.implicit. A 20.30.42.50"
@@ -355,4 +358,36 @@ SECTION ANSWER
 www.redirect.top. IN A 20.30.40.54
 ENTRY_END
 
+; always_null zone
+STEP 60 QUERY
+ENTRY_BEGIN
+SECTION QUESTION
+null.top. IN A
+ENTRY_END
+STEP 61 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA AA NOERROR
+SECTION QUESTION
+null.top. IN A
+SECTION ANSWER
+null.top. IN A 0.0.0.0
+ENTRY_END
+
+; always_null zone AAAA
+STEP 62 QUERY
+ENTRY_BEGIN
+SECTION QUESTION
+foo.null.top. IN AAAA
+ENTRY_END
+STEP 63 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA AA NOERROR
+SECTION QUESTION
+foo.null.top. IN AAAA
+SECTION ANSWER
+foo.null.top. IN AAAA ::0
+ENTRY_END
+
 SCENARIO_END
index 4e5bf5a4124ce32b4622c288995cab02dcce6e82..cc5d9fb5e8af4677e3a76dcefc8166c1132dfd88 100644 (file)
@@ -1125,26 +1125,26 @@ static const yytype_uint16 yyrline[] =
     1680,  1689,  1698,  1707,  1714,  1724,  1744,  1751,  1769,  1782,
     1795,  1804,  1813,  1822,  1831,  1841,  1851,  1862,  1871,  1880,
     1889,  1898,  1907,  1916,  1929,  1942,  1951,  1958,  1967,  1976,
-    1985,  1994,  2002,  2015,  2023,  2064,  2071,  2086,  2096,  2106,
-    2113,  2120,  2127,  2136,  2144,  2158,  2179,  2200,  2212,  2224,
-    2236,  2245,  2266,  2276,  2285,  2293,  2301,  2314,  2327,  2342,
-    2357,  2366,  2375,  2381,  2390,  2399,  2409,  2419,  2432,  2445,
-    2457,  2471,  2483,  2497,  2506,  2518,  2528,  2535,  2542,  2551,
-    2560,  2570,  2580,  2590,  2597,  2604,  2613,  2622,  2632,  2642,
-    2649,  2656,  2663,  2671,  2681,  2691,  2701,  2711,  2750,  2760,
-    2768,  2776,  2791,  2800,  2805,  2806,  2807,  2807,  2807,  2808,
-    2808,  2808,  2809,  2809,  2811,  2821,  2830,  2837,  2844,  2851,
-    2858,  2865,  2872,  2877,  2878,  2879,  2879,  2879,  2880,  2880,
-    2880,  2881,  2882,  2882,  2883,  2883,  2884,  2884,  2885,  2886,
-    2887,  2888,  2889,  2890,  2892,  2901,  2911,  2918,  2925,  2934,
-    2941,  2948,  2955,  2962,  2971,  2980,  2987,  2994,  3004,  3014,
-    3024,  3034,  3044,  3054,  3059,  3060,  3061,  3063,  3069,  3074,
-    3075,  3076,  3078,  3084,  3094,  3101,  3110,  3118,  3123,  3124,
-    3126,  3126,  3126,  3127,  3127,  3128,  3129,  3130,  3131,  3132,
-    3134,  3144,  3153,  3160,  3169,  3176,  3185,  3193,  3206,  3214,
-    3227,  3232,  3233,  3234,  3234,  3235,  3235,  3235,  3236,  3238,
-    3250,  3262,  3274,  3289,  3302,  3315,  3326,  3331,  3332,  3333,
-    3333,  3335,  3350
+    1985,  1994,  2002,  2015,  2023,  2065,  2072,  2087,  2097,  2107,
+    2114,  2121,  2128,  2137,  2145,  2159,  2180,  2201,  2213,  2225,
+    2237,  2246,  2267,  2277,  2286,  2294,  2302,  2315,  2328,  2343,
+    2358,  2367,  2376,  2382,  2391,  2400,  2410,  2420,  2433,  2446,
+    2458,  2472,  2484,  2498,  2507,  2519,  2529,  2536,  2543,  2552,
+    2561,  2571,  2581,  2591,  2598,  2605,  2614,  2623,  2633,  2643,
+    2650,  2657,  2664,  2672,  2682,  2692,  2702,  2712,  2751,  2761,
+    2769,  2777,  2792,  2801,  2806,  2807,  2808,  2808,  2808,  2809,
+    2809,  2809,  2810,  2810,  2812,  2822,  2831,  2838,  2845,  2852,
+    2859,  2866,  2873,  2878,  2879,  2880,  2880,  2880,  2881,  2881,
+    2881,  2882,  2883,  2883,  2884,  2884,  2885,  2885,  2886,  2887,
+    2888,  2889,  2890,  2891,  2893,  2902,  2912,  2919,  2926,  2935,
+    2942,  2949,  2956,  2963,  2972,  2981,  2988,  2995,  3005,  3015,
+    3025,  3035,  3045,  3055,  3060,  3061,  3062,  3064,  3070,  3075,
+    3076,  3077,  3079,  3085,  3095,  3102,  3111,  3119,  3124,  3125,
+    3127,  3127,  3127,  3128,  3128,  3129,  3130,  3131,  3132,  3133,
+    3135,  3145,  3154,  3161,  3170,  3177,  3186,  3194,  3207,  3215,
+    3228,  3233,  3234,  3235,  3235,  3236,  3236,  3236,  3237,  3239,
+    3251,  3263,  3275,  3290,  3303,  3316,  3327,  3332,  3333,  3334,
+    3334,  3336,  3351
 };
 #endif
 
@@ -5019,6 +5019,7 @@ yyreduce:
                   && strcmp((yyvsp[0].str), "always_transparent")!=0
                   && strcmp((yyvsp[0].str), "always_refuse")!=0
                   && strcmp((yyvsp[0].str), "always_nxdomain")!=0
+                  && strcmp((yyvsp[0].str), "always_null")!=0
                   && strcmp((yyvsp[0].str), "noview")!=0
                   && strcmp((yyvsp[0].str), "inform")!=0 && strcmp((yyvsp[0].str), "inform_deny")!=0
                   && strcmp((yyvsp[0].str), "inform_redirect") != 0
@@ -5027,8 +5028,8 @@ yyreduce:
                                "refuse, redirect, transparent, "
                                "typetransparent, inform, inform_deny, "
                                "inform_redirect, always_transparent, "
-                               "always_refuse, always_nxdomain, noview "
-                               ", nodefault or ipset");
+                               "always_refuse, always_nxdomain, always_null, "
+                               "noview, nodefault or ipset");
                        free((yyvsp[-1].str));
                        free((yyvsp[0].str));
                } else if(strcmp((yyvsp[0].str), "nodefault")==0) {
@@ -5049,21 +5050,21 @@ yyreduce:
                                fatal_exit("out of memory adding local-zone");
                }
        }
-#line 5053 "util/configparser.c"
+#line 5054 "util/configparser.c"
     break;
 
   case 445:
-#line 2065 "./util/configparser.y"
+#line 2066 "./util/configparser.y"
     {
                OUTYY(("P(server_local_data:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[0].str)))
                        fatal_exit("out of memory adding local-data");
        }
-#line 5063 "util/configparser.c"
+#line 5064 "util/configparser.c"
     break;
 
   case 446:
-#line 2072 "./util/configparser.y"
+#line 2073 "./util/configparser.y"
     {
                char* ptr;
                OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -5077,11 +5078,11 @@ yyreduce:
                        yyerror("local-data-ptr could not be reversed");
                }
        }
-#line 5081 "util/configparser.c"
+#line 5082 "util/configparser.c"
     break;
 
   case 447:
-#line 2087 "./util/configparser.y"
+#line 2088 "./util/configparser.y"
     {
                OUTYY(("P(server_minimal_responses:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5090,11 +5091,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5094 "util/configparser.c"
+#line 5095 "util/configparser.c"
     break;
 
   case 448:
-#line 2097 "./util/configparser.y"
+#line 2098 "./util/configparser.y"
     {
                OUTYY(("P(server_rrset_roundrobin:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5103,41 +5104,41 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5107 "util/configparser.c"
+#line 5108 "util/configparser.c"
     break;
 
   case 449:
-#line 2107 "./util/configparser.y"
+#line 2108 "./util/configparser.y"
     {
                OUTYY(("P(server_unknown_server_time_limit:%s)\n", (yyvsp[0].str)));
                cfg_parser->cfg->unknown_server_time_limit = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5117 "util/configparser.c"
+#line 5118 "util/configparser.c"
     break;
 
   case 450:
-#line 2114 "./util/configparser.y"
+#line 2115 "./util/configparser.y"
     {
                OUTYY(("P(server_max_udp_size:%s)\n", (yyvsp[0].str)));
                cfg_parser->cfg->max_udp_size = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5127 "util/configparser.c"
+#line 5128 "util/configparser.c"
     break;
 
   case 451:
-#line 2121 "./util/configparser.y"
+#line 2122 "./util/configparser.y"
     {
                OUTYY(("P(dns64_prefix:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dns64_prefix);
                cfg_parser->cfg->dns64_prefix = (yyvsp[0].str);
        }
-#line 5137 "util/configparser.c"
+#line 5138 "util/configparser.c"
     break;
 
   case 452:
-#line 2128 "./util/configparser.y"
+#line 2129 "./util/configparser.y"
     {
                OUTYY(("P(server_dns64_synthall:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5145,22 +5146,22 @@ yyreduce:
                else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5149 "util/configparser.c"
+#line 5150 "util/configparser.c"
     break;
 
   case 453:
-#line 2137 "./util/configparser.y"
+#line 2138 "./util/configparser.y"
     {
                OUTYY(("P(dns64_ignore_aaaa:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->dns64_ignore_aaaa,
                        (yyvsp[0].str)))
                        fatal_exit("out of memory adding dns64-ignore-aaaa");
        }
-#line 5160 "util/configparser.c"
+#line 5161 "util/configparser.c"
     break;
 
   case 454:
-#line 2145 "./util/configparser.y"
+#line 2146 "./util/configparser.y"
     {
                char* p, *s = (yyvsp[0].str);
                OUTYY(("P(server_define_tag:%s)\n", (yyvsp[0].str)));
@@ -5173,11 +5174,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 5177 "util/configparser.c"
+#line 5178 "util/configparser.c"
     break;
 
   case 455:
-#line 2159 "./util/configparser.y"
+#line 2160 "./util/configparser.y"
     {
                size_t len = 0;
                uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -5197,11 +5198,11 @@ yyreduce:
                        }
                }
        }
-#line 5201 "util/configparser.c"
+#line 5202 "util/configparser.c"
     break;
 
   case 456:
-#line 2180 "./util/configparser.y"
+#line 2181 "./util/configparser.y"
     {
                size_t len = 0;
                uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -5221,11 +5222,11 @@ yyreduce:
                        }
                }
        }
-#line 5225 "util/configparser.c"
+#line 5226 "util/configparser.c"
     break;
 
   case 457:
-#line 2201 "./util/configparser.y"
+#line 2202 "./util/configparser.y"
     {
                OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
                if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions,
@@ -5236,11 +5237,11 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 5240 "util/configparser.c"
+#line 5241 "util/configparser.c"
     break;
 
   case 458:
-#line 2213 "./util/configparser.y"
+#line 2214 "./util/configparser.y"
     {
                OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
                if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas,
@@ -5251,11 +5252,11 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 5255 "util/configparser.c"
+#line 5256 "util/configparser.c"
     break;
 
   case 459:
-#line 2225 "./util/configparser.y"
+#line 2226 "./util/configparser.y"
     {
                OUTYY(("P(server_local_zone_override:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
                if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides,
@@ -5266,11 +5267,11 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 5270 "util/configparser.c"
+#line 5271 "util/configparser.c"
     break;
 
   case 460:
-#line 2237 "./util/configparser.y"
+#line 2238 "./util/configparser.y"
     {
                OUTYY(("P(server_access_control_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view,
@@ -5278,11 +5279,11 @@ yyreduce:
                        yyerror("out of memory");
                }
        }
-#line 5282 "util/configparser.c"
+#line 5283 "util/configparser.c"
     break;
 
   case 461:
-#line 2246 "./util/configparser.y"
+#line 2247 "./util/configparser.y"
     {
                size_t len = 0;
                uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -5302,11 +5303,11 @@ yyreduce:
                        }
                }
        }
-#line 5306 "util/configparser.c"
+#line 5307 "util/configparser.c"
     break;
 
   case 462:
-#line 2267 "./util/configparser.y"
+#line 2268 "./util/configparser.y"
     { 
                OUTYY(("P(server_ip_ratelimit:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5314,11 +5315,11 @@ yyreduce:
                else cfg_parser->cfg->ip_ratelimit = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5318 "util/configparser.c"
+#line 5319 "util/configparser.c"
     break;
 
   case 463:
-#line 2277 "./util/configparser.y"
+#line 2278 "./util/configparser.y"
     { 
                OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5326,33 +5327,33 @@ yyreduce:
                else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5330 "util/configparser.c"
+#line 5331 "util/configparser.c"
     break;
 
   case 464:
-#line 2286 "./util/configparser.y"
+#line 2287 "./util/configparser.y"
     {
        OUTYY(("P(server_ip_ratelimit_size:%s)\n", (yyvsp[0].str)));
        if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ip_ratelimit_size))
                yyerror("memory size expected");
        free((yyvsp[0].str));
   }
-#line 5341 "util/configparser.c"
+#line 5342 "util/configparser.c"
     break;
 
   case 465:
-#line 2294 "./util/configparser.y"
+#line 2295 "./util/configparser.y"
     {
                OUTYY(("P(server_ratelimit_size:%s)\n", (yyvsp[0].str)));
                if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ratelimit_size))
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 5352 "util/configparser.c"
+#line 5353 "util/configparser.c"
     break;
 
   case 466:
-#line 2302 "./util/configparser.y"
+#line 2303 "./util/configparser.y"
     {
        OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
        if(atoi((yyvsp[0].str)) == 0)
@@ -5364,11 +5365,11 @@ yyreduce:
        }
        free((yyvsp[0].str));
   }
-#line 5368 "util/configparser.c"
+#line 5369 "util/configparser.c"
     break;
 
   case 467:
-#line 2315 "./util/configparser.y"
+#line 2316 "./util/configparser.y"
     {
                OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -5380,11 +5381,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 5384 "util/configparser.c"
+#line 5385 "util/configparser.c"
     break;
 
   case 468:
-#line 2328 "./util/configparser.y"
+#line 2329 "./util/configparser.y"
     {
                OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
@@ -5398,11 +5399,11 @@ yyreduce:
                                        "ratelimit-for-domain");
                }
        }
-#line 5402 "util/configparser.c"
+#line 5403 "util/configparser.c"
     break;
 
   case 469:
-#line 2343 "./util/configparser.y"
+#line 2344 "./util/configparser.y"
     {
                OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
@@ -5416,11 +5417,11 @@ yyreduce:
                                        "ratelimit-below-domain");
                }
        }
-#line 5420 "util/configparser.c"
+#line 5421 "util/configparser.c"
     break;
 
   case 470:
-#line 2358 "./util/configparser.y"
+#line 2359 "./util/configparser.y"
     { 
        OUTYY(("P(server_ip_ratelimit_factor:%s)\n", (yyvsp[0].str))); 
        if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5428,11 +5429,11 @@ yyreduce:
        else cfg_parser->cfg->ip_ratelimit_factor = atoi((yyvsp[0].str));
        free((yyvsp[0].str));
        }
-#line 5432 "util/configparser.c"
+#line 5433 "util/configparser.c"
     break;
 
   case 471:
-#line 2367 "./util/configparser.y"
+#line 2368 "./util/configparser.y"
     { 
                OUTYY(("P(server_ratelimit_factor:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5440,20 +5441,20 @@ yyreduce:
                else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5444 "util/configparser.c"
+#line 5445 "util/configparser.c"
     break;
 
   case 472:
-#line 2376 "./util/configparser.y"
+#line 2377 "./util/configparser.y"
     { 
                OUTYY(("P(low-rtt option is deprecated, use fast-server-num instead)\n"));
                free((yyvsp[0].str));
        }
-#line 5453 "util/configparser.c"
+#line 5454 "util/configparser.c"
     break;
 
   case 473:
-#line 2382 "./util/configparser.y"
+#line 2383 "./util/configparser.y"
     { 
                OUTYY(("P(server_fast_server_num:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) <= 0)
@@ -5461,11 +5462,11 @@ yyreduce:
                else cfg_parser->cfg->fast_server_num = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5465 "util/configparser.c"
+#line 5466 "util/configparser.c"
     break;
 
   case 474:
-#line 2391 "./util/configparser.y"
+#line 2392 "./util/configparser.y"
     { 
                OUTYY(("P(server_fast_server_permil:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5473,11 +5474,11 @@ yyreduce:
                else cfg_parser->cfg->fast_server_permil = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5477 "util/configparser.c"
+#line 5478 "util/configparser.c"
     break;
 
   case 475:
-#line 2400 "./util/configparser.y"
+#line 2401 "./util/configparser.y"
     {
                OUTYY(("P(server_qname_minimisation:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5486,11 +5487,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5490 "util/configparser.c"
+#line 5491 "util/configparser.c"
     break;
 
   case 476:
-#line 2410 "./util/configparser.y"
+#line 2411 "./util/configparser.y"
     {
                OUTYY(("P(server_qname_minimisation_strict:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5499,11 +5500,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5503 "util/configparser.c"
+#line 5504 "util/configparser.c"
     break;
 
   case 477:
-#line 2420 "./util/configparser.y"
+#line 2421 "./util/configparser.y"
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_enabled:%s)\n", (yyvsp[0].str)));
@@ -5515,11 +5516,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 5519 "util/configparser.c"
+#line 5520 "util/configparser.c"
     break;
 
   case 478:
-#line 2433 "./util/configparser.y"
+#line 2434 "./util/configparser.y"
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", (yyvsp[0].str)));
@@ -5531,11 +5532,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 5535 "util/configparser.c"
+#line 5536 "util/configparser.c"
     break;
 
   case 479:
-#line 2446 "./util/configparser.y"
+#line 2447 "./util/configparser.y"
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_hook:%s)\n", (yyvsp[0].str)));
@@ -5546,11 +5547,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5550 "util/configparser.c"
+#line 5551 "util/configparser.c"
     break;
 
   case 480:
-#line 2458 "./util/configparser.y"
+#line 2459 "./util/configparser.y"
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", (yyvsp[0].str)));
@@ -5563,11 +5564,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5567 "util/configparser.c"
+#line 5568 "util/configparser.c"
     break;
 
   case 481:
-#line 2472 "./util/configparser.y"
+#line 2473 "./util/configparser.y"
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_whitelist:%s)\n", (yyvsp[0].str)));
@@ -5578,11 +5579,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5582 "util/configparser.c"
+#line 5583 "util/configparser.c"
     break;
 
   case 482:
-#line 2484 "./util/configparser.y"
+#line 2485 "./util/configparser.y"
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_strict:%s)\n", (yyvsp[0].str)));
@@ -5595,11 +5596,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5599 "util/configparser.c"
+#line 5600 "util/configparser.c"
     break;
 
   case 483:
-#line 2498 "./util/configparser.y"
+#line 2499 "./util/configparser.y"
     {
                OUTYY(("P(server_edns_client_string:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(!cfg_str2list_insert(
@@ -5607,11 +5608,11 @@ yyreduce:
                        fatal_exit("out of memory adding "
                                "edns-client-string");
        }
-#line 5611 "util/configparser.c"
+#line 5612 "util/configparser.c"
     break;
 
   case 484:
-#line 2507 "./util/configparser.y"
+#line 2508 "./util/configparser.y"
     {
                OUTYY(("P(edns_client_string_opcode:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5622,11 +5623,11 @@ yyreduce:
                free((yyvsp[0].str));
 
        }
-#line 5626 "util/configparser.c"
+#line 5627 "util/configparser.c"
     break;
 
   case 485:
-#line 2519 "./util/configparser.y"
+#line 2520 "./util/configparser.y"
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->stubs->name)
@@ -5635,31 +5636,31 @@ yyreduce:
                free(cfg_parser->cfg->stubs->name);
                cfg_parser->cfg->stubs->name = (yyvsp[0].str);
        }
-#line 5639 "util/configparser.c"
+#line 5640 "util/configparser.c"
     break;
 
   case 486:
-#line 2529 "./util/configparser.y"
+#line 2530 "./util/configparser.y"
     {
                OUTYY(("P(stub-host:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5649 "util/configparser.c"
+#line 5650 "util/configparser.c"
     break;
 
   case 487:
-#line 2536 "./util/configparser.y"
+#line 2537 "./util/configparser.y"
     {
                OUTYY(("P(stub-addr:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5659 "util/configparser.c"
+#line 5660 "util/configparser.c"
     break;
 
   case 488:
-#line 2543 "./util/configparser.y"
+#line 2544 "./util/configparser.y"
     {
                OUTYY(("P(stub-first:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5667,11 +5668,11 @@ yyreduce:
                else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5671 "util/configparser.c"
+#line 5672 "util/configparser.c"
     break;
 
   case 489:
-#line 2552 "./util/configparser.y"
+#line 2553 "./util/configparser.y"
     {
                OUTYY(("P(stub-no-cache:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5679,11 +5680,11 @@ yyreduce:
                else cfg_parser->cfg->stubs->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5683 "util/configparser.c"
+#line 5684 "util/configparser.c"
     break;
 
   case 490:
-#line 2561 "./util/configparser.y"
+#line 2562 "./util/configparser.y"
     {
                OUTYY(("P(stub-ssl-upstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5692,11 +5693,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5696 "util/configparser.c"
+#line 5697 "util/configparser.c"
     break;
 
   case 491:
-#line 2571 "./util/configparser.y"
+#line 2572 "./util/configparser.y"
     {
                OUTYY(("P(stub-prime:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5705,11 +5706,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5709 "util/configparser.c"
+#line 5710 "util/configparser.c"
     break;
 
   case 492:
-#line 2581 "./util/configparser.y"
+#line 2582 "./util/configparser.y"
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->forwards->name)
@@ -5718,31 +5719,31 @@ yyreduce:
                free(cfg_parser->cfg->forwards->name);
                cfg_parser->cfg->forwards->name = (yyvsp[0].str);
        }
-#line 5722 "util/configparser.c"
+#line 5723 "util/configparser.c"
     break;
 
   case 493:
-#line 2591 "./util/configparser.y"
+#line 2592 "./util/configparser.y"
     {
                OUTYY(("P(forward-host:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5732 "util/configparser.c"
+#line 5733 "util/configparser.c"
     break;
 
   case 494:
-#line 2598 "./util/configparser.y"
+#line 2599 "./util/configparser.y"
     {
                OUTYY(("P(forward-addr:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5742 "util/configparser.c"
+#line 5743 "util/configparser.c"
     break;
 
   case 495:
-#line 2605 "./util/configparser.y"
+#line 2606 "./util/configparser.y"
     {
                OUTYY(("P(forward-first:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5750,11 +5751,11 @@ yyreduce:
                else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5754 "util/configparser.c"
+#line 5755 "util/configparser.c"
     break;
 
   case 496:
-#line 2614 "./util/configparser.y"
+#line 2615 "./util/configparser.y"
     {
                OUTYY(("P(forward-no-cache:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5762,11 +5763,11 @@ yyreduce:
                else cfg_parser->cfg->forwards->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5766 "util/configparser.c"
+#line 5767 "util/configparser.c"
     break;
 
   case 497:
-#line 2623 "./util/configparser.y"
+#line 2624 "./util/configparser.y"
     {
                OUTYY(("P(forward-ssl-upstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5775,11 +5776,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5779 "util/configparser.c"
+#line 5780 "util/configparser.c"
     break;
 
   case 498:
-#line 2633 "./util/configparser.y"
+#line 2634 "./util/configparser.y"
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->auths->name)
@@ -5788,52 +5789,52 @@ yyreduce:
                free(cfg_parser->cfg->auths->name);
                cfg_parser->cfg->auths->name = (yyvsp[0].str);
        }
-#line 5792 "util/configparser.c"
+#line 5793 "util/configparser.c"
     break;
 
   case 499:
-#line 2643 "./util/configparser.y"
+#line 2644 "./util/configparser.y"
     {
                OUTYY(("P(zonefile:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->auths->zonefile);
                cfg_parser->cfg->auths->zonefile = (yyvsp[0].str);
        }
-#line 5802 "util/configparser.c"
+#line 5803 "util/configparser.c"
     break;
 
   case 500:
-#line 2650 "./util/configparser.y"
+#line 2651 "./util/configparser.y"
     {
                OUTYY(("P(master:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->auths->masters, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5812 "util/configparser.c"
+#line 5813 "util/configparser.c"
     break;
 
   case 501:
-#line 2657 "./util/configparser.y"
+#line 2658 "./util/configparser.y"
     {
                OUTYY(("P(url:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->auths->urls, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5822 "util/configparser.c"
+#line 5823 "util/configparser.c"
     break;
 
   case 502:
-#line 2664 "./util/configparser.y"
+#line 2665 "./util/configparser.y"
     {
                OUTYY(("P(allow-notify:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->auths->allow_notify,
                        (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5833 "util/configparser.c"
+#line 5834 "util/configparser.c"
     break;
 
   case 503:
-#line 2672 "./util/configparser.y"
+#line 2673 "./util/configparser.y"
     {
                OUTYY(("P(for-downstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5842,11 +5843,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5846 "util/configparser.c"
+#line 5847 "util/configparser.c"
     break;
 
   case 504:
-#line 2682 "./util/configparser.y"
+#line 2683 "./util/configparser.y"
     {
                OUTYY(("P(for-upstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5855,11 +5856,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5859 "util/configparser.c"
+#line 5860 "util/configparser.c"
     break;
 
   case 505:
-#line 2692 "./util/configparser.y"
+#line 2693 "./util/configparser.y"
     {
                OUTYY(("P(fallback-enabled:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5868,11 +5869,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5872 "util/configparser.c"
+#line 5873 "util/configparser.c"
     break;
 
   case 506:
-#line 2702 "./util/configparser.y"
+#line 2703 "./util/configparser.y"
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->views->name)
@@ -5881,11 +5882,11 @@ yyreduce:
                free(cfg_parser->cfg->views->name);
                cfg_parser->cfg->views->name = (yyvsp[0].str);
        }
-#line 5885 "util/configparser.c"
+#line 5886 "util/configparser.c"
     break;
 
   case 507:
-#line 2712 "./util/configparser.y"
+#line 2713 "./util/configparser.y"
     {
                OUTYY(("P(view_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 &&
@@ -5923,11 +5924,11 @@ yyreduce:
                                fatal_exit("out of memory adding local-zone");
                }
        }
-#line 5927 "util/configparser.c"
+#line 5928 "util/configparser.c"
     break;
 
   case 508:
-#line 2751 "./util/configparser.y"
+#line 2752 "./util/configparser.y"
     {
                OUTYY(("P(view_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                validate_respip_action((yyvsp[0].str));
@@ -5936,33 +5937,33 @@ yyreduce:
                        fatal_exit("out of memory adding per-view "
                                "response-ip action");
        }
-#line 5940 "util/configparser.c"
+#line 5941 "util/configparser.c"
     break;
 
   case 509:
-#line 2761 "./util/configparser.y"
+#line 2762 "./util/configparser.y"
     {
                OUTYY(("P(view_response_ip_data:%s)\n", (yyvsp[-1].str)));
                if(!cfg_str2list_insert(
                        &cfg_parser->cfg->views->respip_data, (yyvsp[-1].str), (yyvsp[0].str)))
                        fatal_exit("out of memory adding response-ip-data");
        }
-#line 5951 "util/configparser.c"
+#line 5952 "util/configparser.c"
     break;
 
   case 510:
-#line 2769 "./util/configparser.y"
+#line 2770 "./util/configparser.y"
     {
                OUTYY(("P(view_local_data:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, (yyvsp[0].str))) {
                        fatal_exit("out of memory adding local-data");
                }
        }
-#line 5962 "util/configparser.c"
+#line 5963 "util/configparser.c"
     break;
 
   case 511:
-#line 2777 "./util/configparser.y"
+#line 2778 "./util/configparser.y"
     {
                char* ptr;
                OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -5976,11 +5977,11 @@ yyreduce:
                        yyerror("local-data-ptr could not be reversed");
                }
        }
-#line 5980 "util/configparser.c"
+#line 5981 "util/configparser.c"
     break;
 
   case 512:
-#line 2792 "./util/configparser.y"
+#line 2793 "./util/configparser.y"
     {
                OUTYY(("P(view-first:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5988,19 +5989,19 @@ yyreduce:
                else cfg_parser->cfg->views->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5992 "util/configparser.c"
+#line 5993 "util/configparser.c"
     break;
 
   case 513:
-#line 2801 "./util/configparser.y"
+#line 2802 "./util/configparser.y"
     { 
                OUTYY(("\nP(remote-control:)\n")); 
        }
-#line 6000 "util/configparser.c"
+#line 6001 "util/configparser.c"
     break;
 
   case 524:
-#line 2812 "./util/configparser.y"
+#line 2813 "./util/configparser.y"
     {
                OUTYY(("P(control_enable:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6009,11 +6010,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6013 "util/configparser.c"
+#line 6014 "util/configparser.c"
     break;
 
   case 525:
-#line 2822 "./util/configparser.y"
+#line 2823 "./util/configparser.y"
     {
                OUTYY(("P(control_port:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -6021,79 +6022,79 @@ yyreduce:
                else cfg_parser->cfg->control_port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 6025 "util/configparser.c"
+#line 6026 "util/configparser.c"
     break;
 
   case 526:
-#line 2831 "./util/configparser.y"
+#line 2832 "./util/configparser.y"
     {
                OUTYY(("P(control_interface:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_append(&cfg_parser->cfg->control_ifs, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 6035 "util/configparser.c"
+#line 6036 "util/configparser.c"
     break;
 
   case 527:
-#line 2838 "./util/configparser.y"
+#line 2839 "./util/configparser.y"
     {
                OUTYY(("P(control_use_cert:%s)\n", (yyvsp[0].str)));
                cfg_parser->cfg->control_use_cert = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6045 "util/configparser.c"
+#line 6046 "util/configparser.c"
     break;
 
   case 528:
-#line 2845 "./util/configparser.y"
+#line 2846 "./util/configparser.y"
     {
                OUTYY(("P(rc_server_key_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->server_key_file);
                cfg_parser->cfg->server_key_file = (yyvsp[0].str);
        }
-#line 6055 "util/configparser.c"
+#line 6056 "util/configparser.c"
     break;
 
   case 529:
-#line 2852 "./util/configparser.y"
+#line 2853 "./util/configparser.y"
     {
                OUTYY(("P(rc_server_cert_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->server_cert_file);
                cfg_parser->cfg->server_cert_file = (yyvsp[0].str);
        }
-#line 6065 "util/configparser.c"
+#line 6066 "util/configparser.c"
     break;
 
   case 530:
-#line 2859 "./util/configparser.y"
+#line 2860 "./util/configparser.y"
     {
                OUTYY(("P(rc_control_key_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->control_key_file);
                cfg_parser->cfg->control_key_file = (yyvsp[0].str);
        }
-#line 6075 "util/configparser.c"
+#line 6076 "util/configparser.c"
     break;
 
   case 531:
-#line 2866 "./util/configparser.y"
+#line 2867 "./util/configparser.y"
     {
                OUTYY(("P(rc_control_cert_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->control_cert_file);
                cfg_parser->cfg->control_cert_file = (yyvsp[0].str);
        }
-#line 6085 "util/configparser.c"
+#line 6086 "util/configparser.c"
     break;
 
   case 532:
-#line 2873 "./util/configparser.y"
+#line 2874 "./util/configparser.y"
     {
                OUTYY(("\nP(dnstap:)\n"));
        }
-#line 6093 "util/configparser.c"
+#line 6094 "util/configparser.c"
     break;
 
   case 554:
-#line 2893 "./util/configparser.y"
+#line 2894 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_enable:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6101,11 +6102,11 @@ yyreduce:
                else cfg_parser->cfg->dnstap = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6105 "util/configparser.c"
+#line 6106 "util/configparser.c"
     break;
 
   case 555:
-#line 2902 "./util/configparser.y"
+#line 2903 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_bidirectional:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6114,31 +6115,31 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6118 "util/configparser.c"
+#line 6119 "util/configparser.c"
     break;
 
   case 556:
-#line 2912 "./util/configparser.y"
+#line 2913 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_socket_path:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_socket_path);
                cfg_parser->cfg->dnstap_socket_path = (yyvsp[0].str);
        }
-#line 6128 "util/configparser.c"
+#line 6129 "util/configparser.c"
     break;
 
   case 557:
-#line 2919 "./util/configparser.y"
+#line 2920 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_ip:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_ip);
                cfg_parser->cfg->dnstap_ip = (yyvsp[0].str);
        }
-#line 6138 "util/configparser.c"
+#line 6139 "util/configparser.c"
     break;
 
   case 558:
-#line 2926 "./util/configparser.y"
+#line 2927 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_tls:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6146,51 +6147,51 @@ yyreduce:
                else cfg_parser->cfg->dnstap_tls = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6150 "util/configparser.c"
+#line 6151 "util/configparser.c"
     break;
 
   case 559:
-#line 2935 "./util/configparser.y"
+#line 2936 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_tls_server_name:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_tls_server_name);
                cfg_parser->cfg->dnstap_tls_server_name = (yyvsp[0].str);
        }
-#line 6160 "util/configparser.c"
+#line 6161 "util/configparser.c"
     break;
 
   case 560:
-#line 2942 "./util/configparser.y"
+#line 2943 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_tls_cert_bundle:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_tls_cert_bundle);
                cfg_parser->cfg->dnstap_tls_cert_bundle = (yyvsp[0].str);
        }
-#line 6170 "util/configparser.c"
+#line 6171 "util/configparser.c"
     break;
 
   case 561:
-#line 2949 "./util/configparser.y"
+#line 2950 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_tls_client_key_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_tls_client_key_file);
                cfg_parser->cfg->dnstap_tls_client_key_file = (yyvsp[0].str);
        }
-#line 6180 "util/configparser.c"
+#line 6181 "util/configparser.c"
     break;
 
   case 562:
-#line 2956 "./util/configparser.y"
+#line 2957 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_tls_client_cert_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_tls_client_cert_file);
                cfg_parser->cfg->dnstap_tls_client_cert_file = (yyvsp[0].str);
        }
-#line 6190 "util/configparser.c"
+#line 6191 "util/configparser.c"
     break;
 
   case 563:
-#line 2963 "./util/configparser.y"
+#line 2964 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_send_identity:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6198,11 +6199,11 @@ yyreduce:
                else cfg_parser->cfg->dnstap_send_identity = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6202 "util/configparser.c"
+#line 6203 "util/configparser.c"
     break;
 
   case 564:
-#line 2972 "./util/configparser.y"
+#line 2973 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_send_version:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6210,31 +6211,31 @@ yyreduce:
                else cfg_parser->cfg->dnstap_send_version = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6214 "util/configparser.c"
+#line 6215 "util/configparser.c"
     break;
 
   case 565:
-#line 2981 "./util/configparser.y"
+#line 2982 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_identity:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_identity);
                cfg_parser->cfg->dnstap_identity = (yyvsp[0].str);
        }
-#line 6224 "util/configparser.c"
+#line 6225 "util/configparser.c"
     break;
 
   case 566:
-#line 2988 "./util/configparser.y"
+#line 2989 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_version:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_version);
                cfg_parser->cfg->dnstap_version = (yyvsp[0].str);
        }
-#line 6234 "util/configparser.c"
+#line 6235 "util/configparser.c"
     break;
 
   case 567:
-#line 2995 "./util/configparser.y"
+#line 2996 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6243,11 +6244,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6247 "util/configparser.c"
+#line 6248 "util/configparser.c"
     break;
 
   case 568:
-#line 3005 "./util/configparser.y"
+#line 3006 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6256,11 +6257,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6260 "util/configparser.c"
+#line 6261 "util/configparser.c"
     break;
 
   case 569:
-#line 3015 "./util/configparser.y"
+#line 3016 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6269,11 +6270,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6273 "util/configparser.c"
+#line 6274 "util/configparser.c"
     break;
 
   case 570:
-#line 3025 "./util/configparser.y"
+#line 3026 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6282,11 +6283,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6286 "util/configparser.c"
+#line 6287 "util/configparser.c"
     break;
 
   case 571:
-#line 3035 "./util/configparser.y"
+#line 3036 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6295,11 +6296,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6299 "util/configparser.c"
+#line 6300 "util/configparser.c"
     break;
 
   case 572:
-#line 3045 "./util/configparser.y"
+#line 3046 "./util/configparser.y"
     {
                OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6308,47 +6309,47 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6312 "util/configparser.c"
+#line 6313 "util/configparser.c"
     break;
 
   case 573:
-#line 3055 "./util/configparser.y"
+#line 3056 "./util/configparser.y"
     { 
                OUTYY(("\nP(python:)\n")); 
        }
-#line 6320 "util/configparser.c"
+#line 6321 "util/configparser.c"
     break;
 
   case 577:
-#line 3064 "./util/configparser.y"
+#line 3065 "./util/configparser.y"
     {
                OUTYY(("P(python-script:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_append_ex(&cfg_parser->cfg->python_script, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 6330 "util/configparser.c"
+#line 6331 "util/configparser.c"
     break;
 
   case 578:
-#line 3070 "./util/configparser.y"
+#line 3071 "./util/configparser.y"
     { 
                OUTYY(("\nP(dynlib:)\n")); 
        }
-#line 6338 "util/configparser.c"
+#line 6339 "util/configparser.c"
     break;
 
   case 582:
-#line 3079 "./util/configparser.y"
+#line 3080 "./util/configparser.y"
     {
                OUTYY(("P(dynlib-file:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_append_ex(&cfg_parser->cfg->dynlib_file, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 6348 "util/configparser.c"
+#line 6349 "util/configparser.c"
     break;
 
   case 583:
-#line 3085 "./util/configparser.y"
+#line 3086 "./util/configparser.y"
     {
                OUTYY(("P(disable_dnssec_lame_check:%s)\n", (yyvsp[0].str)));
                if (strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6357,21 +6358,21 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6361 "util/configparser.c"
+#line 6362 "util/configparser.c"
     break;
 
   case 584:
-#line 3095 "./util/configparser.y"
+#line 3096 "./util/configparser.y"
     {
                OUTYY(("P(server_log_identity:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->log_identity);
                cfg_parser->cfg->log_identity = (yyvsp[0].str);
        }
-#line 6371 "util/configparser.c"
+#line 6372 "util/configparser.c"
     break;
 
   case 585:
-#line 3102 "./util/configparser.y"
+#line 3103 "./util/configparser.y"
     {
                OUTYY(("P(server_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                validate_respip_action((yyvsp[0].str));
@@ -6379,30 +6380,30 @@ yyreduce:
                        (yyvsp[-1].str), (yyvsp[0].str)))
                        fatal_exit("out of memory adding response-ip");
        }
-#line 6383 "util/configparser.c"
+#line 6384 "util/configparser.c"
     break;
 
   case 586:
-#line 3111 "./util/configparser.y"
+#line 3112 "./util/configparser.y"
     {
                OUTYY(("P(server_response_ip_data:%s)\n", (yyvsp[-1].str)));
                if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data,
                        (yyvsp[-1].str), (yyvsp[0].str)))
                        fatal_exit("out of memory adding response-ip-data");
        }
-#line 6394 "util/configparser.c"
+#line 6395 "util/configparser.c"
     break;
 
   case 587:
-#line 3119 "./util/configparser.y"
+#line 3120 "./util/configparser.y"
     {
                OUTYY(("\nP(dnscrypt:)\n"));
        }
-#line 6402 "util/configparser.c"
+#line 6403 "util/configparser.c"
     break;
 
   case 600:
-#line 3135 "./util/configparser.y"
+#line 3136 "./util/configparser.y"
     {
                OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6410,11 +6411,11 @@ yyreduce:
                else cfg_parser->cfg->dnscrypt = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 6414 "util/configparser.c"
+#line 6415 "util/configparser.c"
     break;
 
   case 601:
-#line 3145 "./util/configparser.y"
+#line 3146 "./util/configparser.y"
     {
                OUTYY(("P(dnsc_dnscrypt_port:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -6422,21 +6423,21 @@ yyreduce:
                else cfg_parser->cfg->dnscrypt_port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 6426 "util/configparser.c"
+#line 6427 "util/configparser.c"
     break;
 
   case 602:
-#line 3154 "./util/configparser.y"
+#line 3155 "./util/configparser.y"
     {
                OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnscrypt_provider);
                cfg_parser->cfg->dnscrypt_provider = (yyvsp[0].str);
        }
-#line 6436 "util/configparser.c"
+#line 6437 "util/configparser.c"
     break;
 
   case 603:
-#line 3161 "./util/configparser.y"
+#line 3162 "./util/configparser.y"
     {
                OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", (yyvsp[0].str)));
                if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str)))
@@ -6444,21 +6445,21 @@ yyreduce:
                if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str)))
                        fatal_exit("out of memory adding dnscrypt-provider-cert");
        }
-#line 6448 "util/configparser.c"
+#line 6449 "util/configparser.c"
     break;
 
   case 604:
-#line 3170 "./util/configparser.y"
+#line 3171 "./util/configparser.y"
     {
                OUTYY(("P(dnsc_dnscrypt_provider_cert_rotated:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert_rotated, (yyvsp[0].str)))
                        fatal_exit("out of memory adding dnscrypt-provider-cert-rotated");
        }
-#line 6458 "util/configparser.c"
+#line 6459 "util/configparser.c"
     break;
 
   case 605:
-#line 3177 "./util/configparser.y"
+#line 3178 "./util/configparser.y"
     {
                OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", (yyvsp[0].str)));
                if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str)))
@@ -6466,22 +6467,22 @@ yyreduce:
                if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str)))
                        fatal_exit("out of memory adding dnscrypt-secret-key");
        }
-#line 6470 "util/configparser.c"
+#line 6471 "util/configparser.c"
     break;
 
   case 606:
-#line 3186 "./util/configparser.y"
+#line 3187 "./util/configparser.y"
     {
        OUTYY(("P(dnscrypt_shared_secret_cache_size:%s)\n", (yyvsp[0].str)));
        if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_shared_secret_cache_size))
                yyerror("memory size expected");
        free((yyvsp[0].str));
   }
-#line 6481 "util/configparser.c"
+#line 6482 "util/configparser.c"
     break;
 
   case 607:
-#line 3194 "./util/configparser.y"
+#line 3195 "./util/configparser.y"
     {
        OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", (yyvsp[0].str)));
        if(atoi((yyvsp[0].str)) == 0)
@@ -6493,22 +6494,22 @@ yyreduce:
        }
        free((yyvsp[0].str));
   }
-#line 6497 "util/configparser.c"
+#line 6498 "util/configparser.c"
     break;
 
   case 608:
-#line 3207 "./util/configparser.y"
+#line 3208 "./util/configparser.y"
     {
        OUTYY(("P(dnscrypt_nonce_cache_size:%s)\n", (yyvsp[0].str)));
        if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_nonce_cache_size))
                yyerror("memory size expected");
        free((yyvsp[0].str));
   }
-#line 6508 "util/configparser.c"
+#line 6509 "util/configparser.c"
     break;
 
   case 609:
-#line 3215 "./util/configparser.y"
+#line 3216 "./util/configparser.y"
     {
        OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", (yyvsp[0].str)));
        if(atoi((yyvsp[0].str)) == 0)
@@ -6520,19 +6521,19 @@ yyreduce:
        }
        free((yyvsp[0].str));
   }
-#line 6524 "util/configparser.c"
+#line 6525 "util/configparser.c"
     break;
 
   case 610:
-#line 3228 "./util/configparser.y"
+#line 3229 "./util/configparser.y"
     {
                OUTYY(("\nP(cachedb:)\n"));
        }
-#line 6532 "util/configparser.c"
+#line 6533 "util/configparser.c"
     break;
 
   case 619:
-#line 3239 "./util/configparser.y"
+#line 3240 "./util/configparser.y"
     {
        #ifdef USE_CACHEDB
                OUTYY(("P(backend:%s)\n", (yyvsp[0].str)));
@@ -6543,11 +6544,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 6547 "util/configparser.c"
+#line 6548 "util/configparser.c"
     break;
 
   case 620:
-#line 3251 "./util/configparser.y"
+#line 3252 "./util/configparser.y"
     {
        #ifdef USE_CACHEDB
                OUTYY(("P(secret-seed:%s)\n", (yyvsp[0].str)));
@@ -6558,11 +6559,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 6562 "util/configparser.c"
+#line 6563 "util/configparser.c"
     break;
 
   case 621:
-#line 3263 "./util/configparser.y"
+#line 3264 "./util/configparser.y"
     {
        #if defined(USE_CACHEDB) && defined(USE_REDIS)
                OUTYY(("P(redis_server_host:%s)\n", (yyvsp[0].str)));
@@ -6573,11 +6574,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 6577 "util/configparser.c"
+#line 6578 "util/configparser.c"
     break;
 
   case 622:
-#line 3275 "./util/configparser.y"
+#line 3276 "./util/configparser.y"
     {
        #if defined(USE_CACHEDB) && defined(USE_REDIS)
                int port;
@@ -6591,11 +6592,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 6595 "util/configparser.c"
+#line 6596 "util/configparser.c"
     break;
 
   case 623:
-#line 3290 "./util/configparser.y"
+#line 3291 "./util/configparser.y"
     {
        #if defined(USE_CACHEDB) && defined(USE_REDIS)
                OUTYY(("P(redis_timeout:%s)\n", (yyvsp[0].str)));
@@ -6607,11 +6608,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 6611 "util/configparser.c"
+#line 6612 "util/configparser.c"
     break;
 
   case 624:
-#line 3303 "./util/configparser.y"
+#line 3304 "./util/configparser.y"
     {
        #if defined(USE_CACHEDB) && defined(USE_REDIS)
                OUTYY(("P(redis_expire_records:%s)\n", (yyvsp[0].str)));
@@ -6623,11 +6624,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 6627 "util/configparser.c"
+#line 6628 "util/configparser.c"
     break;
 
   case 625:
-#line 3316 "./util/configparser.y"
+#line 3317 "./util/configparser.y"
     {
                OUTYY(("P(server_tcp_connection_limit:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if (atoi((yyvsp[0].str)) < 0)
@@ -6637,19 +6638,19 @@ yyreduce:
                                fatal_exit("out of memory adding tcp connection limit");
                }
        }
-#line 6641 "util/configparser.c"
+#line 6642 "util/configparser.c"
     break;
 
   case 626:
-#line 3327 "./util/configparser.y"
+#line 3328 "./util/configparser.y"
     {
                        OUTYY(("\nP(ipset:)\n"));
                }
-#line 6649 "util/configparser.c"
+#line 6650 "util/configparser.c"
     break;
 
   case 631:
-#line 3336 "./util/configparser.y"
+#line 3337 "./util/configparser.y"
     {
                #ifdef USE_IPSET
                        OUTYY(("P(name-v4:%s)\n", (yyvsp[0].str)));
@@ -6663,11 +6664,11 @@ yyreduce:
                        free((yyvsp[0].str));
                #endif
                }
-#line 6667 "util/configparser.c"
+#line 6668 "util/configparser.c"
     break;
 
   case 632:
-#line 3351 "./util/configparser.y"
+#line 3352 "./util/configparser.y"
     {
                #ifdef USE_IPSET
                        OUTYY(("P(name-v6:%s)\n", (yyvsp[0].str)));
@@ -6681,11 +6682,11 @@ yyreduce:
                        free((yyvsp[0].str));
                #endif
                }
-#line 6685 "util/configparser.c"
+#line 6686 "util/configparser.c"
     break;
 
 
-#line 6689 "util/configparser.c"
+#line 6690 "util/configparser.c"
 
       default: break;
     }
@@ -6917,7 +6918,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 3365 "./util/configparser.y"
+#line 3366 "./util/configparser.y"
 
 
 /* parse helper routines could be here */
index 4d6b5e3fba312471ce579276d1ee0ede9b6ae524..cc965a4770f3eec31e746522b7370c5ce50ff270 100644 (file)
@@ -2030,6 +2030,7 @@ server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
                   && strcmp($3, "always_transparent")!=0
                   && strcmp($3, "always_refuse")!=0
                   && strcmp($3, "always_nxdomain")!=0
+                  && strcmp($3, "always_null")!=0
                   && strcmp($3, "noview")!=0
                   && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0
                   && strcmp($3, "inform_redirect") != 0
@@ -2038,8 +2039,8 @@ server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
                                "refuse, redirect, transparent, "
                                "typetransparent, inform, inform_deny, "
                                "inform_redirect, always_transparent, "
-                               "always_refuse, always_nxdomain, noview "
-                               ", nodefault or ipset");
+                               "always_refuse, always_nxdomain, always_null, "
+                               "noview, nodefault or ipset");
                        free($2);
                        free($3);
                } else if(strcmp($3, "nodefault")==0) {