Hello,

    Unload master zone if forwarders are specified.

This patch should solve master => forward zone type change.

--
Petr^2 Spacek
From 96da10ab49612442fdf7b1c1805cddc4f46d511e Mon Sep 17 00:00:00 2001
From: Petr Spacek <pspa...@redhat.com>
Date: Mon, 5 Nov 2012 15:12:50 +0100
Subject: [PATCH] Unload master zone if forwarders are specified.

Signed-off-by: Petr Spacek <pspa...@redhat.com>
---
 src/ldap_helper.c | 36 ++++++++++++++++++++++++------------
 1 file changed, 24 insertions(+), 12 deletions(-)

diff --git a/src/ldap_helper.c b/src/ldap_helper.c
index 2d52bfaf894de8a5591f966b0c9197d14a1e73f7..4f004515f513ecf6459b3bddfbc5474fe3cfabd2 100644
--- a/src/ldap_helper.c
+++ b/src/ldap_helper.c
@@ -308,7 +308,8 @@ static isc_result_t soa_serial_increment(isc_mem_t *mctx, ldap_instance_t *inst,
 		dns_name_t *zone_name);
 
 static isc_result_t
-ldap_delete_zone2(ldap_instance_t *inst, dns_name_t *name, isc_boolean_t lock);
+ldap_delete_zone2(ldap_instance_t *inst, dns_name_t *name, isc_boolean_t lock,
+		  isc_boolean_t preserve_forwarding);
 
 /* Functions for maintaining pool of LDAP connections */
 static isc_result_t ldap_pool_create(isc_mem_t *mctx, unsigned int connections,
@@ -620,7 +621,7 @@ destroy_ldap_instance(ldap_instance_t **ldap_instp)
 
 		result = ldap_delete_zone2(ldap_inst,
 					   dns_fixedname_name(&concat),
-					   ISC_TRUE);
+					   ISC_TRUE, ISC_FALSE);
 		RUNTIME_CHECK(result == ISC_R_SUCCESS);
 	}
 
@@ -841,7 +842,8 @@ configure_zone_ssutable(dns_zone_t *zone, const char *update_str)
 
 /* Delete zone by dns zone name */
 static isc_result_t
-ldap_delete_zone2(ldap_instance_t *inst, dns_name_t *name, isc_boolean_t lock)
+ldap_delete_zone2(ldap_instance_t *inst, dns_name_t *name, isc_boolean_t lock,
+		  isc_boolean_t preserve_forwarding)
 {
 	isc_result_t result;
 	isc_boolean_t unlock = ISC_FALSE;
@@ -860,10 +862,12 @@ ldap_delete_zone2(ldap_instance_t *inst, dns_name_t *name, isc_boolean_t lock)
 			unlock = ISC_TRUE;
 	}
 
-	/* Disable forwarding. */
-	result = dns_fwdtable_delete(inst->view->fwdtable, name);
-	if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND)
-		log_error_r("zone '%s': failed to delete forwarders", zone_name_char);
+	if (!preserve_forwarding) {
+		result = dns_fwdtable_delete(inst->view->fwdtable, name);
+		if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND)
+			log_error_r("zone '%s': failed to delete forwarders",
+				    zone_name_char);
+	}
 
 	/* TODO: flush cache records belonging to deleted zone */
 	CHECK(discard_from_cache(inst->cache, name));
@@ -911,15 +915,16 @@ cleanup:
 
 /* Delete zone */
 static isc_result_t
-ldap_delete_zone(ldap_instance_t *inst, const char *dn, isc_boolean_t lock)
+ldap_delete_zone(ldap_instance_t *inst, const char *dn, isc_boolean_t lock,
+		 isc_boolean_t preserve_forwarding)
 {
 	isc_result_t result;
 	dns_name_t name;
 	dns_name_init(&name, NULL);
 	
 	CHECK(dn_to_dnsname(inst->mctx, dn, &name, NULL));
 
-	result = ldap_delete_zone2(inst, &name, lock);
+	result = ldap_delete_zone2(inst, &name, lock, preserve_forwarding);
 
 cleanup:
 	if (dns_name_dynamic(&name))
@@ -1218,6 +1223,11 @@ ldap_parse_zoneentry(ldap_entry_t *entry, ldap_instance_t *inst)
 	result = configure_zone_forwarders(entry, inst, &name);
 	if (result != ISC_R_DISABLED) {
 		if (result == ISC_R_SUCCESS) {
+			/* forwarding was enabled for the zone
+			 * => zone type was changed to "forward"
+			 * => delete "master" zone */
+			CHECK(ldap_delete_zone2(inst, &name, ISC_FALSE,
+						ISC_TRUE));
 #if LIBDNS_VERSION_MAJOR < 90
 			result = dns_view_flushcache(inst->view);
 #else
@@ -1510,7 +1520,8 @@ next:
 		result = dns_rbtnodechain_next(&chain, NULL, NULL);
 	
 		if (delete == ISC_TRUE)
-			ldap_delete_zone2(ldap_inst, &aname, ISC_FALSE);
+			ldap_delete_zone2(ldap_inst, &aname, ISC_FALSE,
+					  ISC_FALSE);
 	}
 
 
@@ -3253,7 +3264,8 @@ update_zone(isc_task_t *task, isc_event_t *event)
 		if (PSEARCH_MODDN(pevent->chgtype)) {
 			if (dn_to_dnsname(inst->mctx, pevent->prevdn, &prevname, NULL)
 					== ISC_R_SUCCESS) {
-				CHECK(ldap_delete_zone(inst, pevent->prevdn, ISC_TRUE));
+				CHECK(ldap_delete_zone(inst, pevent->prevdn,
+				      ISC_TRUE, ISC_FALSE));
 			} else {
 				log_debug(5, "update_action: old zone wasn't managed "
 						"by plugin, dn '%s'", pevent->prevdn);
@@ -3274,7 +3286,7 @@ update_zone(isc_task_t *task, isc_event_t *event)
 
 		INSIST(NEXT(entry_zone, link) == NULL); /* no multiple zones with same DN */
 	} else {
-		CHECK(ldap_delete_zone(inst, pevent->dn, ISC_TRUE));
+		CHECK(ldap_delete_zone(inst, pevent->dn, ISC_TRUE, ISC_FALSE));
 	}
 
 cleanup:
-- 
1.7.11.7

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to