diff --git a/doc/Changelog b/doc/Changelog index 58a5bf69e..2cd7baf00 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -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. diff --git a/doc/example.conf.in b/doc/example.conf.in index 9269461cf..c3c7c0f26 100644 --- a/doc/example.conf.in +++ b/doc/example.conf.in @@ -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 diff --git a/doc/unbound.conf.5.in b/doc/unbound.conf.5.in index fa6f91b7c..4eeb41bf9 100644 --- a/doc/unbound.conf.5.in +++ b/doc/unbound.conf.5.in @@ -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 diff --git a/services/localzone.c b/services/localzone.c index c7ae95888..ed0d2c565 100644 --- a/services/localzone.c +++ b/services/localzone.c @@ -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) diff --git a/services/localzone.h b/services/localzone.h index bb3593936..492629936 100644 --- a/services/localzone.h +++ b/services/localzone.h @@ -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 */ diff --git a/testdata/localdata.rpl b/testdata/localdata.rpl index a2e7eeba2..eb25ef573 100644 --- a/testdata/localdata.rpl +++ b/testdata/localdata.rpl @@ -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 diff --git a/util/configparser.c b/util/configparser.c index 4e5bf5a41..cc5d9fb5e 100644 --- a/util/configparser.c +++ b/util/configparser.c @@ -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 */ diff --git a/util/configparser.y b/util/configparser.y index 4d6b5e3fb..cc965a477 100644 --- a/util/configparser.y +++ b/util/configparser.y @@ -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) {