Adam Tkac 4048573
Index: bind9/bin/named/server.c
Adam Tkac 4048573
diff -u bind9/bin/named/server.c:1.483 bind9/bin/named/server.c:1.483.10.1
Adam Tkac 4048573
--- bind9/bin/named/server.c:1.483	Tue Apr 24 06:55:32 2007
Adam Tkac 4048573
+++ bind9/bin/named/server.c	Mon May 14 05:46:56 2007
Adam Tkac 4048573
@@ -4124,23 +4124,28 @@
Adam Tkac 4048573
 		result = dns_rdataclass_fromtext(&rdclass, &r);
Adam Tkac 4048573
 		if (result != ISC_R_SUCCESS)
Adam Tkac 4048573
 			goto fail1;
Adam Tkac 4048573
-	} else {
Adam Tkac 4048573
+	} else
Adam Tkac 4048573
 		rdclass = dns_rdataclass_in;
Adam Tkac 4048573
-	}
Adam Tkac 4048573
 	
Adam Tkac 4048573
-	if (viewtxt == NULL)
Adam Tkac 4048573
-		viewtxt = "_default";
Adam Tkac 4048573
-	result = dns_viewlist_find(&server->viewlist, viewtxt,
Adam Tkac 4048573
-				   rdclass, &view);
Adam Tkac 4048573
-	if (result != ISC_R_SUCCESS)
Adam Tkac 4048573
-		goto fail1;
Adam Tkac 4048573
+	if (viewtxt == NULL) {
Adam Tkac 4048573
+		result = dns_viewlist_findzone(&server->viewlist,
Adam Tkac 4048573
+					       dns_fixedname_name(&name),
Adam Tkac 4048573
+					       ISC_TF(classtxt == NULL),
Adam Tkac 4048573
+					       rdclass, zonep);
Adam Tkac 4048573
+	} else {
Adam Tkac 4048573
+		result = dns_viewlist_find(&server->viewlist, viewtxt,
Adam Tkac 4048573
+					   rdclass, &view);
Adam Tkac 4048573
+		if (result != ISC_R_SUCCESS)
Adam Tkac 4048573
+			goto fail1;
Adam Tkac 4048573
 	
Adam Tkac 4048573
-	result = dns_zt_find(view->zonetable, dns_fixedname_name(&name),
Adam Tkac 4048573
-			     0, NULL, zonep);
Adam Tkac 4048573
+		result = dns_zt_find(view->zonetable, dns_fixedname_name(&name),
Adam Tkac 4048573
+				     0, NULL, zonep);
Adam Tkac 4048573
+		dns_view_detach(&view);
Adam Tkac 4048573
+	}
Adam Tkac 4048573
+
Adam Tkac 4048573
 	/* Partial match? */
Adam Tkac 4048573
 	if (result != ISC_R_SUCCESS && *zonep != NULL)
Adam Tkac 4048573
 		dns_zone_detach(zonep);
Adam Tkac 4048573
-	dns_view_detach(&view);
Adam Tkac 4048573
  fail1:
Adam Tkac 4048573
 	return (result);
Adam Tkac 4048573
 }
Adam Tkac 4048573
Index: bind9/lib/dns/view.c
Adam Tkac 4048573
diff -u bind9/lib/dns/view.c:1.141 bind9/lib/dns/view.c:1.141.18.1
Adam Tkac 4048573
--- bind9/lib/dns/view.c:1.141	Thu Mar 29 06:36:30 2007
Adam Tkac 4048573
+++ bind9/lib/dns/view.c	Mon May 14 05:46:57 2007
Adam Tkac 4048573
@@ -1147,6 +1147,40 @@
Adam Tkac c76ded1
 }
Adam Tkac c76ded1
 
Adam Tkac c76ded1
 isc_result_t
Adam Tkac 4048573
+dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name,
Adam Tkac 4048573
+		      isc_boolean_t allclasses, dns_rdataclass_t rdclass,
Adam Tkac 4048573
+		      dns_zone_t **zonep)
Adam Tkac c76ded1
+{
Adam Tkac c76ded1
+	dns_view_t *view;
Adam Tkac c76ded1
+	isc_result_t result;
Adam Tkac 4048573
+	dns_zone_t *zone1 = NULL, *zone2 = NULL;
Adam Tkac c76ded1
+
Adam Tkac c76ded1
+	REQUIRE(list != NULL);
Adam Tkac c76ded1
+	for (view = ISC_LIST_HEAD(*list);
Adam Tkac c76ded1
+             view != NULL;
Adam Tkac c76ded1
+             view = ISC_LIST_NEXT(view, link)) {
Adam Tkac 4048573
+		if (allclasses == ISC_FALSE && view->rdclass != rdclass)
Adam Tkac c76ded1
+			continue;
Adam Tkac 4048573
+		result = dns_zt_find(view->zonetable, name, 0, NULL,
Adam Tkac 4048573
+				    (zone1 == NULL) ? &zone1 : &zone2);
Adam Tkac 4048573
+		INSIST(result == ISC_R_SUCCESS || result == ISC_R_NOTFOUND);
Adam Tkac 4048573
+		if (zone2 != NULL) {
Adam Tkac 4048573
+			dns_zone_detach(&zone1);
Adam Tkac 4048573
+			dns_zone_detach(&zone2);
Adam Tkac 4048573
+			return (ISC_R_NOTFOUND);
Adam Tkac 9287bb1
+		}
Adam Tkac c76ded1
+	}
Adam Tkac 4048573
+
Adam Tkac 4048573
+	if (zone1 != NULL) {
Adam Tkac 4048573
+		dns_zone_attach(zone1, zonep);
Adam Tkac 4048573
+		dns_zone_detach(&zone1);
Adam Tkac 4048573
+		return (ISC_R_SUCCESS);
Adam Tkac 4048573
+	}
Adam Tkac 4048573
+
Adam Tkac 4048573
+	return (ISC_R_NOTFOUND);
Adam Tkac c76ded1
+}
Adam Tkac c76ded1
+
Adam Tkac c76ded1
+isc_result_t
Adam Tkac c76ded1
 dns_view_load(dns_view_t *view, isc_boolean_t stop) {
Adam Tkac c76ded1
 
Adam Tkac c76ded1
 	REQUIRE(DNS_VIEW_VALID(view));
Adam Tkac 4048573
Index: bind9/lib/dns/include/dns/view.h
Adam Tkac 4048573
diff -u bind9/lib/dns/include/dns/view.h:1.105 bind9/lib/dns/include/dns/view.h:1.105.16.1
Adam Tkac 4048573
--- bind9/lib/dns/include/dns/view.h:1.105	Thu Mar 29 23:47:04 2007
Adam Tkac 4048573
+++ bind9/lib/dns/include/dns/view.h	Mon May 14 05:46:57 2007
Adam Tkac 4048573
@@ -595,6 +595,19 @@
Adam Tkac c76ded1
  */
Adam Tkac c76ded1
 
Adam Tkac c76ded1
 isc_result_t
Adam Tkac 9287bb1
+dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name, isc_boolean_t allclasses,
Adam Tkac c76ded1
+                      dns_rdataclass_t rdclass, dns_zone_t **zonep);
Adam Tkac c76ded1
+
Adam Tkac c76ded1
+/*%<
Adam Tkac c76ded1
+ * Search zone with 'name' in view with 'rdclass' in viewlist 'list'
Adam Tkac 9287bb1
+ * If found, zone is returned in *zonep. If allclasses is set rdclass is ignored
Adam Tkac c76ded1
+ *
Adam Tkac c76ded1
+ * Returns:
Adam Tkac c76ded1
+ *\li	#ISC_R_SUCCESS          A matching zone was found.
Adam Tkac c76ded1
+ *\li	#ISC_R_NOTFOUND         No matching zone was found.
Adam Tkac c76ded1
+ */
Adam Tkac c76ded1
+
Adam Tkac c76ded1
+isc_result_t
Adam Tkac c76ded1
 dns_view_findzone(dns_view_t *view, dns_name_t *name, dns_zone_t **zonep);
Adam Tkac c76ded1
 /*%<
Adam Tkac c76ded1
  * Search for the zone 'name' in the zone table of 'view'.