Adam Tkac 03f646
--- bind-9.4.0/lib/dns/view.c.freeze	2007-04-24 12:35:03.000000000 +0200
Adam Tkac 03f646
+++ bind-9.4.0/lib/dns/view.c	2007-04-24 12:52:02.000000000 +0200
Adam Tkac 03f646
@@ -1140,6 +1140,32 @@
Adam Tkac 205d5e
 }
Adam Tkac 205d5e
 
Adam Tkac 205d5e
 isc_result_t
Adam Tkac 03f646
+dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name, isc_boolean_t allclasses,
Adam Tkac 205d5e
+                      dns_rdataclass_t rdclass, dns_zone_t **zonep)
Adam Tkac 205d5e
+{
Adam Tkac 205d5e
+	dns_view_t *view;
Adam Tkac 205d5e
+	isc_result_t result;
Adam Tkac 03f646
+	isc_boolean_t match = isc_boolean_false;
Adam Tkac 205d5e
+
Adam Tkac 205d5e
+	REQUIRE(list != NULL);
Adam Tkac 205d5e
+
Adam Tkac 205d5e
+	for (view = ISC_LIST_HEAD(*list);
Adam Tkac 205d5e
+             view != NULL;
Adam Tkac 205d5e
+             view = ISC_LIST_NEXT(view, link)) {
Adam Tkac 03f646
+		if (allclasses == isc_boolean_false && view->rdclass != rdclass )
Adam Tkac 205d5e
+			continue;
Adam Tkac 205d5e
+		result = dns_zt_find(view->zonetable, name,
Adam Tkac 205d5e
+                                     0, NULL, zonep);
Adam Tkac 03f646
+		if(result == ISC_R_SUCCESS) {
Adam Tkac 03f646
+			if (match != isc_boolean_false)
Adam Tkac 03f646
+				return ISC_R_NOTFOUND;
Adam Tkac 03f646
+			match = isc_boolean_true;
Adam Tkac 03f646
+		}
Adam Tkac 205d5e
+	}
Adam Tkac 03f646
+	return (match == isc_boolean_false) ? ISC_R_NOTFOUND : ISC_R_SUCCESS;
Adam Tkac 205d5e
+}
Adam Tkac 205d5e
+
Adam Tkac 205d5e
+isc_result_t
Adam Tkac 205d5e
 dns_view_load(dns_view_t *view, isc_boolean_t stop) {
Adam Tkac 205d5e
 
Adam Tkac 205d5e
 	REQUIRE(DNS_VIEW_VALID(view));
Adam Tkac 03f646
--- bind-9.4.0/lib/dns/include/dns/view.h.freeze	2007-04-24 12:35:03.000000000 +0200
Adam Tkac 03f646
+++ bind-9.4.0/lib/dns/include/dns/view.h	2007-04-24 12:35:03.000000000 +0200
Adam Tkac 205d5e
@@ -592,6 +592,19 @@
Adam Tkac 205d5e
  */
Adam Tkac 205d5e
 
Adam Tkac 205d5e
 isc_result_t
Adam Tkac 03f646
+dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name, isc_boolean_t allclasses,
Adam Tkac 205d5e
+                      dns_rdataclass_t rdclass, dns_zone_t **zonep);
Adam Tkac 205d5e
+
Adam Tkac 205d5e
+/*%<
Adam Tkac 205d5e
+ * Search zone with 'name' in view with 'rdclass' in viewlist 'list'
Adam Tkac 03f646
+ * If found, zone is returned in *zonep. If allclasses is set rdclass is ignored
Adam Tkac 205d5e
+ *
Adam Tkac 205d5e
+ * Returns:
Adam Tkac 205d5e
+ *\li	#ISC_R_SUCCESS          A matching zone was found.
Adam Tkac 205d5e
+ *\li	#ISC_R_NOTFOUND         No matching zone was found.
Adam Tkac 205d5e
+ */
Adam Tkac 205d5e
+
Adam Tkac 205d5e
+isc_result_t
Adam Tkac 205d5e
 dns_view_findzone(dns_view_t *view, dns_name_t *name, dns_zone_t **zonep);
Adam Tkac 205d5e
 /*%<
Adam Tkac 205d5e
  * Search for the zone 'name' in the zone table of 'view'.
Adam Tkac 03f646
--- bind-9.4.0/bin/named/server.c.freeze	2007-04-24 12:35:03.000000000 +0200
Adam Tkac 03f646
+++ bind-9.4.0/bin/named/server.c	2007-04-24 12:35:03.000000000 +0200
Adam Tkac 03f646
@@ -3922,19 +3922,24 @@
Adam Tkac 205d5e
 		rdclass = dns_rdataclass_in;
Adam Tkac 205d5e
 	}
Adam Tkac 205d5e
 	
Adam Tkac 205d5e
-	if (viewtxt == NULL)
Adam Tkac 205d5e
-		viewtxt = "_default";
Adam Tkac 205d5e
-	result = dns_viewlist_find(&server->viewlist, viewtxt,
Adam Tkac 205d5e
-				   rdclass, &view);
Adam Tkac 205d5e
-	if (result != ISC_R_SUCCESS)
Adam Tkac 205d5e
-		goto fail1;
Adam Tkac 205d5e
+	if (viewtxt == NULL) {
Adam Tkac 205d5e
+		result = dns_viewlist_findzone(&server->viewlist, dns_fixedname_name(&name),
Adam Tkac 03f646
+					       (classtxt == NULL) ? isc_boolean_true : isc_boolean_false,
Adam Tkac 205d5e
+					       rdclass, zonep);
Adam Tkac 205d5e
+	}
Adam Tkac 205d5e
+	else {
Adam Tkac 205d5e
+		result = dns_viewlist_find(&server->viewlist, viewtxt,
Adam Tkac 205d5e
+					   rdclass, &view);
Adam Tkac 205d5e
+		if (result != ISC_R_SUCCESS)
Adam Tkac 205d5e
+			goto fail1;
Adam Tkac 205d5e
 	
Adam Tkac 205d5e
-	result = dns_zt_find(view->zonetable, dns_fixedname_name(&name),
Adam Tkac 205d5e
-			     0, NULL, zonep);
Adam Tkac 205d5e
+		result = dns_zt_find(view->zonetable, dns_fixedname_name(&name),
Adam Tkac 205d5e
+				     0, NULL, zonep);
Adam Tkac 205d5e
+		dns_view_detach(&view);
Adam Tkac 205d5e
+	}
Adam Tkac 205d5e
 	/* Partial match? */
Adam Tkac 205d5e
 	if (result != ISC_R_SUCCESS && *zonep != NULL)
Adam Tkac 205d5e
 		dns_zone_detach(zonep);
Adam Tkac 205d5e
-	dns_view_detach(&view);
Adam Tkac 205d5e
  fail1:
Adam Tkac 205d5e
 	return (result);
Adam Tkac 205d5e
 }
Adam Tkac 03f646
--- bind-9.4.0/bin/named_sdb/server.c.freeze	2007-04-24 12:35:03.000000000 +0200
Adam Tkac 03f646
+++ bind-9.4.0/bin/named_sdb/server.c	2007-04-24 12:35:03.000000000 +0200
Adam Tkac 03f646
@@ -3917,19 +3917,24 @@
Adam Tkac 205d5e
 		rdclass = dns_rdataclass_in;
Adam Tkac 205d5e
 	}
Adam Tkac 205d5e
 	
Adam Tkac 205d5e
-	if (viewtxt == NULL)
Adam Tkac 205d5e
-		viewtxt = "_default";
Adam Tkac 205d5e
-	result = dns_viewlist_find(&server->viewlist, viewtxt,
Adam Tkac 205d5e
-				   rdclass, &view);
Adam Tkac 205d5e
-	if (result != ISC_R_SUCCESS)
Adam Tkac 205d5e
-		goto fail1;
Adam Tkac 205d5e
-	
Adam Tkac 205d5e
-	result = dns_zt_find(view->zonetable, dns_fixedname_name(&name),
Adam Tkac 205d5e
-			     0, NULL, zonep);
Adam Tkac 205d5e
+	if (viewtxt == NULL) {
Adam Tkac 205d5e
+                result = dns_viewlist_findzone(&server->viewlist, dns_fixedname_name(&name),
Adam Tkac 03f646
+					       (classtxt == NULL) ? isc_boolean_true : isc_boolean_false,
Adam Tkac 205d5e
+                                               rdclass, zonep);
Adam Tkac 205d5e
+        }
Adam Tkac 205d5e
+        else {
Adam Tkac 205d5e
+                result = dns_viewlist_find(&server->viewlist, viewtxt,
Adam Tkac 205d5e
+                                           rdclass, &view);
Adam Tkac 205d5e
+                if (result != ISC_R_SUCCESS)
Adam Tkac 205d5e
+                        goto fail1;
Adam Tkac 205d5e
+
Adam Tkac 205d5e
+                result = dns_zt_find(view->zonetable, dns_fixedname_name(&name),
Adam Tkac 205d5e
+                                     0, NULL, zonep);
Adam Tkac 205d5e
+                dns_view_detach(&view);
Adam Tkac 205d5e
+        }
Adam Tkac 205d5e
 	/* Partial match? */
Adam Tkac 205d5e
 	if (result != ISC_R_SUCCESS && *zonep != NULL)
Adam Tkac 205d5e
 		dns_zone_detach(zonep);
Adam Tkac 03f646
-	dns_view_detach(&view);
Adam Tkac 03f646
  fail1:
Adam Tkac 03f646
 	return (result);
Adam Tkac 03f646
 }