]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Patch for view functionality for local-data-ptr from Björn Ketelaars.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 17 Mar 2017 08:01:40 +0000 (08:01 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 17 Mar 2017 08:01:40 +0000 (08:01 +0000)
git-svn-id: file:///svn/unbound/trunk@4063 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
doc/example.conf.in
doc/unbound.conf.5.in
util/configparser.c
util/configparser.y

index 7277d6e592ca7d21e98957609341760200eaeff0..d340cb1fa085fd1595417dab68728bd7528390fc 100644 (file)
@@ -1,3 +1,6 @@
+17 March 2017: Wouter
+       - Patch for view functionality for local-data-ptr from Björn Ketelaars.
+
 16 March 2017: Wouter
        - Fix that SHM is not inited if not enabled.
        - Add trustanchor.unbound CH TXT that gets a response with a number
index ff2c5894494030d591a1c97e5dda5253e9f290af..e43713a583b4cf540e01d400a96af4aed43ac3bd 100644 (file)
@@ -782,6 +782,7 @@ remote-control:
 #      name: "viewname"
 #      local-zone: "example.com" redirect
 #      local-data: "example.com A 192.0.2.3"
+#      local-data-ptr: "192.0.2.3 www.example.com"
 #      view-first: no
 # view:
 #      name: "anotherview"
index c0e910a094e259500030dc9e40bcd1abdfd99419..10fcf4a8f0f613f237022766f2d6a5aa22d54ffd 100644 (file)
@@ -1406,6 +1406,10 @@ global local\-zone elements.
 View specific local\-data elements. Has the same behaviour as the global
 local\-data elements.
 .TP
+.B local\-data\-ptr: \fI"IPaddr name"
+View specific local\-data\-ptr elements. Has the same behaviour as the global
+local\-data\-ptr elements.
+.TP
 .B view\-first: \fI<yes or no>
 If enabled, it attempts to use the global local\-zone and local\-data if there
 is no match in the view specific options.
index d40b824d19cf3970f3e29d727f33dea9ccdf7e6c..489be47d63e48e08b1ad0b4c23e5744cc64867a1 100644 (file)
@@ -786,16 +786,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   398
+#define YYLAST   400
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  197
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  209
+#define YYNNTS  210
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  401
+#define YYNRULES  403
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  606
+#define YYNSTATES  609
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
@@ -879,29 +879,29 @@ static const yytype_uint16 yyrline[] =
      218,   219,   219,   219,   220,   220,   220,   221,   221,   221,
      222,   224,   236,   237,   238,   238,   238,   238,   238,   239,
      241,   253,   254,   255,   255,   255,   255,   256,   258,   272,
-     273,   274,   274,   274,   274,   275,   275,   277,   286,   295,
-     306,   315,   324,   333,   344,   353,   366,   381,   390,   399,
-     408,   417,   426,   435,   444,   453,   462,   471,   480,   489,
-     498,   507,   516,   523,   530,   539,   548,   557,   571,   580,
-     589,   598,   605,   612,   638,   646,   653,   660,   667,   674,
-     682,   690,   698,   705,   712,   721,   730,   739,   746,   753,
-     761,   769,   779,   789,   799,   812,   823,   831,   844,   853,
-     862,   871,   881,   891,   899,   912,   921,   929,   938,   946,
-     959,   968,   975,   985,   995,  1005,  1015,  1025,  1035,  1045,
-    1055,  1062,  1069,  1076,  1085,  1094,  1103,  1110,  1120,  1137,
-    1144,  1162,  1175,  1188,  1197,  1206,  1215,  1224,  1234,  1244,
-    1253,  1262,  1275,  1288,  1297,  1304,  1313,  1322,  1331,  1340,
-    1348,  1361,  1369,  1397,  1404,  1419,  1429,  1439,  1446,  1453,
-    1462,  1476,  1495,  1514,  1526,  1538,  1550,  1561,  1580,  1590,
-    1599,  1607,  1615,  1628,  1641,  1654,  1667,  1676,  1685,  1695,
-    1705,  1715,  1722,  1729,  1738,  1748,  1758,  1768,  1775,  1782,
-    1791,  1801,  1811,  1840,  1850,  1858,  1867,  1876,  1881,  1882,
-    1883,  1883,  1883,  1884,  1884,  1884,  1885,  1885,  1887,  1897,
-    1906,  1913,  1923,  1930,  1937,  1944,  1951,  1956,  1957,  1958,
-    1958,  1959,  1959,  1960,  1960,  1961,  1962,  1963,  1964,  1965,
-    1966,  1968,  1976,  1983,  1991,  1999,  2006,  2013,  2022,  2031,
-    2040,  2049,  2058,  2067,  2072,  2073,  2074,  2076,  2082,  2092,
-    2099,  2108
+     273,   274,   274,   274,   274,   275,   275,   275,   277,   286,
+     295,   306,   315,   324,   333,   344,   353,   366,   381,   390,
+     399,   408,   417,   426,   435,   444,   453,   462,   471,   480,
+     489,   498,   507,   516,   523,   530,   539,   548,   557,   571,
+     580,   589,   598,   605,   612,   638,   646,   653,   660,   667,
+     674,   682,   690,   698,   705,   712,   721,   730,   739,   746,
+     753,   761,   769,   779,   789,   799,   812,   823,   831,   844,
+     853,   862,   871,   881,   891,   899,   912,   921,   929,   938,
+     946,   959,   968,   975,   985,   995,  1005,  1015,  1025,  1035,
+    1045,  1055,  1062,  1069,  1076,  1085,  1094,  1103,  1110,  1120,
+    1137,  1144,  1162,  1175,  1188,  1197,  1206,  1215,  1224,  1234,
+    1244,  1253,  1262,  1275,  1288,  1297,  1304,  1313,  1322,  1331,
+    1340,  1348,  1361,  1369,  1397,  1404,  1419,  1429,  1439,  1446,
+    1453,  1462,  1476,  1495,  1514,  1526,  1538,  1550,  1561,  1580,
+    1590,  1599,  1607,  1615,  1628,  1641,  1654,  1667,  1676,  1685,
+    1695,  1705,  1715,  1722,  1729,  1738,  1748,  1758,  1768,  1775,
+    1782,  1791,  1801,  1811,  1840,  1850,  1858,  1867,  1882,  1891,
+    1896,  1897,  1898,  1898,  1898,  1899,  1899,  1899,  1900,  1900,
+    1902,  1912,  1921,  1928,  1938,  1945,  1952,  1959,  1966,  1971,
+    1972,  1973,  1973,  1974,  1974,  1975,  1975,  1976,  1977,  1978,
+    1979,  1980,  1981,  1983,  1991,  1998,  2006,  2014,  2021,  2028,
+    2037,  2046,  2055,  2064,  2073,  2082,  2087,  2088,  2089,  2091,
+    2097,  2107,  2114,  2123
 };
 #endif
 
@@ -1046,13 +1046,13 @@ static const char *const yytname[] =
   "forward_name", "forward_host", "forward_addr", "forward_first",
   "forward_ssl_upstream", "view_name", "view_local_zone",
   "view_response_ip", "view_response_ip_data", "view_local_data",
-  "view_first", "rcstart", "contents_rc", "content_rc",
-  "rc_control_enable", "rc_control_port", "rc_control_interface",
-  "rc_control_use_cert", "rc_server_key_file", "rc_server_cert_file",
-  "rc_control_key_file", "rc_control_cert_file", "dtstart", "contents_dt",
-  "content_dt", "dt_dnstap_enable", "dt_dnstap_socket_path",
-  "dt_dnstap_send_identity", "dt_dnstap_send_version",
-  "dt_dnstap_identity", "dt_dnstap_version",
+  "view_local_data_ptr", "view_first", "rcstart", "contents_rc",
+  "content_rc", "rc_control_enable", "rc_control_port",
+  "rc_control_interface", "rc_control_use_cert", "rc_server_key_file",
+  "rc_server_cert_file", "rc_control_key_file", "rc_control_cert_file",
+  "dtstart", "contents_dt", "content_dt", "dt_dnstap_enable",
+  "dt_dnstap_socket_path", "dt_dnstap_send_identity",
+  "dt_dnstap_send_version", "dt_dnstap_identity", "dt_dnstap_version",
   "dt_dnstap_log_resolver_query_messages",
   "dt_dnstap_log_resolver_response_messages",
   "dt_dnstap_log_client_query_messages",
@@ -1123,8 +1123,8 @@ static const yytype_int16 yypact[] =
      134,   136,   138,   167,   168,   169,   170,   174,   175,   218,
      219,   220,   221,   222,   224,   225,   226,   230,   234,   235,
      261,   262,   272,   273,   274,   275,   276,   277,   278,   279,
-     280,   281,   282,   283,   284,   313,   315,   324,   325,   326,
-     327,   328,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
+     280,   281,   282,   283,   313,   315,   324,   325,   326,   327,
+     328,   329,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
@@ -1139,35 +1139,35 @@ static const yytype_int16 yypact[] =
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
-     329,   330,   331,   332,   333,   334,  -132,  -132,  -132,  -132,
-    -132,  -132,  -132,   335,   336,   337,   338,   339,  -132,  -132,
-    -132,  -132,  -132,  -132,   340,   341,   344,   345,   346,   347,
-    -132,  -132,  -132,  -132,  -132,  -132,  -132,   348,   349,   350,
-     351,   352,   353,   354,   355,  -132,  -132,  -132,  -132,  -132,
-    -132,  -132,  -132,  -132,   356,   357,   358,   359,   360,   361,
-     362,   363,   364,   365,   366,   367,  -132,  -132,  -132,  -132,
-    -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,   368,
+     330,   331,   332,   333,   334,   335,  -132,  -132,  -132,  -132,
+    -132,  -132,  -132,   336,   337,   338,   339,   340,  -132,  -132,
+    -132,  -132,  -132,  -132,   341,   344,   345,   346,   347,   348,
+     349,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,   350,
+     351,   352,   353,   354,   355,   356,   357,  -132,  -132,  -132,
+    -132,  -132,  -132,  -132,  -132,  -132,   358,   359,   360,   361,
+     362,   363,   364,   365,   366,   367,   368,   369,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
+    -132,   370,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
-    -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,   369,   370,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
+     372,   373,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
-    -132,  -132,   372,   373,   374,  -132,  -132,  -132,  -132,  -132,
-    -132,  -132,  -132,  -132,   375,   376,  -132,  -132,  -132,  -132,
-    -132,  -132,  -132,  -132,  -132,   377,   378,   379,   380,   381,
-     382,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
+    -132,  -132,  -132,  -132,   374,   375,   376,  -132,  -132,  -132,
+    -132,  -132,  -132,  -132,  -132,  -132,   377,   378,  -132,  -132,
+    -132,  -132,  -132,  -132,  -132,  -132,  -132,   379,   380,   381,
+     382,   383,   384,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
-    -132,   383,  -132,   384,   385,  -132,  -132,  -132,  -132,  -132,
+    -132,  -132,  -132,   385,  -132,  -132,   386,   387,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
-    -132,  -132,  -132,  -132,  -132,  -132,   386,   387,   388,  -132,
-    -132,  -132,  -132,  -132,  -132,  -132
+    -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,   388,
+     389,   390,  -132,  -132,  -132,  -132,  -132,  -132,  -132
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -1175,8 +1175,8 @@ static const yytype_int16 yypact[] =
      means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       2,     0,     1,    11,   161,   170,   347,   393,   366,   178,
-       3,    13,   163,   172,   180,   349,   368,   395,     4,     5,
+       2,     0,     1,    11,   161,   170,   349,   395,   368,   178,
+       3,    13,   163,   172,   180,   351,   370,   397,     4,     5,
        6,    10,     8,     9,     7,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
@@ -1210,32 +1210,32 @@ static const yytype_uint16 yydefact[] =
        0,     0,     0,     0,     0,     0,   162,   164,   165,   166,
      168,   169,   167,     0,     0,     0,     0,     0,   171,   173,
      174,   175,   176,   177,     0,     0,     0,     0,     0,     0,
-     179,   181,   182,   185,   186,   183,   184,     0,     0,     0,
-       0,     0,     0,     0,     0,   348,   350,   352,   351,   357,
-     353,   354,   355,   356,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   367,   369,   370,   371,
-     372,   373,   374,   375,   376,   377,   378,   379,   380,     0,
-     394,   396,   188,   187,   194,   197,   195,   203,   204,   207,
-     205,   206,   208,   209,   221,   222,   223,   224,   225,   246,
-     247,   248,   253,   254,   200,   255,   256,   259,   257,   258,
-     261,   262,   263,   276,   234,   235,   237,   238,   264,   279,
-     230,   232,   280,   286,   287,   288,   201,   245,   299,   300,
-     231,   294,   217,   196,   226,   277,   283,   265,     0,     0,
-     303,   202,   189,   216,   269,   190,   198,   199,   227,   228,
-     301,   267,   271,   272,   191,   304,   249,   275,   218,   233,
-     281,   282,   285,   293,   229,   297,   295,   296,   239,   244,
-     273,   274,   240,   241,   266,   289,   219,   220,   210,   211,
-     212,   213,   214,   305,   306,   307,   250,   251,   252,   260,
-     308,   309,     0,     0,     0,   268,   242,   398,   318,   322,
-     320,   319,   323,   321,     0,     0,   326,   327,   270,   284,
-     298,   328,   329,   243,   310,     0,     0,     0,     0,     0,
-       0,   290,   291,   292,   399,   236,   215,   192,   193,   330,
-     331,   332,   335,   334,   333,   336,   337,   338,   339,   340,
-     341,     0,   345,     0,     0,   346,   358,   360,   359,   362,
-     363,   364,   365,   361,   381,   382,   383,   384,   385,   386,
-     387,   388,   389,   390,   391,   392,   397,   278,   302,   317,
-     400,   401,   324,   325,   311,   312,     0,     0,     0,   316,
-     342,   343,   344,   315,   313,   314
+       0,   179,   181,   182,   185,   186,   183,   187,   184,     0,
+       0,     0,     0,     0,     0,     0,     0,   350,   352,   354,
+     353,   359,   355,   356,   357,   358,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   369,   371,
+     372,   373,   374,   375,   376,   377,   378,   379,   380,   381,
+     382,     0,   396,   398,   189,   188,   195,   198,   196,   204,
+     205,   208,   206,   207,   209,   210,   222,   223,   224,   225,
+     226,   247,   248,   249,   254,   255,   201,   256,   257,   260,
+     258,   259,   262,   263,   264,   277,   235,   236,   238,   239,
+     265,   280,   231,   233,   281,   287,   288,   289,   202,   246,
+     300,   301,   232,   295,   218,   197,   227,   278,   284,   266,
+       0,     0,   304,   203,   190,   217,   270,   191,   199,   200,
+     228,   229,   302,   268,   272,   273,   192,   305,   250,   276,
+     219,   234,   282,   283,   286,   294,   230,   298,   296,   297,
+     240,   245,   274,   275,   241,   242,   267,   290,   220,   221,
+     211,   212,   213,   214,   215,   306,   307,   308,   251,   252,
+     253,   261,   309,   310,     0,     0,     0,   269,   243,   400,
+     319,   323,   321,   320,   324,   322,     0,     0,   327,   328,
+     271,   285,   299,   329,   330,   244,   311,     0,     0,     0,
+       0,     0,     0,   291,   292,   293,   401,   237,   216,   193,
+     194,   331,   332,   333,   336,   335,   334,   337,   338,   339,
+     340,   341,   342,     0,   346,   347,     0,     0,   348,   360,
+     362,   361,   364,   365,   366,   367,   363,   383,   384,   385,
+     386,   387,   388,   389,   390,   391,   392,   393,   394,   399,
+     279,   303,   318,   402,   403,   325,   326,   312,   313,     0,
+       0,     0,   317,   343,   344,   345,   316,   314,   315
 };
 
   /* YYPGOTO[NTERM-NUM].  */
@@ -1261,14 +1261,14 @@ static const yytype_int16 yypgoto[] =
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
     -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,
-    -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132
+    -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132,  -132
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
       -1,     1,    10,    11,    18,   172,    12,    19,   326,    13,
-      20,   338,    14,    21,   350,   173,   174,   175,   176,   177,
+      20,   338,    14,    21,   351,   173,   174,   175,   176,   177,
      178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
      188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
      198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
@@ -1283,11 +1283,11 @@ static const yytype_int16 yydefgoto[] =
      288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
      298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
      308,   309,   310,   311,   312,   313,   314,   315,   327,   328,
-     329,   330,   331,   332,   339,   340,   341,   342,   343,   351,
-     352,   353,   354,   355,   356,    15,    22,   365,   366,   367,
-     368,   369,   370,   371,   372,   373,    16,    23,   386,   387,
-     388,   389,   390,   391,   392,   393,   394,   395,   396,   397,
-     398,    17,    24,   400,   401,   316,   317,   318,   319
+     329,   330,   331,   332,   339,   340,   341,   342,   343,   352,
+     353,   354,   355,   356,   357,   358,    15,    22,   367,   368,
+     369,   370,   371,   372,   373,   374,   375,    16,    23,   388,
+     389,   390,   391,   392,   393,   394,   395,   396,   397,   398,
+     399,   400,    17,    24,   402,   403,   316,   317,   318,   319
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -1295,46 +1295,47 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_uint16 yytable[] =
 {
-       2,   320,   399,   321,   322,   333,   402,   403,   404,   405,
-       0,     3,   406,   334,   335,   374,   375,   376,   377,   378,
-     379,   380,   381,   382,   383,   384,   385,   357,   358,   359,
-     360,   361,   362,   363,   364,   407,   408,   409,   410,   411,
-     412,     4,   413,   414,   415,   416,   417,     5,   418,   419,
-     420,   421,   422,   423,   424,   425,   426,   427,   428,   429,
-     430,   431,   432,   433,   323,   434,   435,   436,   437,   438,
-     439,   440,   441,   442,   443,   444,   445,   446,   447,   448,
-     449,   450,   451,   452,   453,   454,   455,   456,   457,   458,
-     459,     6,   460,   461,   324,   462,   325,   336,   463,   337,
-     464,   465,   466,   467,   468,   469,   470,     7,   471,   472,
-     473,   474,   475,   476,   477,   478,   479,   480,   481,   482,
-     483,   484,   485,   486,   487,   488,   489,   490,   491,   492,
-     493,   494,   495,   496,   497,   498,   499,   500,   501,   502,
-     503,   504,   505,   506,   507,     8,   508,     0,   509,    25,
+       2,   320,   401,   321,   322,   333,   404,   405,   406,   407,
+       0,     3,   408,   334,   335,   376,   377,   378,   379,   380,
+     381,   382,   383,   384,   385,   386,   387,   359,   360,   361,
+     362,   363,   364,   365,   366,   409,   410,   411,   412,   413,
+     414,     4,   415,   416,   417,   418,   419,     5,   420,   421,
+     422,   423,   424,   425,   426,   427,   428,   429,   430,   431,
+     432,   433,   434,   435,   323,   436,   437,   438,   439,   440,
+     441,   442,   443,   444,   445,   446,   447,   448,   449,   450,
+     451,   452,   453,   454,   455,   456,   457,   458,   459,   460,
+     461,     6,   462,   463,   324,   464,   325,   336,   465,   337,
+     466,   467,   468,   469,   470,   471,   472,     7,   473,   474,
+     475,   476,   477,   478,   479,   480,   481,   482,   483,   484,
+     485,   486,   487,   488,   489,   490,   491,   492,   493,   494,
+     495,   496,   497,   498,   499,   500,   501,   502,   503,   504,
+     505,   506,   507,   508,   509,     8,   510,     0,   511,    25,
       26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
       36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,   510,   511,   512,
-     513,    53,    54,    55,   514,   515,     9,    56,    57,    58,
+      46,    47,    48,    49,    50,    51,    52,   512,   513,   514,
+     515,    53,    54,    55,   516,   517,     9,    56,    57,    58,
       59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
       69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
       79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,   516,   517,
-     518,   519,   520,   344,   521,   522,   523,    97,    98,    99,
-     524,   100,   101,   102,   525,   526,   103,   104,   105,   106,
+      89,    90,    91,    92,    93,    94,    95,    96,   518,   519,
+     520,   521,   522,   344,   523,   524,   525,    97,    98,    99,
+     526,   100,   101,   102,   527,   528,   103,   104,   105,   106,
      107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
      117,   118,   119,   120,   121,   122,   123,   124,   125,   345,
-     346,   527,   528,   126,   127,   128,   129,   130,   131,   132,
-     133,   134,   529,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   135,   136,   137,   138,   139,
+     346,   529,   530,   126,   127,   128,   129,   130,   131,   132,
+     133,   134,   531,   532,   533,   534,   535,   536,   537,   538,
+     539,   540,   541,   542,   347,   135,   136,   137,   138,   139,
      140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
      150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
-     160,   161,   162,   542,   163,   543,   164,   165,   166,   167,
-     168,   169,   170,   171,   544,   545,   546,   547,   548,   549,
-     550,   551,   552,   553,   554,   555,   556,   557,   558,   559,
-     560,   561,   347,   348,   562,   563,   564,   565,   566,   567,
-     568,   569,   570,   571,   572,   573,   574,   575,   576,   577,
-     578,   579,   580,   581,   582,   583,   584,   585,   586,   587,
-     588,   349,   589,   590,   591,   592,   593,   594,   595,   596,
-     597,   598,   599,   600,   601,   602,   603,   604,   605
+     160,   161,   162,   543,   163,   544,   164,   165,   166,   167,
+     168,   169,   170,   171,   545,   546,   547,   548,   549,   550,
+     551,   552,   553,   554,   555,   556,   557,   558,   559,   560,
+     561,   562,   348,   349,   563,   564,   565,   566,   567,   568,
+     569,   570,   571,   572,   573,   574,   575,   576,   577,   578,
+     579,   580,   581,   582,   583,   584,   585,   586,   587,   588,
+     589,   350,   590,   591,   592,   593,   594,   595,   596,   597,
+     598,   599,   600,   601,   602,   603,   604,   605,   606,   607,
+     608
 };
 
 static const yytype_int16 yycheck[] =
@@ -1368,7 +1369,7 @@ static const yytype_int16 yycheck[] =
      123,   124,   125,   126,   127,   128,   129,   130,   131,    76,
       77,    10,    10,   136,   137,   138,   139,   140,   141,   142,
      143,   144,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,    10,    10,    10,   158,   159,   160,   161,   162,
+      10,    10,    10,    10,   101,   158,   159,   160,   161,   162,
      163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
      173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
      183,   184,   185,    10,   187,    10,   189,   190,   191,   192,
@@ -1378,7 +1379,8 @@ static const yytype_int16 yycheck[] =
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,   188,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,    10,    10,    10,    10,    10,    10,    10
+      10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
+      10
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1386,8 +1388,8 @@ static const yytype_int16 yycheck[] =
 static const yytype_uint16 yystos[] =
 {
        0,   198,     0,    11,    41,    47,    91,   107,   145,   186,
-     199,   200,   203,   206,   209,   372,   383,   398,   201,   204,
-     207,   210,   373,   384,   399,    12,    13,    14,    15,    16,
+     199,   200,   203,   206,   209,   373,   384,   399,   201,   204,
+     207,   210,   374,   385,   400,    12,    13,    14,    15,    16,
       17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
       27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
       37,    38,    39,    44,    45,    46,    50,    51,    52,    53,
@@ -1416,16 +1418,16 @@ static const yytype_uint16 yystos[] =
      319,   320,   321,   322,   323,   324,   325,   326,   327,   328,
      329,   330,   331,   332,   333,   334,   335,   336,   337,   338,
      339,   340,   341,   342,   343,   344,   345,   346,   347,   348,
-     349,   350,   351,   352,   353,   354,   402,   403,   404,   405,
+     349,   350,   351,   352,   353,   354,   403,   404,   405,   406,
       40,    42,    43,   103,   133,   135,   205,   355,   356,   357,
      358,   359,   360,    40,    48,    49,   132,   134,   208,   361,
-     362,   363,   364,   365,    40,    76,    77,   159,   160,   188,
-     211,   366,   367,   368,   369,   370,   371,    92,    93,    94,
-      95,    96,    97,    98,    99,   374,   375,   376,   377,   378,
-     379,   380,   381,   382,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   385,   386,   387,   388,
-     389,   390,   391,   392,   393,   394,   395,   396,   397,   108,
-     400,   401,    10,    10,    10,    10,    10,    10,    10,    10,
+     362,   363,   364,   365,    40,    76,    77,   101,   159,   160,
+     188,   211,   366,   367,   368,   369,   370,   371,   372,    92,
+      93,    94,    95,    96,    97,    98,    99,   375,   376,   377,
+     378,   379,   380,   381,   382,   383,   146,   147,   148,   149,
+     150,   151,   152,   153,   154,   155,   156,   157,   386,   387,
+     388,   389,   390,   391,   392,   393,   394,   395,   396,   397,
+     398,   108,   401,   402,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
@@ -1445,7 +1447,7 @@ static const yytype_uint16 yystos[] =
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,    10,    10,    10,    10
+      10,    10,    10,    10,    10,    10,    10,    10,    10
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
@@ -1469,29 +1471,29 @@ static const yytype_uint16 yyr1[] =
      202,   202,   202,   202,   202,   202,   202,   202,   202,   202,
      202,   203,   204,   204,   205,   205,   205,   205,   205,   205,
      206,   207,   207,   208,   208,   208,   208,   208,   209,   210,
-     210,   211,   211,   211,   211,   211,   211,   212,   213,   214,
-     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
-     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
-     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
-     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
-     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
-     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
-     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
-     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
-     335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
-     345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
-     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
-     365,   366,   367,   368,   369,   370,   371,   372,   373,   373,
-     374,   374,   374,   374,   374,   374,   374,   374,   375,   376,
-     377,   378,   379,   380,   381,   382,   383,   384,   384,   385,
-     385,   385,   385,   385,   385,   385,   385,   385,   385,   385,
-     385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
-     395,   396,   397,   398,   399,   399,   400,   401,   402,   403,
-     404,   405
+     210,   211,   211,   211,   211,   211,   211,   211,   212,   213,
+     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
+     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
+     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
+     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
+     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,
+     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,
+     334,   335,   336,   337,   338,   339,   340,   341,   342,   343,
+     344,   345,   346,   347,   348,   349,   350,   351,   352,   353,
+     354,   355,   356,   357,   358,   359,   360,   361,   362,   363,
+     364,   365,   366,   367,   368,   369,   370,   371,   372,   373,
+     374,   374,   375,   375,   375,   375,   375,   375,   375,   375,
+     376,   377,   378,   379,   380,   381,   382,   383,   384,   385,
+     385,   386,   386,   386,   386,   386,   386,   386,   386,   386,
+     386,   386,   386,   387,   388,   389,   390,   391,   392,   393,
+     394,   395,   396,   397,   398,   399,   400,   400,   401,   402,
+     403,   404,   405,   406
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -1515,7 +1517,7 @@ static const yytype_uint8 yyr2[] =
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     2,     0,     1,     1,     1,     1,     1,     1,
        1,     2,     0,     1,     1,     1,     1,     1,     1,     2,
-       0,     1,     1,     1,     1,     1,     1,     2,     2,     2,
+       0,     1,     1,     1,     1,     1,     1,     1,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -1524,20 +1526,20 @@ static const yytype_uint8 yyr2[] =
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     3,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     3,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     3,     2,     2,     2,     2,     2,     2,     2,
-       2,     3,     3,     4,     4,     4,     3,     3,     2,     2,
-       2,     2,     2,     2,     3,     3,     2,     2,     2,     2,
+       2,     2,     2,     3,     2,     2,     2,     2,     2,     2,
+       2,     2,     3,     3,     4,     4,     4,     3,     3,     2,
+       2,     2,     2,     2,     2,     3,     3,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     3,     3,     3,     2,     2,     1,     2,     0,
-       1,     1,     1,     1,     1,     1,     1,     1,     2,     2,
-       2,     2,     2,     2,     2,     2,     1,     2,     0,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     1,     2,     0,     1,     2,     2,     2,
-       3,     3
+       2,     2,     2,     3,     3,     3,     2,     2,     2,     1,
+       2,     0,     1,     1,     1,     1,     1,     1,     1,     1,
+       2,     2,     2,     2,     2,     2,     2,     2,     1,     2,
+       0,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     1,     2,     0,     1,     2,
+       2,     2,     3,     3
 };
 
 
@@ -2218,7 +2220,7 @@ yyreduce:
     { 
                OUTYY(("\nP(server:)\n")); 
        }
-#line 2222 "util/configparser.c" /* yacc.c:1646  */
+#line 2224 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 161:
@@ -2233,7 +2235,7 @@ yyreduce:
                } else 
                        yyerror("out of memory");
        }
-#line 2237 "util/configparser.c" /* yacc.c:1646  */
+#line 2239 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 170:
@@ -2248,7 +2250,7 @@ yyreduce:
                } else 
                        yyerror("out of memory");
        }
-#line 2252 "util/configparser.c" /* yacc.c:1646  */
+#line 2254 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 178:
@@ -2265,10 +2267,10 @@ yyreduce:
                } else 
                        yyerror("out of memory");
        }
-#line 2269 "util/configparser.c" /* yacc.c:1646  */
+#line 2271 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 187:
+  case 188:
 #line 278 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_num_threads:%s)\n", (yyvsp[0].str))); 
@@ -2277,10 +2279,10 @@ yyreduce:
                else cfg_parser->cfg->num_threads = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2281 "util/configparser.c" /* yacc.c:1646  */
+#line 2283 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 188:
+  case 189:
 #line 287 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_verbosity:%s)\n", (yyvsp[0].str))); 
@@ -2289,10 +2291,10 @@ yyreduce:
                else cfg_parser->cfg->verbosity = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2293 "util/configparser.c" /* yacc.c:1646  */
+#line 2295 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 189:
+  case 190:
 #line 296 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_statistics_interval:%s)\n", (yyvsp[0].str))); 
@@ -2303,10 +2305,10 @@ yyreduce:
                else cfg_parser->cfg->stat_interval = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2307 "util/configparser.c" /* yacc.c:1646  */
+#line 2309 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 190:
+  case 191:
 #line 307 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_statistics_cumulative:%s)\n", (yyvsp[0].str)));
@@ -2315,10 +2317,10 @@ yyreduce:
                else cfg_parser->cfg->stat_cumulative = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2319 "util/configparser.c" /* yacc.c:1646  */
+#line 2321 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 191:
+  case 192:
 #line 316 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_extended_statistics:%s)\n", (yyvsp[0].str)));
@@ -2327,10 +2329,10 @@ yyreduce:
                else cfg_parser->cfg->stat_extended = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2331 "util/configparser.c" /* yacc.c:1646  */
+#line 2333 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 192:
+  case 193:
 #line 325 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_shm_enable:%s)\n", (yyvsp[0].str)));
@@ -2339,10 +2341,10 @@ yyreduce:
                else cfg_parser->cfg->shm_enable = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2343 "util/configparser.c" /* yacc.c:1646  */
+#line 2345 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 193:
+  case 194:
 #line 334 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_shm_key:%s)\n", (yyvsp[0].str))); 
@@ -2353,10 +2355,10 @@ yyreduce:
                else cfg_parser->cfg->shm_key = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2357 "util/configparser.c" /* yacc.c:1646  */
+#line 2359 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 194:
+  case 195:
 #line 345 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_port:%s)\n", (yyvsp[0].str)));
@@ -2365,10 +2367,10 @@ yyreduce:
                else cfg_parser->cfg->port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2369 "util/configparser.c" /* yacc.c:1646  */
+#line 2371 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 195:
+  case 196:
 #line 354 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_interface:%s)\n", (yyvsp[0].str)));
@@ -2381,10 +2383,10 @@ yyreduce:
                else
                        cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = (yyvsp[0].str);
        }
-#line 2385 "util/configparser.c" /* yacc.c:1646  */
+#line 2387 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 196:
+  case 197:
 #line 367 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[0].str)));
@@ -2399,10 +2401,10 @@ yyreduce:
                        cfg_parser->cfg->out_ifs[
                                cfg_parser->cfg->num_out_ifs++] = (yyvsp[0].str);
        }
-#line 2403 "util/configparser.c" /* yacc.c:1646  */
+#line 2405 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 197:
+  case 198:
 #line 382 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[0].str)));
@@ -2411,10 +2413,10 @@ yyreduce:
                else cfg_parser->cfg->outgoing_num_ports = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2415 "util/configparser.c" /* yacc.c:1646  */
+#line 2417 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 198:
+  case 199:
 #line 391 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[0].str)));
@@ -2423,10 +2425,10 @@ yyreduce:
                        yyerror("port number or range (\"low-high\") expected");
                free((yyvsp[0].str));
        }
-#line 2427 "util/configparser.c" /* yacc.c:1646  */
+#line 2429 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 199:
+  case 200:
 #line 400 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[0].str)));
@@ -2435,10 +2437,10 @@ yyreduce:
                        yyerror("port number or range (\"low-high\") expected");
                free((yyvsp[0].str));
        }
-#line 2439 "util/configparser.c" /* yacc.c:1646  */
+#line 2441 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 200:
+  case 201:
 #line 409 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[0].str)));
@@ -2447,10 +2449,10 @@ yyreduce:
                else cfg_parser->cfg->outgoing_num_tcp = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2451 "util/configparser.c" /* yacc.c:1646  */
+#line 2453 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 201:
+  case 202:
 #line 418 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[0].str)));
@@ -2459,10 +2461,10 @@ yyreduce:
                else cfg_parser->cfg->incoming_num_tcp = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2463 "util/configparser.c" /* yacc.c:1646  */
+#line 2465 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 202:
+  case 203:
 #line 427 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_interface_automatic:%s)\n", (yyvsp[0].str)));
@@ -2471,10 +2473,10 @@ yyreduce:
                else cfg_parser->cfg->if_automatic = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2475 "util/configparser.c" /* yacc.c:1646  */
+#line 2477 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 203:
+  case 204:
 #line 436 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_ip4:%s)\n", (yyvsp[0].str)));
@@ -2483,10 +2485,10 @@ yyreduce:
                else cfg_parser->cfg->do_ip4 = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2487 "util/configparser.c" /* yacc.c:1646  */
+#line 2489 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 204:
+  case 205:
 #line 445 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_ip6:%s)\n", (yyvsp[0].str)));
@@ -2495,10 +2497,10 @@ yyreduce:
                else cfg_parser->cfg->do_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2499 "util/configparser.c" /* yacc.c:1646  */
+#line 2501 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 205:
+  case 206:
 #line 454 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_udp:%s)\n", (yyvsp[0].str)));
@@ -2507,10 +2509,10 @@ yyreduce:
                else cfg_parser->cfg->do_udp = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2511 "util/configparser.c" /* yacc.c:1646  */
+#line 2513 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 206:
+  case 207:
 #line 463 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_tcp:%s)\n", (yyvsp[0].str)));
@@ -2519,10 +2521,10 @@ yyreduce:
                else cfg_parser->cfg->do_tcp = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2523 "util/configparser.c" /* yacc.c:1646  */
+#line 2525 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 207:
+  case 208:
 #line 472 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_prefer_ip6:%s)\n", (yyvsp[0].str)));
@@ -2531,10 +2533,10 @@ yyreduce:
                else cfg_parser->cfg->prefer_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2535 "util/configparser.c" /* yacc.c:1646  */
+#line 2537 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 208:
+  case 209:
 #line 481 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tcp_mss:%s)\n", (yyvsp[0].str)));
@@ -2543,10 +2545,10 @@ yyreduce:
                 else cfg_parser->cfg->tcp_mss = atoi((yyvsp[0].str));
                 free((yyvsp[0].str));
        }
-#line 2547 "util/configparser.c" /* yacc.c:1646  */
+#line 2549 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 209:
+  case 210:
 #line 490 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_outgoing_tcp_mss:%s)\n", (yyvsp[0].str)));
@@ -2555,10 +2557,10 @@ yyreduce:
                else cfg_parser->cfg->outgoing_tcp_mss = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2559 "util/configparser.c" /* yacc.c:1646  */
+#line 2561 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 210:
+  case 211:
 #line 499 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tcp_upstream:%s)\n", (yyvsp[0].str)));
@@ -2567,10 +2569,10 @@ yyreduce:
                else cfg_parser->cfg->tcp_upstream = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2571 "util/configparser.c" /* yacc.c:1646  */
+#line 2573 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 211:
+  case 212:
 #line 508 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ssl_upstream:%s)\n", (yyvsp[0].str)));
@@ -2579,30 +2581,30 @@ yyreduce:
                else cfg_parser->cfg->ssl_upstream = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2583 "util/configparser.c" /* yacc.c:1646  */
+#line 2585 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 212:
+  case 213:
 #line 517 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ssl_service_key:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->ssl_service_key);
                cfg_parser->cfg->ssl_service_key = (yyvsp[0].str);
        }
-#line 2593 "util/configparser.c" /* yacc.c:1646  */
+#line 2595 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 213:
+  case 214:
 #line 524 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ssl_service_pem:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->ssl_service_pem);
                cfg_parser->cfg->ssl_service_pem = (yyvsp[0].str);
        }
-#line 2603 "util/configparser.c" /* yacc.c:1646  */
+#line 2605 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 214:
+  case 215:
 #line 531 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[0].str)));
@@ -2611,10 +2613,10 @@ yyreduce:
                else cfg_parser->cfg->ssl_port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2615 "util/configparser.c" /* yacc.c:1646  */
+#line 2617 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 215:
+  case 216:
 #line 540 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_use_systemd:%s)\n", (yyvsp[0].str)));
@@ -2623,10 +2625,10 @@ yyreduce:
                else cfg_parser->cfg->use_systemd = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2627 "util/configparser.c" /* yacc.c:1646  */
+#line 2629 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 216:
+  case 217:
 #line 549 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_daemonize:%s)\n", (yyvsp[0].str)));
@@ -2635,10 +2637,10 @@ yyreduce:
                else cfg_parser->cfg->do_daemonize = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2639 "util/configparser.c" /* yacc.c:1646  */
+#line 2641 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 217:
+  case 218:
 #line 558 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_use_syslog:%s)\n", (yyvsp[0].str)));
@@ -2652,10 +2654,10 @@ yyreduce:
 #endif
                free((yyvsp[0].str));
        }
-#line 2656 "util/configparser.c" /* yacc.c:1646  */
+#line 2658 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 218:
+  case 219:
 #line 572 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_log_time_ascii:%s)\n", (yyvsp[0].str)));
@@ -2664,10 +2666,10 @@ yyreduce:
                else cfg_parser->cfg->log_time_ascii = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2668 "util/configparser.c" /* yacc.c:1646  */
+#line 2670 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 219:
+  case 220:
 #line 581 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_log_queries:%s)\n", (yyvsp[0].str)));
@@ -2676,10 +2678,10 @@ yyreduce:
                else cfg_parser->cfg->log_queries = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2680 "util/configparser.c" /* yacc.c:1646  */
+#line 2682 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 220:
+  case 221:
 #line 590 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(server_log_replies:%s)\n", (yyvsp[0].str)));
@@ -2688,30 +2690,30 @@ yyreduce:
        else cfg_parser->cfg->log_replies = (strcmp((yyvsp[0].str), "yes")==0);
        free((yyvsp[0].str));
   }
-#line 2692 "util/configparser.c" /* yacc.c:1646  */
+#line 2694 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 221:
+  case 222:
 #line 599 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_chroot:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->chrootdir);
                cfg_parser->cfg->chrootdir = (yyvsp[0].str);
        }
-#line 2702 "util/configparser.c" /* yacc.c:1646  */
+#line 2704 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 222:
+  case 223:
 #line 606 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_username:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->username);
                cfg_parser->cfg->username = (yyvsp[0].str);
        }
-#line 2712 "util/configparser.c" /* yacc.c:1646  */
+#line 2714 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 223:
+  case 224:
 #line 613 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_directory:%s)\n", (yyvsp[0].str)));
@@ -2737,10 +2739,10 @@ yyreduce:
                        }
                }
        }
-#line 2741 "util/configparser.c" /* yacc.c:1646  */
+#line 2743 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 224:
+  case 225:
 #line 639 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_logfile:%s)\n", (yyvsp[0].str)));
@@ -2748,50 +2750,50 @@ yyreduce:
                cfg_parser->cfg->logfile = (yyvsp[0].str);
                cfg_parser->cfg->use_syslog = 0;
        }
-#line 2752 "util/configparser.c" /* yacc.c:1646  */
+#line 2754 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 225:
+  case 226:
 #line 647 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_pidfile:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->pidfile);
                cfg_parser->cfg->pidfile = (yyvsp[0].str);
        }
-#line 2762 "util/configparser.c" /* yacc.c:1646  */
+#line 2764 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 226:
+  case 227:
 #line 654 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_root_hints:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 2772 "util/configparser.c" /* yacc.c:1646  */
+#line 2774 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 227:
+  case 228:
 #line 661 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_dlv_anchor_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dlv_anchor_file);
                cfg_parser->cfg->dlv_anchor_file = (yyvsp[0].str);
        }
-#line 2782 "util/configparser.c" /* yacc.c:1646  */
+#line 2784 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 228:
+  case 229:
 #line 668 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_dlv_anchor:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->dlv_anchor_list, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 2792 "util/configparser.c" /* yacc.c:1646  */
+#line 2794 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 229:
+  case 230:
 #line 675 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_auto_trust_anchor_file:%s)\n", (yyvsp[0].str)));
@@ -2799,10 +2801,10 @@ yyreduce:
                        auto_trust_anchor_file_list, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 2803 "util/configparser.c" /* yacc.c:1646  */
+#line 2805 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 230:
+  case 231:
 #line 683 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[0].str)));
@@ -2810,10 +2812,10 @@ yyreduce:
                        trust_anchor_file_list, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 2814 "util/configparser.c" /* yacc.c:1646  */
+#line 2816 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 231:
+  case 232:
 #line 691 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[0].str)));
@@ -2821,30 +2823,30 @@ yyreduce:
                        trusted_keys_file_list, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 2825 "util/configparser.c" /* yacc.c:1646  */
+#line 2827 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 232:
+  case 233:
 #line 699 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_trust_anchor:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 2835 "util/configparser.c" /* yacc.c:1646  */
+#line 2837 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 233:
+  case 234:
 #line 706 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_domain_insecure:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 2845 "util/configparser.c" /* yacc.c:1646  */
+#line 2847 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 234:
+  case 235:
 #line 713 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_hide_identity:%s)\n", (yyvsp[0].str)));
@@ -2853,10 +2855,10 @@ yyreduce:
                else cfg_parser->cfg->hide_identity = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2857 "util/configparser.c" /* yacc.c:1646  */
+#line 2859 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 235:
+  case 236:
 #line 722 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_hide_version:%s)\n", (yyvsp[0].str)));
@@ -2865,10 +2867,10 @@ yyreduce:
                else cfg_parser->cfg->hide_version = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2869 "util/configparser.c" /* yacc.c:1646  */
+#line 2871 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 236:
+  case 237:
 #line 731 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_hide_trustanchor:%s)\n", (yyvsp[0].str)));
@@ -2877,30 +2879,30 @@ yyreduce:
                else cfg_parser->cfg->hide_trustanchor = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2881 "util/configparser.c" /* yacc.c:1646  */
+#line 2883 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 237:
+  case 238:
 #line 740 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_identity:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->identity);
                cfg_parser->cfg->identity = (yyvsp[0].str);
        }
-#line 2891 "util/configparser.c" /* yacc.c:1646  */
+#line 2893 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 238:
+  case 239:
 #line 747 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_version:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->version);
                cfg_parser->cfg->version = (yyvsp[0].str);
        }
-#line 2901 "util/configparser.c" /* yacc.c:1646  */
+#line 2903 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 239:
+  case 240:
 #line 754 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_so_rcvbuf:%s)\n", (yyvsp[0].str)));
@@ -2908,10 +2910,10 @@ yyreduce:
                        yyerror("buffer size expected");
                free((yyvsp[0].str));
        }
-#line 2912 "util/configparser.c" /* yacc.c:1646  */
+#line 2914 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 240:
+  case 241:
 #line 762 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_so_sndbuf:%s)\n", (yyvsp[0].str)));
@@ -2919,10 +2921,10 @@ yyreduce:
                        yyerror("buffer size expected");
                free((yyvsp[0].str));
        }
-#line 2923 "util/configparser.c" /* yacc.c:1646  */
+#line 2925 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 241:
+  case 242:
 #line 770 "./util/configparser.y" /* yacc.c:1646  */
     {
         OUTYY(("P(server_so_reuseport:%s)\n", (yyvsp[0].str)));
@@ -2932,10 +2934,10 @@ yyreduce:
             (strcmp((yyvsp[0].str), "yes")==0);
         free((yyvsp[0].str));
     }
-#line 2936 "util/configparser.c" /* yacc.c:1646  */
+#line 2938 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 242:
+  case 243:
 #line 780 "./util/configparser.y" /* yacc.c:1646  */
     {
         OUTYY(("P(server_ip_transparent:%s)\n", (yyvsp[0].str)));
@@ -2945,10 +2947,10 @@ yyreduce:
             (strcmp((yyvsp[0].str), "yes")==0);
         free((yyvsp[0].str));
     }
-#line 2949 "util/configparser.c" /* yacc.c:1646  */
+#line 2951 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 243:
+  case 244:
 #line 790 "./util/configparser.y" /* yacc.c:1646  */
     {
         OUTYY(("P(server_ip_freebind:%s)\n", (yyvsp[0].str)));
@@ -2958,10 +2960,10 @@ yyreduce:
             (strcmp((yyvsp[0].str), "yes")==0);
         free((yyvsp[0].str));
     }
-#line 2962 "util/configparser.c" /* yacc.c:1646  */
+#line 2964 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 244:
+  case 245:
 #line 800 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[0].str)));
@@ -2974,10 +2976,10 @@ yyreduce:
                else cfg_parser->cfg->edns_buffer_size = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2978 "util/configparser.c" /* yacc.c:1646  */
+#line 2980 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 245:
+  case 246:
 #line 813 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[0].str)));
@@ -2988,10 +2990,10 @@ yyreduce:
                else cfg_parser->cfg->msg_buffer_size = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2992 "util/configparser.c" /* yacc.c:1646  */
+#line 2994 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 246:
+  case 247:
 #line 824 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_msg_cache_size:%s)\n", (yyvsp[0].str)));
@@ -2999,10 +3001,10 @@ yyreduce:
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 3003 "util/configparser.c" /* yacc.c:1646  */
+#line 3005 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 247:
+  case 248:
 #line 832 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[0].str)));
@@ -3015,10 +3017,10 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 3019 "util/configparser.c" /* yacc.c:1646  */
+#line 3021 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 248:
+  case 249:
 #line 845 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[0].str)));
@@ -3027,10 +3029,10 @@ yyreduce:
                else cfg_parser->cfg->num_queries_per_thread = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3031 "util/configparser.c" /* yacc.c:1646  */
+#line 3033 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 249:
+  case 250:
 #line 854 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_jostle_timeout:%s)\n", (yyvsp[0].str)));
@@ -3039,10 +3041,10 @@ yyreduce:
                else cfg_parser->cfg->jostle_time = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3043 "util/configparser.c" /* yacc.c:1646  */
+#line 3045 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 250:
+  case 251:
 #line 863 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_delay_close:%s)\n", (yyvsp[0].str)));
@@ -3051,10 +3053,10 @@ yyreduce:
                else cfg_parser->cfg->delay_close = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3055 "util/configparser.c" /* yacc.c:1646  */
+#line 3057 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 251:
+  case 252:
 #line 872 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_unblock_lan_zones:%s)\n", (yyvsp[0].str)));
@@ -3064,10 +3066,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3068 "util/configparser.c" /* yacc.c:1646  */
+#line 3070 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 252:
+  case 253:
 #line 882 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_insecure_lan_zones:%s)\n", (yyvsp[0].str)));
@@ -3077,10 +3079,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3081 "util/configparser.c" /* yacc.c:1646  */
+#line 3083 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 253:
+  case 254:
 #line 892 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_rrset_cache_size:%s)\n", (yyvsp[0].str)));
@@ -3088,10 +3090,10 @@ yyreduce:
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 3092 "util/configparser.c" /* yacc.c:1646  */
+#line 3094 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 254:
+  case 255:
 #line 900 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[0].str)));
@@ -3104,10 +3106,10 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 3108 "util/configparser.c" /* yacc.c:1646  */
+#line 3110 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 255:
+  case 256:
 #line 913 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_infra_host_ttl:%s)\n", (yyvsp[0].str)));
@@ -3116,10 +3118,10 @@ yyreduce:
                else cfg_parser->cfg->host_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3120 "util/configparser.c" /* yacc.c:1646  */
+#line 3122 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 256:
+  case 257:
 #line 922 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_infra_lame_ttl:%s)\n", (yyvsp[0].str)));
@@ -3127,10 +3129,10 @@ yyreduce:
                        "removed, use infra-host-ttl)", (yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3131 "util/configparser.c" /* yacc.c:1646  */
+#line 3133 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 257:
+  case 258:
 #line 930 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[0].str)));
@@ -3139,10 +3141,10 @@ yyreduce:
                else cfg_parser->cfg->infra_cache_numhosts = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3143 "util/configparser.c" /* yacc.c:1646  */
+#line 3145 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 258:
+  case 259:
 #line 939 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_infra_cache_lame_size:%s)\n", (yyvsp[0].str)));
@@ -3150,10 +3152,10 @@ yyreduce:
                        "(option removed, use infra-cache-numhosts)", (yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3154 "util/configparser.c" /* yacc.c:1646  */
+#line 3156 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 259:
+  case 260:
 #line 947 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[0].str)));
@@ -3166,10 +3168,10 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 3170 "util/configparser.c" /* yacc.c:1646  */
+#line 3172 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 260:
+  case 261:
 #line 960 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_infra_cache_min_rtt:%s)\n", (yyvsp[0].str)));
@@ -3178,20 +3180,20 @@ yyreduce:
                else cfg_parser->cfg->infra_cache_min_rtt = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3182 "util/configparser.c" /* yacc.c:1646  */
+#line 3184 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 261:
+  case 262:
 #line 969 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->target_fetch_policy);
                cfg_parser->cfg->target_fetch_policy = (yyvsp[0].str);
        }
-#line 3192 "util/configparser.c" /* yacc.c:1646  */
+#line 3194 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 262:
+  case 263:
 #line 976 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_short_bufsize:%s)\n", (yyvsp[0].str)));
@@ -3201,10 +3203,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3205 "util/configparser.c" /* yacc.c:1646  */
+#line 3207 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 263:
+  case 264:
 #line 986 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_large_queries:%s)\n", (yyvsp[0].str)));
@@ -3214,10 +3216,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3218 "util/configparser.c" /* yacc.c:1646  */
+#line 3220 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 264:
+  case 265:
 #line 996 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_glue:%s)\n", (yyvsp[0].str)));
@@ -3227,10 +3229,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3231 "util/configparser.c" /* yacc.c:1646  */
+#line 3233 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 265:
+  case 266:
 #line 1006 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_dnssec_stripped:%s)\n", (yyvsp[0].str)));
@@ -3240,10 +3242,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3244 "util/configparser.c" /* yacc.c:1646  */
+#line 3246 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 266:
+  case 267:
 #line 1016 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_below_nxdomain:%s)\n", (yyvsp[0].str)));
@@ -3253,10 +3255,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3257 "util/configparser.c" /* yacc.c:1646  */
+#line 3259 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 267:
+  case 268:
 #line 1026 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_referral_path:%s)\n", (yyvsp[0].str)));
@@ -3266,10 +3268,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3270 "util/configparser.c" /* yacc.c:1646  */
+#line 3272 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 268:
+  case 269:
 #line 1036 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_algo_downgrade:%s)\n", (yyvsp[0].str)));
@@ -3279,10 +3281,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3283 "util/configparser.c" /* yacc.c:1646  */
+#line 3285 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 269:
+  case 270:
 #line 1046 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_use_caps_for_id:%s)\n", (yyvsp[0].str)));
@@ -3292,40 +3294,40 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3296 "util/configparser.c" /* yacc.c:1646  */
+#line 3298 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 270:
+  case 271:
 #line 1056 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_caps_whitelist:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3306 "util/configparser.c" /* yacc.c:1646  */
+#line 3308 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 271:
+  case 272:
 #line 1063 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_private_address:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3316 "util/configparser.c" /* yacc.c:1646  */
+#line 3318 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 272:
+  case 273:
 #line 1070 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_private_domain:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3326 "util/configparser.c" /* yacc.c:1646  */
+#line 3328 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 273:
+  case 274:
 #line 1077 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_prefetch:%s)\n", (yyvsp[0].str)));
@@ -3334,10 +3336,10 @@ yyreduce:
                else cfg_parser->cfg->prefetch = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3338 "util/configparser.c" /* yacc.c:1646  */
+#line 3340 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 274:
+  case 275:
 #line 1086 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_prefetch_key:%s)\n", (yyvsp[0].str)));
@@ -3346,10 +3348,10 @@ yyreduce:
                else cfg_parser->cfg->prefetch_key = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3350 "util/configparser.c" /* yacc.c:1646  */
+#line 3352 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 275:
+  case 276:
 #line 1095 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_unwanted_reply_threshold:%s)\n", (yyvsp[0].str)));
@@ -3358,20 +3360,20 @@ yyreduce:
                else cfg_parser->cfg->unwanted_threshold = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3362 "util/configparser.c" /* yacc.c:1646  */
+#line 3364 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 276:
+  case 277:
 #line 1104 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_not_query_address:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3372 "util/configparser.c" /* yacc.c:1646  */
+#line 3374 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 277:
+  case 278:
 #line 1111 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_not_query_localhost:%s)\n", (yyvsp[0].str)));
@@ -3381,10 +3383,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3385 "util/configparser.c" /* yacc.c:1646  */
+#line 3387 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 278:
+  case 279:
 #line 1121 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
@@ -3401,20 +3403,20 @@ yyreduce:
                                fatal_exit("out of memory adding acl");
                }
        }
-#line 3405 "util/configparser.c" /* yacc.c:1646  */
+#line 3407 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 279:
+  case 280:
 #line 1138 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_module_conf:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->module_conf);
                cfg_parser->cfg->module_conf = (yyvsp[0].str);
        }
-#line 3415 "util/configparser.c" /* yacc.c:1646  */
+#line 3417 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 280:
+  case 281:
 #line 1145 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[0].str)));
@@ -3432,10 +3434,10 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 3436 "util/configparser.c" /* yacc.c:1646  */
+#line 3438 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 281:
+  case 282:
 #line 1163 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_sig_skew_min:%s)\n", (yyvsp[0].str)));
@@ -3448,10 +3450,10 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 3452 "util/configparser.c" /* yacc.c:1646  */
+#line 3454 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 282:
+  case 283:
 #line 1176 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_sig_skew_max:%s)\n", (yyvsp[0].str)));
@@ -3464,10 +3466,10 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 3468 "util/configparser.c" /* yacc.c:1646  */
+#line 3470 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 283:
+  case 284:
 #line 1189 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[0].str)));
@@ -3476,10 +3478,10 @@ yyreduce:
                else cfg_parser->cfg->max_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3480 "util/configparser.c" /* yacc.c:1646  */
+#line 3482 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 284:
+  case 285:
 #line 1198 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_cache_max_negative_ttl:%s)\n", (yyvsp[0].str)));
@@ -3488,10 +3490,10 @@ yyreduce:
                else cfg_parser->cfg->max_negative_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3492 "util/configparser.c" /* yacc.c:1646  */
+#line 3494 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 285:
+  case 286:
 #line 1207 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_cache_min_ttl:%s)\n", (yyvsp[0].str)));
@@ -3500,10 +3502,10 @@ yyreduce:
                else cfg_parser->cfg->min_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3504 "util/configparser.c" /* yacc.c:1646  */
+#line 3506 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 286:
+  case 287:
 #line 1216 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[0].str)));
@@ -3512,10 +3514,10 @@ yyreduce:
                else cfg_parser->cfg->bogus_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3516 "util/configparser.c" /* yacc.c:1646  */
+#line 3518 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 287:
+  case 288:
 #line 1225 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[0].str)));
@@ -3525,10 +3527,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3529 "util/configparser.c" /* yacc.c:1646  */
+#line 3531 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 288:
+  case 289:
 #line 1235 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[0].str)));
@@ -3538,10 +3540,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3542 "util/configparser.c" /* yacc.c:1646  */
+#line 3544 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 289:
+  case 290:
 #line 1245 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ignore_cd_flag:%s)\n", (yyvsp[0].str)));
@@ -3550,10 +3552,10 @@ yyreduce:
                else cfg_parser->cfg->ignore_cd = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3554 "util/configparser.c" /* yacc.c:1646  */
+#line 3556 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 290:
+  case 291:
 #line 1254 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_serve_expired:%s)\n", (yyvsp[0].str)));
@@ -3562,10 +3564,10 @@ yyreduce:
                else cfg_parser->cfg->serve_expired = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3566 "util/configparser.c" /* yacc.c:1646  */
+#line 3568 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 291:
+  case 292:
 #line 1263 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_fake_dsa:%s)\n", (yyvsp[0].str)));
@@ -3578,10 +3580,10 @@ yyreduce:
 #endif
                free((yyvsp[0].str));
        }
-#line 3582 "util/configparser.c" /* yacc.c:1646  */
+#line 3584 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 292:
+  case 293:
 #line 1276 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_fake_sha1:%s)\n", (yyvsp[0].str)));
@@ -3594,10 +3596,10 @@ yyreduce:
 #endif
                free((yyvsp[0].str));
        }
-#line 3598 "util/configparser.c" /* yacc.c:1646  */
+#line 3600 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 293:
+  case 294:
 #line 1289 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_log_level:%s)\n", (yyvsp[0].str)));
@@ -3606,20 +3608,20 @@ yyreduce:
                else cfg_parser->cfg->val_log_level = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3610 "util/configparser.c" /* yacc.c:1646  */
+#line 3612 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 294:
+  case 295:
 #line 1298 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->val_nsec3_key_iterations);
                cfg_parser->cfg->val_nsec3_key_iterations = (yyvsp[0].str);
        }
-#line 3620 "util/configparser.c" /* yacc.c:1646  */
+#line 3622 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 295:
+  case 296:
 #line 1305 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_add_holddown:%s)\n", (yyvsp[0].str)));
@@ -3628,10 +3630,10 @@ yyreduce:
                else cfg_parser->cfg->add_holddown = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3632 "util/configparser.c" /* yacc.c:1646  */
+#line 3634 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 296:
+  case 297:
 #line 1314 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_del_holddown:%s)\n", (yyvsp[0].str)));
@@ -3640,10 +3642,10 @@ yyreduce:
                else cfg_parser->cfg->del_holddown = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3644 "util/configparser.c" /* yacc.c:1646  */
+#line 3646 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 297:
+  case 298:
 #line 1323 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_keep_missing:%s)\n", (yyvsp[0].str)));
@@ -3652,10 +3654,10 @@ yyreduce:
                else cfg_parser->cfg->keep_missing = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3656 "util/configparser.c" /* yacc.c:1646  */
+#line 3658 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 298:
+  case 299:
 #line 1332 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_permit_small_holddown:%s)\n", (yyvsp[0].str)));
@@ -3665,10 +3667,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3669 "util/configparser.c" /* yacc.c:1646  */
+#line 3671 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 299:
+  case 300:
 #line 1341 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[0].str)));
@@ -3676,10 +3678,10 @@ yyreduce:
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 3680 "util/configparser.c" /* yacc.c:1646  */
+#line 3682 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 300:
+  case 301:
 #line 1349 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[0].str)));
@@ -3692,10 +3694,10 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 3696 "util/configparser.c" /* yacc.c:1646  */
+#line 3698 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 301:
+  case 302:
 #line 1362 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_neg_cache_size:%s)\n", (yyvsp[0].str)));
@@ -3703,10 +3705,10 @@ yyreduce:
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 3707 "util/configparser.c" /* yacc.c:1646  */
+#line 3709 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 302:
+  case 303:
 #line 1370 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
@@ -3734,20 +3736,20 @@ yyreduce:
                                fatal_exit("out of memory adding local-zone");
                }
        }
-#line 3738 "util/configparser.c" /* yacc.c:1646  */
+#line 3740 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 303:
+  case 304:
 #line 1398 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 3748 "util/configparser.c" /* yacc.c:1646  */
+#line 3750 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 304:
+  case 305:
 #line 1405 "./util/configparser.y" /* yacc.c:1646  */
     {
                char* ptr;
@@ -3762,10 +3764,10 @@ yyreduce:
                        yyerror("local-data-ptr could not be reversed");
                }
        }
-#line 3766 "util/configparser.c" /* yacc.c:1646  */
+#line 3768 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 305:
+  case 306:
 #line 1420 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_minimal_responses:%s)\n", (yyvsp[0].str)));
@@ -3775,10 +3777,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3779 "util/configparser.c" /* yacc.c:1646  */
+#line 3781 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 306:
+  case 307:
 #line 1430 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_rrset_roundrobin:%s)\n", (yyvsp[0].str)));
@@ -3788,30 +3790,30 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3792 "util/configparser.c" /* yacc.c:1646  */
+#line 3794 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 307:
+  case 308:
 #line 1440 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 3802 "util/configparser.c" /* yacc.c:1646  */
+#line 3804 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 308:
+  case 309:
 #line 1447 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dns64_prefix:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dns64_prefix);
                cfg_parser->cfg->dns64_prefix = (yyvsp[0].str);
        }
-#line 3812 "util/configparser.c" /* yacc.c:1646  */
+#line 3814 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 309:
+  case 310:
 #line 1454 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_dns64_synthall:%s)\n", (yyvsp[0].str)));
@@ -3820,10 +3822,10 @@ yyreduce:
                else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3824 "util/configparser.c" /* yacc.c:1646  */
+#line 3826 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 310:
+  case 311:
 #line 1463 "./util/configparser.y" /* yacc.c:1646  */
     {
                char* p, *s = (yyvsp[0].str);
@@ -3837,10 +3839,10 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 3841 "util/configparser.c" /* yacc.c:1646  */
+#line 3843 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 311:
+  case 312:
 #line 1477 "./util/configparser.y" /* yacc.c:1646  */
     {
                size_t len = 0;
@@ -3859,10 +3861,10 @@ yyreduce:
                        }
                }
        }
-#line 3863 "util/configparser.c" /* yacc.c:1646  */
+#line 3865 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 312:
+  case 313:
 #line 1496 "./util/configparser.y" /* yacc.c:1646  */
     {
                size_t len = 0;
@@ -3881,10 +3883,10 @@ yyreduce:
                        }
                }
        }
-#line 3885 "util/configparser.c" /* yacc.c:1646  */
+#line 3887 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 313:
+  case 314:
 #line 1515 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
@@ -3896,10 +3898,10 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 3900 "util/configparser.c" /* yacc.c:1646  */
+#line 3902 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 314:
+  case 315:
 #line 1527 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
@@ -3911,10 +3913,10 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 3915 "util/configparser.c" /* yacc.c:1646  */
+#line 3917 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 315:
+  case 316:
 #line 1539 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_local_zone_override:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
@@ -3926,10 +3928,10 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 3930 "util/configparser.c" /* yacc.c:1646  */
+#line 3932 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 316:
+  case 317:
 #line 1551 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_access_control_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
@@ -3940,10 +3942,10 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 3944 "util/configparser.c" /* yacc.c:1646  */
+#line 3946 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 317:
+  case 318:
 #line 1562 "./util/configparser.y" /* yacc.c:1646  */
     {
                size_t len = 0;
@@ -3962,10 +3964,10 @@ yyreduce:
                        }
                }
        }
-#line 3966 "util/configparser.c" /* yacc.c:1646  */
+#line 3968 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 318:
+  case 319:
 #line 1581 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_ip_ratelimit:%s)\n", (yyvsp[0].str))); 
@@ -3974,10 +3976,10 @@ yyreduce:
                else cfg_parser->cfg->ip_ratelimit = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3978 "util/configparser.c" /* yacc.c:1646  */
+#line 3980 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 319:
+  case 320:
 #line 1591 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[0].str))); 
@@ -3986,10 +3988,10 @@ yyreduce:
                else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3990 "util/configparser.c" /* yacc.c:1646  */
+#line 3992 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 320:
+  case 321:
 #line 1600 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(server_ip_ratelimit_size:%s)\n", (yyvsp[0].str)));
@@ -3997,10 +3999,10 @@ yyreduce:
                yyerror("memory size expected");
        free((yyvsp[0].str));
   }
-#line 4001 "util/configparser.c" /* yacc.c:1646  */
+#line 4003 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 321:
+  case 322:
 #line 1608 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ratelimit_size:%s)\n", (yyvsp[0].str)));
@@ -4008,10 +4010,10 @@ yyreduce:
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 4012 "util/configparser.c" /* yacc.c:1646  */
+#line 4014 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 322:
+  case 323:
 #line 1616 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
@@ -4024,10 +4026,10 @@ yyreduce:
        }
        free((yyvsp[0].str));
   }
-#line 4028 "util/configparser.c" /* yacc.c:1646  */
+#line 4030 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 323:
+  case 324:
 #line 1629 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
@@ -4040,10 +4042,10 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4044 "util/configparser.c" /* yacc.c:1646  */
+#line 4046 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 324:
+  case 325:
 #line 1642 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
@@ -4056,10 +4058,10 @@ yyreduce:
                                        "ratelimit-for-domain");
                }
        }
-#line 4060 "util/configparser.c" /* yacc.c:1646  */
+#line 4062 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 325:
+  case 326:
 #line 1655 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
@@ -4072,10 +4074,10 @@ yyreduce:
                                        "ratelimit-below-domain");
                }
        }
-#line 4076 "util/configparser.c" /* yacc.c:1646  */
+#line 4078 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 326:
+  case 327:
 #line 1668 "./util/configparser.y" /* yacc.c:1646  */
     { 
        OUTYY(("P(server_ip_ratelimit_factor:%s)\n", (yyvsp[0].str))); 
@@ -4084,10 +4086,10 @@ yyreduce:
        else cfg_parser->cfg->ip_ratelimit_factor = atoi((yyvsp[0].str));
        free((yyvsp[0].str));
        }
-#line 4088 "util/configparser.c" /* yacc.c:1646  */
+#line 4090 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 327:
+  case 328:
 #line 1677 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_ratelimit_factor:%s)\n", (yyvsp[0].str))); 
@@ -4096,10 +4098,10 @@ yyreduce:
                else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4100 "util/configparser.c" /* yacc.c:1646  */
+#line 4102 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 328:
+  case 329:
 #line 1686 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_qname_minimisation:%s)\n", (yyvsp[0].str)));
@@ -4109,10 +4111,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4113 "util/configparser.c" /* yacc.c:1646  */
+#line 4115 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 329:
+  case 330:
 #line 1696 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_qname_minimisation_strict:%s)\n", (yyvsp[0].str)));
@@ -4122,10 +4124,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4126 "util/configparser.c" /* yacc.c:1646  */
+#line 4128 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 330:
+  case 331:
 #line 1706 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
@@ -4135,30 +4137,30 @@ yyreduce:
                free(cfg_parser->cfg->stubs->name);
                cfg_parser->cfg->stubs->name = (yyvsp[0].str);
        }
-#line 4139 "util/configparser.c" /* yacc.c:1646  */
+#line 4141 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 331:
+  case 332:
 #line 1716 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 4149 "util/configparser.c" /* yacc.c:1646  */
+#line 4151 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 332:
+  case 333:
 #line 1723 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 4159 "util/configparser.c" /* yacc.c:1646  */
+#line 4161 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 333:
+  case 334:
 #line 1730 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-first:%s)\n", (yyvsp[0].str)));
@@ -4167,10 +4169,10 @@ yyreduce:
                else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4171 "util/configparser.c" /* yacc.c:1646  */
+#line 4173 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 334:
+  case 335:
 #line 1739 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-ssl-upstream:%s)\n", (yyvsp[0].str)));
@@ -4180,10 +4182,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4184 "util/configparser.c" /* yacc.c:1646  */
+#line 4186 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 335:
+  case 336:
 #line 1749 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-prime:%s)\n", (yyvsp[0].str)));
@@ -4193,10 +4195,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4197 "util/configparser.c" /* yacc.c:1646  */
+#line 4199 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 336:
+  case 337:
 #line 1759 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
@@ -4206,30 +4208,30 @@ yyreduce:
                free(cfg_parser->cfg->forwards->name);
                cfg_parser->cfg->forwards->name = (yyvsp[0].str);
        }
-#line 4210 "util/configparser.c" /* yacc.c:1646  */
+#line 4212 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 337:
+  case 338:
 #line 1769 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 4220 "util/configparser.c" /* yacc.c:1646  */
+#line 4222 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 338:
+  case 339:
 #line 1776 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 4230 "util/configparser.c" /* yacc.c:1646  */
+#line 4232 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 339:
+  case 340:
 #line 1783 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(forward-first:%s)\n", (yyvsp[0].str)));
@@ -4238,10 +4240,10 @@ yyreduce:
                else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4242 "util/configparser.c" /* yacc.c:1646  */
+#line 4244 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 340:
+  case 341:
 #line 1792 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(forward-ssl-upstream:%s)\n", (yyvsp[0].str)));
@@ -4251,10 +4253,10 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4255 "util/configparser.c" /* yacc.c:1646  */
+#line 4257 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 341:
+  case 342:
 #line 1802 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
@@ -4264,10 +4266,10 @@ yyreduce:
                free(cfg_parser->cfg->views->name);
                cfg_parser->cfg->views->name = (yyvsp[0].str);
        }
-#line 4268 "util/configparser.c" /* yacc.c:1646  */
+#line 4270 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 342:
+  case 343:
 #line 1812 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
@@ -4296,10 +4298,10 @@ yyreduce:
                                fatal_exit("out of memory adding local-zone");
                }
        }
-#line 4300 "util/configparser.c" /* yacc.c:1646  */
+#line 4302 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 343:
+  case 344:
 #line 1841 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
@@ -4309,10 +4311,10 @@ yyreduce:
                        fatal_exit("out of memory adding per-view "
                                "response-ip action");
        }
-#line 4313 "util/configparser.c" /* yacc.c:1646  */
+#line 4315 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 344:
+  case 345:
 #line 1851 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view_response_ip_data:%s)\n", (yyvsp[-1].str)));
@@ -4320,10 +4322,10 @@ yyreduce:
                        &cfg_parser->cfg->views->respip_data, (yyvsp[-1].str), (yyvsp[0].str)))
                        fatal_exit("out of memory adding response-ip-data");
        }
-#line 4324 "util/configparser.c" /* yacc.c:1646  */
+#line 4326 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 345:
+  case 346:
 #line 1859 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view_local_data:%s)\n", (yyvsp[0].str)));
@@ -4332,11 +4334,29 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 4336 "util/configparser.c" /* yacc.c:1646  */
+#line 4338 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 346:
+  case 347:
 #line 1868 "./util/configparser.y" /* yacc.c:1646  */
+    {
+               char* ptr;
+               OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[0].str)));
+               ptr = cfg_ptr_reverse((yyvsp[0].str));
+               free((yyvsp[0].str));
+               if(ptr) {
+                       if(!cfg_strlist_insert(&cfg_parser->cfg->views->
+                               local_data, ptr))
+                               fatal_exit("out of memory adding local-data");
+               } else {
+                       yyerror("local-data-ptr could not be reversed");
+               }
+       }
+#line 4356 "util/configparser.c" /* yacc.c:1646  */
+    break;
+
+  case 348:
+#line 1883 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view-first:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4344,19 +4364,19 @@ yyreduce:
                else cfg_parser->cfg->views->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4348 "util/configparser.c" /* yacc.c:1646  */
+#line 4368 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 347:
-#line 1877 "./util/configparser.y" /* yacc.c:1646  */
+  case 349:
+#line 1892 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("\nP(remote-control:)\n")); 
        }
-#line 4356 "util/configparser.c" /* yacc.c:1646  */
+#line 4376 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 358:
-#line 1888 "./util/configparser.y" /* yacc.c:1646  */
+  case 360:
+#line 1903 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(control_enable:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4365,11 +4385,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4369 "util/configparser.c" /* yacc.c:1646  */
+#line 4389 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 359:
-#line 1898 "./util/configparser.y" /* yacc.c:1646  */
+  case 361:
+#line 1913 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(control_port:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -4377,21 +4397,21 @@ yyreduce:
                else cfg_parser->cfg->control_port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4381 "util/configparser.c" /* yacc.c:1646  */
+#line 4401 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 360:
-#line 1907 "./util/configparser.y" /* yacc.c:1646  */
+  case 362:
+#line 1922 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(control_interface:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->control_ifs, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 4391 "util/configparser.c" /* yacc.c:1646  */
+#line 4411 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 361:
-#line 1914 "./util/configparser.y" /* yacc.c:1646  */
+  case 363:
+#line 1929 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(control_use_cert:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4400,122 +4420,122 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4404 "util/configparser.c" /* yacc.c:1646  */
+#line 4424 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 362:
-#line 1924 "./util/configparser.y" /* yacc.c:1646  */
+  case 364:
+#line 1939 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 4414 "util/configparser.c" /* yacc.c:1646  */
+#line 4434 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 363:
-#line 1931 "./util/configparser.y" /* yacc.c:1646  */
+  case 365:
+#line 1946 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 4424 "util/configparser.c" /* yacc.c:1646  */
+#line 4444 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 364:
-#line 1938 "./util/configparser.y" /* yacc.c:1646  */
+  case 366:
+#line 1953 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 4434 "util/configparser.c" /* yacc.c:1646  */
+#line 4454 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 365:
-#line 1945 "./util/configparser.y" /* yacc.c:1646  */
+  case 367:
+#line 1960 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 4444 "util/configparser.c" /* yacc.c:1646  */
+#line 4464 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 366:
-#line 1952 "./util/configparser.y" /* yacc.c:1646  */
+  case 368:
+#line 1967 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("\nP(dnstap:)\n"));
        }
-#line 4452 "util/configparser.c" /* yacc.c:1646  */
+#line 4472 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 381:
-#line 1969 "./util/configparser.y" /* yacc.c:1646  */
+  case 383:
+#line 1984 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_enable:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap = (strcmp((yyvsp[0].str), "yes")==0);
        }
-#line 4463 "util/configparser.c" /* yacc.c:1646  */
+#line 4483 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 382:
-#line 1977 "./util/configparser.y" /* yacc.c:1646  */
+  case 384:
+#line 1992 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 4473 "util/configparser.c" /* yacc.c:1646  */
+#line 4493 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 383:
-#line 1984 "./util/configparser.y" /* yacc.c:1646  */
+  case 385:
+#line 1999 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_send_identity:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_send_identity = (strcmp((yyvsp[0].str), "yes")==0);
        }
-#line 4484 "util/configparser.c" /* yacc.c:1646  */
+#line 4504 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 384:
-#line 1992 "./util/configparser.y" /* yacc.c:1646  */
+  case 386:
+#line 2007 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_send_version:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_send_version = (strcmp((yyvsp[0].str), "yes")==0);
        }
-#line 4495 "util/configparser.c" /* yacc.c:1646  */
+#line 4515 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 385:
-#line 2000 "./util/configparser.y" /* yacc.c:1646  */
+  case 387:
+#line 2015 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 4505 "util/configparser.c" /* yacc.c:1646  */
+#line 4525 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 386:
-#line 2007 "./util/configparser.y" /* yacc.c:1646  */
+  case 388:
+#line 2022 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 4515 "util/configparser.c" /* yacc.c:1646  */
+#line 4535 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 387:
-#line 2014 "./util/configparser.y" /* yacc.c:1646  */
+  case 389:
+#line 2029 "./util/configparser.y" /* yacc.c:1646  */
     {
                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)
@@ -4523,11 +4543,11 @@ yyreduce:
                else cfg_parser->cfg->dnstap_log_resolver_query_messages =
                        (strcmp((yyvsp[0].str), "yes")==0);
        }
-#line 4527 "util/configparser.c" /* yacc.c:1646  */
+#line 4547 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 388:
-#line 2023 "./util/configparser.y" /* yacc.c:1646  */
+  case 390:
+#line 2038 "./util/configparser.y" /* yacc.c:1646  */
     {
                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)
@@ -4535,11 +4555,11 @@ yyreduce:
                else cfg_parser->cfg->dnstap_log_resolver_response_messages =
                        (strcmp((yyvsp[0].str), "yes")==0);
        }
-#line 4539 "util/configparser.c" /* yacc.c:1646  */
+#line 4559 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 389:
-#line 2032 "./util/configparser.y" /* yacc.c:1646  */
+  case 391:
+#line 2047 "./util/configparser.y" /* yacc.c:1646  */
     {
                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)
@@ -4547,11 +4567,11 @@ yyreduce:
                else cfg_parser->cfg->dnstap_log_client_query_messages =
                        (strcmp((yyvsp[0].str), "yes")==0);
        }
-#line 4551 "util/configparser.c" /* yacc.c:1646  */
+#line 4571 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 390:
-#line 2041 "./util/configparser.y" /* yacc.c:1646  */
+  case 392:
+#line 2056 "./util/configparser.y" /* yacc.c:1646  */
     {
                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)
@@ -4559,11 +4579,11 @@ yyreduce:
                else cfg_parser->cfg->dnstap_log_client_response_messages =
                        (strcmp((yyvsp[0].str), "yes")==0);
        }
-#line 4563 "util/configparser.c" /* yacc.c:1646  */
+#line 4583 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 391:
-#line 2050 "./util/configparser.y" /* yacc.c:1646  */
+  case 393:
+#line 2065 "./util/configparser.y" /* yacc.c:1646  */
     {
                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)
@@ -4571,11 +4591,11 @@ yyreduce:
                else cfg_parser->cfg->dnstap_log_forwarder_query_messages =
                        (strcmp((yyvsp[0].str), "yes")==0);
        }
-#line 4575 "util/configparser.c" /* yacc.c:1646  */
+#line 4595 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 392:
-#line 2059 "./util/configparser.y" /* yacc.c:1646  */
+  case 394:
+#line 2074 "./util/configparser.y" /* yacc.c:1646  */
     {
                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)
@@ -4583,29 +4603,29 @@ yyreduce:
                else cfg_parser->cfg->dnstap_log_forwarder_response_messages =
                        (strcmp((yyvsp[0].str), "yes")==0);
        }
-#line 4587 "util/configparser.c" /* yacc.c:1646  */
+#line 4607 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 393:
-#line 2068 "./util/configparser.y" /* yacc.c:1646  */
+  case 395:
+#line 2083 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("\nP(python:)\n")); 
        }
-#line 4595 "util/configparser.c" /* yacc.c:1646  */
+#line 4615 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 397:
-#line 2077 "./util/configparser.y" /* yacc.c:1646  */
+  case 399:
+#line 2092 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(python-script:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->python_script);
                cfg_parser->cfg->python_script = (yyvsp[0].str);
        }
-#line 4605 "util/configparser.c" /* yacc.c:1646  */
+#line 4625 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 398:
-#line 2083 "./util/configparser.y" /* yacc.c:1646  */
+  case 400:
+#line 2098 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(disable_dnssec_lame_check:%s)\n", (yyvsp[0].str)));
                if (strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4614,21 +4634,21 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4618 "util/configparser.c" /* yacc.c:1646  */
+#line 4638 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 399:
-#line 2093 "./util/configparser.y" /* yacc.c:1646  */
+  case 401:
+#line 2108 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 4628 "util/configparser.c" /* yacc.c:1646  */
+#line 4648 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 400:
-#line 2100 "./util/configparser.y" /* yacc.c:1646  */
+  case 402:
+#line 2115 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                validate_respip_action((yyvsp[0].str));
@@ -4636,22 +4656,22 @@ yyreduce:
                        (yyvsp[-1].str), (yyvsp[0].str)))
                        fatal_exit("out of memory adding response-ip");
        }
-#line 4640 "util/configparser.c" /* yacc.c:1646  */
+#line 4660 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 401:
-#line 2109 "./util/configparser.y" /* yacc.c:1646  */
+  case 403:
+#line 2124 "./util/configparser.y" /* yacc.c:1646  */
     {
                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 4651 "util/configparser.c" /* yacc.c:1646  */
+#line 4671 "util/configparser.c" /* yacc.c:1646  */
     break;
 
 
-#line 4655 "util/configparser.c" /* yacc.c:1646  */
+#line 4675 "util/configparser.c" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -4879,7 +4899,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 2116 "./util/configparser.y" /* yacc.c:1906  */
+#line 2131 "./util/configparser.y" /* yacc.c:1906  */
 
 
 /* parse helper routines could be here */
index a16ab64241b3b8eda99a637bcf175633d06d8170..25f6b9ac5497866c870d3e31385f5bd76cdb39e6 100644 (file)
@@ -272,7 +272,7 @@ viewstart: VAR_VIEW
 contents_view: contents_view content_view 
        | ;
 content_view: view_name | view_local_zone | view_local_data | view_first |
-               view_response_ip | view_response_ip_data
+               view_response_ip | view_response_ip_data | view_local_data_ptr
        ;
 server_num_threads: VAR_NUM_THREADS STRING_ARG 
        { 
@@ -1864,6 +1864,21 @@ view_local_data: VAR_LOCAL_DATA STRING_ARG
                }
        }
        ;
+view_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG
+       {
+               char* ptr;
+               OUTYY(("P(view_local_data_ptr:%s)\n", $2));
+               ptr = cfg_ptr_reverse($2);
+               free($2);
+               if(ptr) {
+                       if(!cfg_strlist_insert(&cfg_parser->cfg->views->
+                               local_data, ptr))
+                               fatal_exit("out of memory adding local-data");
+               } else {
+                       yyerror("local-data-ptr could not be reversed");
+               }
+       }
+       ;
 view_first: VAR_VIEW_FIRST STRING_ARG
        {
                OUTYY(("P(view-first:%s)\n", $2));