2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-30 05:57:52 +00:00

Merge branch 'ondrej/cleanup-cruft-in-dns_catz' into 'main'

Cleanup the dns_catz unit API

See merge request isc-projects/bind9!8099
This commit is contained in:
Ondřej Surý 2023-07-24 17:54:26 +00:00
commit aed4fdd7d3
7 changed files with 208 additions and 254 deletions

View File

@ -2872,7 +2872,7 @@ cleanup:
cfg_obj_destroy(cfg->add_parser, &zoneconf);
}
dns_catz_entry_detach(cz->origin, &cz->entry);
dns_catz_detach_catz(&cz->origin);
dns_catz_zone_detach(&cz->origin);
dns_view_detach(&cz->view);
isc_mem_putanddetach(&cz->mctx, cz, sizeof(*cz));
}
@ -2946,7 +2946,7 @@ cleanup:
dns_zone_detach(&zone);
}
dns_catz_entry_detach(cz->origin, &cz->entry);
dns_catz_detach_catz(&cz->origin);
dns_catz_zone_detach(&cz->origin);
dns_view_detach(&cz->view);
isc_mem_putanddetach(&cz->mctx, cz, sizeof(*cz));
}
@ -2978,7 +2978,7 @@ catz_run(dns_catz_entry_t *entry, dns_catz_zone_t *origin, dns_view_t *view,
isc_mem_attach(view->mctx, &cz->mctx);
dns_catz_entry_attach(entry, &cz->entry);
dns_catz_attach_catz(origin, &cz->origin);
dns_catz_zone_attach(origin, &cz->origin);
dns_view_attach(view, &cz->view);
isc_async_run(named_g_mainloop, action, cz);
@ -3004,6 +3004,25 @@ catz_modzone(dns_catz_entry_t *entry, dns_catz_zone_t *origin, dns_view_t *view,
return (catz_run(entry, origin, view, udata, CATZ_MODZONE));
}
static void
catz_changeview(dns_catz_entry_t *entry, void *arg1, void *arg2) {
dns_view_t *pview = arg1;
dns_view_t *view = arg2;
dns_zone_t *zone = NULL;
isc_result_t result = dns_view_findzone(
pview, dns_catz_entry_getname(entry), DNS_ZTFIND_EXACT, &zone);
if (result != ISC_R_SUCCESS) {
return;
}
dns_zone_setview(zone, view);
dns_view_addzone(view, zone);
dns_zone_detach(&zone);
}
static isc_result_t
configure_catz_zone(dns_view_t *view, dns_view_t *pview,
const cfg_obj_t *config, const cfg_listelt_t *element) {
@ -3031,65 +3050,14 @@ configure_catz_zone(dns_view_t *view, dns_view_t *pview,
goto cleanup;
}
result = dns_catz_add_zone(view->catzs, &origin, &zone);
if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS) {
cfg_obj_log(catz_obj, named_g_lctx, DNS_CATZ_ERROR_LEVEL,
"catz: unable to create catalog zone '%s', "
"error %s",
str, isc_result_totext(result));
goto cleanup;
}
result = dns_catz_zone_add(view->catzs, &origin, &zone);
if (result == ISC_R_EXISTS) {
isc_ht_iter_t *it = NULL;
RUNTIME_CHECK(pview != NULL);
/*
* xxxwpk todo: reconfigure the zone!!!!
*/
cfg_obj_log(catz_obj, named_g_lctx, DNS_CATZ_ERROR_LEVEL,
"catz: catalog zone '%s' will not be reconfigured",
str);
/*
* We have to walk through all the member zones and attach
* We have to walk through all the member zones and re-attach
* them to current view
*/
dns_catz_get_iterator(zone, &it);
for (result = isc_ht_iter_first(it); result == ISC_R_SUCCESS;
result = isc_ht_iter_next(it))
{
dns_name_t *name = NULL;
dns_zone_t *dnszone = NULL;
dns_catz_entry_t *entry = NULL;
isc_result_t tresult;
isc_ht_iter_current(it, (void **)&entry);
name = dns_catz_entry_getname(entry);
tresult = dns_view_findzone(pview, name,
DNS_ZTFIND_EXACT, &dnszone);
if (tresult != ISC_R_SUCCESS) {
continue;
}
dns_zone_setview(dnszone, view);
dns_view_addzone(view, dnszone);
/*
* The dns_view_findzone() call above increments the
* zone's reference count, which we need to decrement
* back. However, as dns_zone_detach() sets the
* supplied pointer to NULL, calling it is deferred
* until the dnszone variable is no longer used.
*/
dns_zone_detach(&dnszone);
}
isc_ht_iter_destroy(&it);
result = ISC_R_SUCCESS;
dns_catz_zone_for_each_entry2(zone, catz_changeview, pview,
view);
}
dns_catz_zone_resetdefoptions(zone);
@ -3167,12 +3135,12 @@ configure_catz(dns_view_t *view, dns_view_t *pview, const cfg_obj_t *config,
}
if (old != NULL) {
dns_catz_attach_catzs(pview->catzs, &view->catzs);
dns_catz_detach_catzs(&pview->catzs);
dns_catz_zones_attach(pview->catzs, &view->catzs);
dns_catz_zones_detach(&pview->catzs);
dns_catz_prereconfig(view->catzs);
} else {
dns_catz_new_zones(view->mctx, named_g_loopmgr, &view->catzs,
&ns_catz_zonemodmethods);
view->catzs = dns_catz_zones_new(view->mctx, named_g_loopmgr,
&ns_catz_zonemodmethods);
}
while (zone_element != NULL) {
@ -6725,7 +6693,7 @@ configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
}
if (view->catzs != NULL &&
dns_catz_get_zone(view->catzs, origin) != NULL)
dns_catz_zone_get(view->catzs, origin) != NULL)
{
zone_is_catz = true;
}

View File

@ -85,8 +85,7 @@ n=0
n=$((n+1))
echo_i "checking that catalog-bad1.example (with no version) has failed to load ($n)"
ret=0
wait_for_message ns2/named.run "catz: zone 'catalog-bad1.example' has no 'version' record" &&
wait_for_message ns2/named.run "catz: new catalog zone 'catalog-bad1.example' is broken and will not be processed" || ret=1
wait_for_message ns2/named.run "catz: zone 'catalog-bad1.example' has no 'version' record and will not be processed" &&
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status+ret))
@ -122,7 +121,7 @@ echo_i "checking that catalog-bad5.example (non-IN class) has failed to load ($n
ret=0
wait_for_message ns2/named.run "'catalog-zones' option is only supported for views with class IN" &&
wait_for_message ns2/named.run "all zones loaded" || ret=1
grep -F "catz: dns_catz_add_zone catalog-bad5.example" ns2/named.run && ret=1
grep -F "catz: dns_catz_zone_add catalog-bad5.example" ns2/named.run && ret=1
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status+ret))
@ -2018,7 +2017,9 @@ status=$((status+ret))
n=$((n+1))
echo_i "waiting for secondary to sync up ($n)"
ret=0
wait_for_message ns2/named.run "catz: zone 'dom16.example' was expected to exist but can not be found, will be restored" || ret=1
wait_for_message ns2/named.run "catz: update_from_db: new zone merged" || ret=1
wait_for_message ns2/named.run "catz: catalog1.example: reload done: success" || ret=1
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status+ret))
@ -2030,6 +2031,13 @@ grep "192.0.2.1" dig.out.test$n > /dev/null || ret=1
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status+ret))
n=$((n+1))
echo_i "checking that dom8.example. was not accidentally deleted during the configuration ($n)"
ret=0
_wait_for_message ns2/named.run "catz: zone 'dom8.example' was expected to exist but can not be found, will be restored" && ret=1
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status+ret))
nextpart ns2/named.run >/dev/null
n=$((n+1))

View File

@ -241,21 +241,20 @@ dns_catz_options_setdefault(isc_mem_t *mctx, const dns_catz_options_t *defaults,
opts->in_memory = defaults->in_memory;
}
static void
catz_coo_new(isc_mem_t *mctx, const dns_name_t *domain,
dns_catz_coo_t **ncoop) {
dns_catz_coo_t *ncoo;
static dns_catz_coo_t *
catz_coo_new(isc_mem_t *mctx, const dns_name_t *domain) {
REQUIRE(mctx != NULL);
REQUIRE(domain != NULL);
REQUIRE(ncoop != NULL && *ncoop == NULL);
ncoo = isc_mem_get(mctx, sizeof(*ncoo));
dns_catz_coo_t *ncoo = isc_mem_get(mctx, sizeof(*ncoo));
*ncoo = (dns_catz_coo_t){
.magic = DNS_CATZ_COO_MAGIC,
};
dns_name_init(&ncoo->name, NULL);
dns_name_dup(domain, mctx, &ncoo->name);
isc_refcount_init(&ncoo->references, 1);
ncoo->magic = DNS_CATZ_COO_MAGIC;
*ncoop = ncoo;
return (ncoo);
}
static void
@ -278,15 +277,33 @@ catz_coo_detach(dns_catz_zone_t *catz, dns_catz_coo_t **coop) {
}
}
void
dns_catz_entry_new(isc_mem_t *mctx, const dns_name_t *domain,
dns_catz_entry_t **nentryp) {
dns_catz_entry_t *nentry;
static void
catz_coo_add(dns_catz_zone_t *catz, dns_catz_entry_t *entry,
const dns_name_t *domain) {
REQUIRE(DNS_CATZ_ZONE_VALID(catz));
REQUIRE(DNS_CATZ_ENTRY_VALID(entry));
REQUIRE(domain != NULL);
/* We are write locked, so the add must succeed if not found */
dns_catz_coo_t *coo = NULL;
isc_result_t result = isc_ht_find(catz->coos, entry->name.ndata,
entry->name.length, (void **)&coo);
if (result != ISC_R_SUCCESS) {
coo = catz_coo_new(catz->catzs->mctx, domain);
result = isc_ht_add(catz->coos, entry->name.ndata,
entry->name.length, coo);
}
INSIST(result == ISC_R_SUCCESS);
}
dns_catz_entry_t *
dns_catz_entry_new(isc_mem_t *mctx, const dns_name_t *domain) {
REQUIRE(mctx != NULL);
REQUIRE(nentryp != NULL && *nentryp == NULL);
nentry = isc_mem_get(mctx, sizeof(*nentry));
dns_catz_entry_t *nentry = isc_mem_get(mctx, sizeof(*nentry));
*nentry = (dns_catz_entry_t){
.magic = DNS_CATZ_ENTRY_MAGIC,
};
dns_name_init(&nentry->name, NULL);
if (domain != NULL) {
@ -295,8 +312,8 @@ dns_catz_entry_new(isc_mem_t *mctx, const dns_name_t *domain,
dns_catz_options_init(&nentry->opts);
isc_refcount_init(&nentry->references, 1);
nentry->magic = DNS_CATZ_ENTRY_MAGIC;
*nentryp = nentry;
return (nentry);
}
dns_name_t *
@ -305,19 +322,17 @@ dns_catz_entry_getname(dns_catz_entry_t *entry) {
return (&entry->name);
}
void
dns_catz_entry_copy(dns_catz_zone_t *catz, const dns_catz_entry_t *entry,
dns_catz_entry_t **nentryp) {
dns_catz_entry_t *nentry = NULL;
dns_catz_entry_t *
dns_catz_entry_copy(dns_catz_zone_t *catz, const dns_catz_entry_t *entry) {
REQUIRE(DNS_CATZ_ZONE_VALID(catz));
REQUIRE(DNS_CATZ_ENTRY_VALID(entry));
REQUIRE(nentryp != NULL && *nentryp == NULL);
dns_catz_entry_new(catz->catzs->mctx, &entry->name, &nentry);
dns_catz_entry_t *nentry = dns_catz_entry_new(catz->catzs->mctx,
&entry->name);
dns_catz_options_copy(catz->catzs->mctx, &entry->opts, &nentry->opts);
*nentryp = nentry;
return (nentry);
}
void
@ -767,17 +782,14 @@ dns__catz_zones_merge(dns_catz_zone_t *catz, dns_catz_zone_t *newcatz) {
return (result);
}
void
dns_catz_new_zones(isc_mem_t *mctx, isc_loopmgr_t *loopmgr,
dns_catz_zones_t **catzsp, dns_catz_zonemodmethods_t *zmm) {
dns_catz_zones_t *catzs = NULL;
dns_catz_zones_t *
dns_catz_zones_new(isc_mem_t *mctx, isc_loopmgr_t *loopmgr,
dns_catz_zonemodmethods_t *zmm) {
REQUIRE(mctx != NULL);
REQUIRE(loopmgr != NULL);
REQUIRE(catzsp != NULL && *catzsp == NULL);
REQUIRE(zmm != NULL);
catzs = isc_mem_get(mctx, sizeof(*catzs));
dns_catz_zones_t *catzs = isc_mem_get(mctx, sizeof(*catzs));
*catzs = (dns_catz_zones_t){ .loopmgr = loopmgr,
.zmm = zmm,
.magic = DNS_CATZ_ZONES_MAGIC };
@ -787,7 +799,7 @@ dns_catz_new_zones(isc_mem_t *mctx, isc_loopmgr_t *loopmgr,
isc_ht_init(&catzs->zones, mctx, 4, ISC_HT_CASE_SENSITIVE);
isc_mem_attach(mctx, &catzs->mctx);
*catzsp = catzs;
return (catzs);
}
void
@ -800,16 +812,12 @@ dns_catz_catzs_set_view(dns_catz_zones_t *catzs, dns_view_t *view) {
catzs->view = view;
}
isc_result_t
dns_catz_new_zone(dns_catz_zones_t *catzs, dns_catz_zone_t **catzp,
const dns_name_t *name) {
dns_catz_zone_t *catz;
dns_catz_zone_t *
dns_catz_zone_new(dns_catz_zones_t *catzs, const dns_name_t *name) {
REQUIRE(DNS_CATZ_ZONES_VALID(catzs));
REQUIRE(catzp != NULL && *catzp == NULL);
REQUIRE(ISC_MAGIC_VALID(name, DNS_NAME_MAGIC));
catz = isc_mem_get(catzs->mctx, sizeof(*catz));
dns_catz_zone_t *catz = isc_mem_get(catzs->mctx, sizeof(*catz));
*catz = (dns_catz_zone_t){ .active = true,
.version = DNS_CATZ_VERSION_UNDEFINED,
.magic = DNS_CATZ_ZONE_MAGIC };
@ -825,9 +833,7 @@ dns_catz_new_zone(dns_catz_zones_t *catzs, dns_catz_zone_t **catzp,
dns_name_init(&catz->name, NULL);
dns_name_dup(name, catzs->mctx, &catz->name);
*catzp = catz;
return (ISC_R_SUCCESS);
return (catz);
}
static void
@ -872,57 +878,54 @@ dns__catz_timer_stop(void *arg) {
isc_timer_destroy(&catz->updatetimer);
catz->loop = NULL;
dns_catz_detach_catz(&catz);
dns_catz_zone_detach(&catz);
}
isc_result_t
dns_catz_add_zone(dns_catz_zones_t *catzs, const dns_name_t *name,
dns_catz_zone_add(dns_catz_zones_t *catzs, const dns_name_t *name,
dns_catz_zone_t **catzp) {
dns_catz_zone_t *catz = NULL;
isc_result_t result, tresult;
char zname[DNS_NAME_FORMATSIZE];
REQUIRE(DNS_CATZ_ZONES_VALID(catzs));
REQUIRE(ISC_MAGIC_VALID(name, DNS_NAME_MAGIC));
REQUIRE(catzp != NULL && *catzp == NULL);
dns_catz_zone_t *catz = NULL;
isc_result_t result;
char zname[DNS_NAME_FORMATSIZE];
dns_name_format(name, zname, DNS_NAME_FORMATSIZE);
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_MASTER,
ISC_LOG_DEBUG(3), "catz: dns_catz_add_zone %s", zname);
ISC_LOG_DEBUG(3), "catz: dns_catz_zone_add %s", zname);
LOCK(&catzs->lock);
result = dns_catz_new_zone(catzs, &catz, name);
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
result = isc_ht_add(catzs->zones, catz->name.ndata, catz->name.length,
catz);
if (result != ISC_R_SUCCESS) {
dns_catz_detach_catz(&catz);
if (result != ISC_R_EXISTS) {
goto cleanup;
}
}
if (result == ISC_R_EXISTS) {
tresult = isc_ht_find(catzs->zones, name->ndata, name->length,
(void **)&catz);
INSIST(tresult == ISC_R_SUCCESS && !catz->active);
result = isc_ht_find(catzs->zones, name->ndata, name->length,
(void **)&catz);
switch (result) {
case ISC_R_SUCCESS:
INSIST(!catz->active);
catz->active = true;
result = ISC_R_EXISTS;
break;
case ISC_R_NOTFOUND:
catz = dns_catz_zone_new(catzs, name);
result = isc_ht_add(catzs->zones, catz->name.ndata,
catz->name.length, catz);
INSIST(result == ISC_R_SUCCESS);
break;
default:
UNREACHABLE();
}
UNLOCK(&catzs->lock);
*catzp = catz;
cleanup:
UNLOCK(&catzs->lock);
return (result);
}
dns_catz_zone_t *
dns_catz_get_zone(dns_catz_zones_t *catzs, const dns_name_t *name) {
dns_catz_zone_get(dns_catz_zones_t *catzs, const dns_name_t *name) {
isc_result_t result;
dns_catz_zone_t *found = NULL;
@ -941,7 +944,7 @@ dns_catz_get_zone(dns_catz_zones_t *catzs, const dns_name_t *name) {
}
static void
dns__catz_shutdown(dns_catz_zone_t *catz) {
dns__catz_zone_shutdown(dns_catz_zone_t *catz) {
/* lock must be locked */
if (catz->updatetimer != NULL) {
/* Don't wait for timer to trigger for shutdown */
@ -949,7 +952,7 @@ dns__catz_shutdown(dns_catz_zone_t *catz) {
isc_async_run(catz->loop, dns__catz_timer_stop, catz);
} else {
dns_catz_detach_catz(&catz);
dns_catz_zone_detach(&catz);
}
}
@ -1038,7 +1041,7 @@ dns__catz_zones_destroy(dns_catz_zones_t *catzs) {
}
void
dns_catz_shutdown_catzs(dns_catz_zones_t *catzs) {
dns_catz_zones_shutdown(dns_catz_zones_t *catzs) {
REQUIRE(DNS_CATZ_ZONES_VALID(catzs));
if (!atomic_compare_exchange_strong(&catzs->shuttingdown,
@ -1057,7 +1060,7 @@ dns_catz_shutdown_catzs(dns_catz_zones_t *catzs) {
dns_catz_zone_t *catz = NULL;
isc_ht_iter_current(iter, (void **)&catz);
result = isc_ht_iter_delcurrent_next(iter);
dns__catz_shutdown(catz);
dns__catz_zone_shutdown(catz);
}
INSIST(result == ISC_R_NOMORE);
isc_ht_iter_destroy(&iter);
@ -1156,8 +1159,6 @@ catz_process_coo(dns_catz_zone_t *catz, dns_label_t *mhash,
dns_rdata_t rdata;
dns_rdata_ptr_t ptr;
dns_catz_entry_t *entry = NULL;
dns_catz_coo_t *ncoo = NULL;
dns_catz_coo_t *ocoo = NULL;
REQUIRE(DNS_CATZ_ZONE_VALID(catz));
REQUIRE(mhash != NULL);
@ -1211,19 +1212,7 @@ catz_process_coo(dns_catz_zone_t *catz, dns_label_t *mhash,
goto cleanup;
}
result = isc_ht_find(catz->coos, entry->name.ndata, entry->name.length,
(void **)&ocoo);
if (result == ISC_R_SUCCESS) {
/* The change of ownership permission was already registered. */
goto cleanup;
}
catz_coo_new(catz->catzs->mctx, &ptr.ptr, &ncoo);
result = isc_ht_add(catz->coos, entry->name.ndata, entry->name.length,
ncoo);
if (result != ISC_R_SUCCESS) {
catz_coo_detach(catz, &ncoo);
}
catz_coo_add(catz, entry, &ptr.ptr);
cleanup:
dns_rdata_freestruct(&ptr);
@ -1276,16 +1265,12 @@ catz_process_zones_entry(dns_catz_zone_t *catz, dns_rdataset_t *value,
dns_name_dup(&ptr.ptr, catz->catzs->mctx, &entry->name);
}
} else {
dns_catz_entry_new(catz->catzs->mctx, &ptr.ptr, &entry);
entry = dns_catz_entry_new(catz->catzs->mctx, &ptr.ptr);
result = isc_ht_add(catz->entries, mhash->base, mhash->length,
entry);
if (result != ISC_R_SUCCESS) {
dns_rdata_freestruct(&ptr);
dns_catz_entry_detach(catz, &entry);
return (result);
}
}
INSIST(result == ISC_R_SUCCESS);
dns_rdata_freestruct(&ptr);
@ -1673,14 +1658,11 @@ catz_process_zones_suboption(dns_catz_zone_t *catz, dns_rdataset_t *value,
result = isc_ht_find(catz->entries, mhash->base, mhash->length,
(void **)&entry);
if (result != ISC_R_SUCCESS) {
dns_catz_entry_new(catz->catzs->mctx, NULL, &entry);
entry = dns_catz_entry_new(catz->catzs->mctx, NULL);
result = isc_ht_add(catz->entries, mhash->base, mhash->length,
entry);
if (result != ISC_R_SUCCESS) {
dns_catz_entry_detach(catz, &entry);
return (result);
}
}
INSIST(result == ISC_R_SUCCESS);
dns_name_init(&prefix, NULL);
dns_name_split(name, suffix_labels, &prefix, NULL);
@ -2113,7 +2095,7 @@ dns__catz_timer_cb(void *arg) {
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_MASTER,
ISC_LOG_INFO, "catz: %s: reload start", domain);
dns_catz_ref_catz(catz);
dns_catz_zone_ref(catz);
isc_work_enqueue(catz->loop, dns__catz_update_cb, dns__catz_done_cb,
catz);
@ -2306,18 +2288,8 @@ dns__catz_update_cb(void *data) {
"catz: updating catalog zone '%s' with serial %" PRIu32,
bname, vers);
result = dns_catz_new_zone(catzs, &newcatz, &updb->origin);
if (result != ISC_R_SUCCESS) {
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
DNS_LOGMODULE_MASTER, ISC_LOG_ERROR,
"catz: failed to create new zone - %s",
isc_result_totext(result));
goto exit;
}
result = dns_db_createiterator(updb, DNS_DB_NONSEC3, &updbit);
if (result != ISC_R_SUCCESS) {
dns_catz_detach_catz(&newcatz);
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
DNS_LOGMODULE_MASTER, ISC_LOG_ERROR,
"catz: failed to create DB iterator - %s",
@ -2335,24 +2307,25 @@ dns__catz_update_cb(void *data) {
result = dns_name_fromstring2(name, "version", &updb->origin, 0, NULL);
if (result != ISC_R_SUCCESS) {
dns_dbiterator_destroy(&updbit);
dns_catz_detach_catz(&newcatz);
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
DNS_LOGMODULE_MASTER, ISC_LOG_ERROR,
"catz: failed to create name from string - %s",
isc_result_totext(result));
goto exit;
}
result = dns_dbiterator_seek(updbit, name);
if (result != ISC_R_SUCCESS) {
dns_dbiterator_destroy(&updbit);
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
DNS_LOGMODULE_MASTER, ISC_LOG_ERROR,
"catz: zone '%s' has no 'version' record (%s)",
"catz: zone '%s' has no 'version' record (%s) "
"and will not be processed",
bname, isc_result_totext(result));
newcatz->broken = true;
goto final;
goto exit;
}
newcatz = dns_catz_zone_new(catzs, &updb->origin);
name = dns_fixedname_initname(&fixname);
/*
@ -2486,7 +2459,6 @@ dns__catz_update_cb(void *data) {
oldcatz->version = catz_vers;
}
final:
if (newcatz->broken) {
dns_name_format(name, cname, DNS_NAME_FORMATSIZE);
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
@ -2494,7 +2466,7 @@ final:
"catz: new catalog zone '%s' is broken and "
"will not be processed",
bname);
dns_catz_detach_catz(&newcatz);
dns_catz_zone_detach(&newcatz);
result = ISC_R_FAILURE;
goto exit;
}
@ -2503,7 +2475,7 @@ final:
* Finally merge new zone into old zone.
*/
result = dns__catz_zones_merge(oldcatz, newcatz);
dns_catz_detach_catz(&newcatz);
dns_catz_zone_detach(&newcatz);
if (result != ISC_R_SUCCESS) {
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
DNS_LOGMODULE_MASTER, ISC_LOG_ERROR,
@ -2563,7 +2535,7 @@ dns__catz_done_cb(void *data) {
ISC_LOG_INFO, "catz: %s: reload done: %s", dname,
isc_result_totext(catz->updateresult));
dns_catz_unref_catz(catz);
dns_catz_zone_unref(catz);
}
void
@ -2613,16 +2585,14 @@ dns_catz_postreconfig(dns_catz_zones_t *catzs) {
* Merge the old zone with an empty one to remove
* all members.
*/
result = dns_catz_new_zone(catzs, &newcatz,
&catz->name);
INSIST(result == ISC_R_SUCCESS);
newcatz = dns_catz_zone_new(catzs, &catz->name);
dns__catz_zones_merge(catz, newcatz);
dns_catz_detach_catz(&newcatz);
dns_catz_zone_detach(&newcatz);
/* Make sure that we have an empty catalog zone. */
INSIST(isc_ht_count(catz->entries) == 0);
result = isc_ht_iter_delcurrent_next(iter);
dns_catz_detach_catz(&catz);
dns_catz_zone_detach(&catz);
} else {
result = isc_ht_iter_next(iter);
}
@ -2633,8 +2603,23 @@ dns_catz_postreconfig(dns_catz_zones_t *catzs) {
}
void
dns_catz_get_iterator(dns_catz_zone_t *catz, isc_ht_iter_t **itp) {
dns_catz_zone_for_each_entry2(dns_catz_zone_t *catz, dns_catz_entry_cb2 cb,
void *arg1, void *arg2) {
REQUIRE(DNS_CATZ_ZONE_VALID(catz));
isc_ht_iter_create(catz->entries, itp);
isc_ht_iter_t *iter = NULL;
isc_result_t result;
LOCK(&catz->catzs->lock);
isc_ht_iter_create(catz->entries, &iter);
for (result = isc_ht_iter_first(iter); result == ISC_R_SUCCESS;
result = isc_ht_iter_next(iter))
{
dns_catz_entry_t *entry = NULL;
isc_ht_iter_current(iter, (void **)&entry);
cb(entry, arg1, arg2);
}
isc_ht_iter_destroy(&iter);
UNLOCK(&catz->catzs->lock);
}

View File

@ -132,32 +132,28 @@ dns_catz_entry_getname(dns_catz_entry_t *entry);
* \li domain name for entry.
*/
void
dns_catz_entry_new(isc_mem_t *mctx, const dns_name_t *domain,
dns_catz_entry_t **nentryp);
dns_catz_entry_t *
dns_catz_entry_new(isc_mem_t *mctx, const dns_name_t *domain);
/*%<
* Allocate a new catz_entry on 'mctx', with the name 'domain'
*
* Requires:
* \li 'mctx' to be a valid memory context.
* \li 'domain' to be valid dns_name or NULL.
* \li 'nentryp' to be non NULL, *nentryp to be NULL.
*
* Returns:
* \li ISC_R_SUCCESS on success
* \li ISC_R_NOMEMORY on allocation failure
*/
void
dns_catz_entry_copy(dns_catz_zone_t *catz, const dns_catz_entry_t *entry,
dns_catz_entry_t **nentryp);
dns_catz_entry_t *
dns_catz_entry_copy(dns_catz_zone_t *catz, const dns_catz_entry_t *entry);
/*%<
* Allocate a new catz_entry and deep copy 'entry' into 'nentryp'.
*
* Requires:
* \li 'mctx' to be a valid memory context.
* \li 'entry' to be non NULL.
* \li 'nentryp' to be non NULL, *nentryp to be NULL.
*
* Returns:
* \li ISC_R_SUCCESS on success
@ -208,9 +204,8 @@ dns_catz_entry_cmp(const dns_catz_entry_t *ea, const dns_catz_entry_t *eb);
* \li 'false' if the entries differ.
*/
isc_result_t
dns_catz_new_zone(dns_catz_zones_t *catzs, dns_catz_zone_t **catzp,
const dns_name_t *name);
dns_catz_zone_t *
dns_catz_zone_new(dns_catz_zones_t *catzs, const dns_name_t *name);
/*%<
* Allocate a new catz zone on catzs mctx
*
@ -291,9 +286,9 @@ struct dns_catz_zonemodmethods {
void *udata;
};
void
dns_catz_new_zones(isc_mem_t *mctx, isc_loopmgr_t *loopmgr,
dns_catz_zones_t **catzsp, dns_catz_zonemodmethods_t *zmm);
dns_catz_zones_t *
dns_catz_zones_new(isc_mem_t *mctx, isc_loopmgr_t *loopmgr,
dns_catz_zonemodmethods_t *zmm);
/*%<
* Allocate a new catz_zones object, a collection storing all catalog zones
* for a view.
@ -307,7 +302,7 @@ dns_catz_new_zones(isc_mem_t *mctx, isc_loopmgr_t *loopmgr,
*/
isc_result_t
dns_catz_add_zone(dns_catz_zones_t *catzs, const dns_name_t *name,
dns_catz_zone_add(dns_catz_zones_t *catzs, const dns_name_t *name,
dns_catz_zone_t **catzp);
/*%<
* Allocate a new catz named 'name' and put it in 'catzs' collection.
@ -320,7 +315,7 @@ dns_catz_add_zone(dns_catz_zones_t *catzs, const dns_name_t *name,
*/
dns_catz_zone_t *
dns_catz_get_zone(dns_catz_zones_t *catzs, const dns_name_t *name);
dns_catz_zone_get(dns_catz_zones_t *catzs, const dns_name_t *name);
/*%<
* Returns a zone named 'name' from collection 'catzs'
*
@ -355,7 +350,7 @@ dns_catz_dbupdate_callback(dns_db_t *db, void *fn_arg);
*/
void
dns_catz_dbupdate_unregister(dns_db_t *db, dns_catz_zones_t *catzs);
dns_catz_dbupdate_register(dns_db_t *db, dns_catz_zones_t *catzs);
/*%<
* Register the catalog zone database update notify callback.
*
@ -365,7 +360,7 @@ dns_catz_dbupdate_unregister(dns_db_t *db, dns_catz_zones_t *catzs);
*/
void
dns_catz_dbupdate_register(dns_db_t *db, dns_catz_zones_t *catzs);
dns_catz_dbupdate_unregister(dns_db_t *db, dns_catz_zones_t *catzs);
/*%<
* Unregister the catalog zone database update notify callback.
*
@ -395,18 +390,7 @@ dns_catz_postreconfig(dns_catz_zones_t *catzs);
*/
void
dns_catz_get_iterator(dns_catz_zone_t *catz, isc_ht_iter_t **itp);
/*%<
* Get the hashtable iterator on catalog zone members, point '*itp' to it.
*
* Requires:
* \li 'catzs' is a valid dns_catz_zones_t.
* \li 'itp' is not NULL and '*itp' is NULL.
*
*/
void
dns_catz_shutdown_catzs(dns_catz_zones_t *catzs);
dns_catz_zones_shutdown(dns_catz_zones_t *catzs);
/*%<
* Shut down the catalog zones.
*
@ -415,41 +399,43 @@ dns_catz_shutdown_catzs(dns_catz_zones_t *catzs);
*
*/
typedef void (*dns_catz_entry_cb2)(dns_catz_entry_t *entry, void *arg1,
void *arg2);
void
dns_catz_zone_for_each_entry2(dns_catz_zone_t *catz, dns_catz_entry_cb2 cb,
void *arg1, void *arg2);
/*%<
* Iterate on the catalog zone members, call 'cb' on each 'entry'.
*
* Requires:
* \li 'catz' is a valid dns_catz_zones_t.
*
*/
#ifdef DNS_CATZ_TRACE
/* Compatibility macros */
#define dns_catz_attach_catz(catz, catzp) \
#define dns_catz_zone_attach(catz, catzp) \
dns_catz_zone__attach(catz, catzp, __func__, __FILE__, __LINE__)
#define dns_catz_detach_catz(catzp) \
#define dns_catz_zone_detach(catzp) \
dns_catz_zone__detach(catzp, __func__, __FILE__, __LINE__)
#define dns_catz_ref_catz(ptr) \
#define dns_catz_zone_ref(ptr) \
dns_catz_zone__ref(ptr, __func__, __FILE__, __LINE__)
#define dns_catz_unref_catz(ptr) \
#define dns_catz_zone_unref(ptr) \
dns_catz_zone__unref(ptr, __func__, __FILE__, __LINE__)
#define dns_catz_attach_catzs(catzs, catzsp) \
#define dns_catz_zones_attach(catzs, catzsp) \
dns_catz_zones__attach(catzs, catzsp, __func__, __FILE__, __LINE__)
#define dns_catz_detach_catzs(catzsp) \
#define dns_catz_zones_detach(catzsp) \
dns_catz_zones__detach(catzsp, __func__, __FILE__, __LINE__)
#define dns_catz_ref_catzs(ptr) \
#define dns_catz_zones_ref(ptr) \
dns_catz_zones__ref(ptr, __func__, __FILE__, __LINE__)
#define dns_catz_unref_catzs(ptr) \
#define dns_catz_zones_unref(ptr) \
dns_catz_zones__unref(ptr, __func__, __FILE__, __LINE__)
ISC_REFCOUNT_TRACE_DECL(dns_catz_zone);
ISC_REFCOUNT_TRACE_DECL(dns_catz_zones);
#else
/* Compatibility macros */
#define dns_catz_attach_catz(catz, catzp) dns_catz_zone_attach(catz, catzp)
#define dns_catz_detach_catz(catzp) dns_catz_zone_detach(catzp)
#define dns_catz_ref_catz(ptr) dns_catz_zone_ref(ptr)
#define dns_catz_unref_catz(ptr) dns_catz_zone_unref(ptr)
#define dns_catz_attach_catzs(catzs, catzsp) \
dns_catz_zones_attach(catzs, catzsp)
#define dns_catz_detach_catzs(catzsp) dns_catz_zones_detach(catzsp)
#define dns_catz_ref_catzs(ptr) dns_catz_zones_ref(ptr)
#define dns_catz_unref_catzs(ptr) dns_catz_zones_unref(ptr)
ISC_REFCOUNT_DECL(dns_catz_zone);
ISC_REFCOUNT_DECL(dns_catz_zones);
#endif /* DNS_CATZ_TRACE */

View File

@ -2469,7 +2469,7 @@ dns_zone_set_parentcatz(dns_zone_t *zone, dns_catz_zone_t *catz);
*/
dns_catz_zone_t *
dns_zone_get_parentcatz(const dns_zone_t *zone);
dns_zone_get_parentcatz(dns_zone_t *zone);
/*%<
* Get parent catalog zone for this zone
*

View File

@ -286,8 +286,8 @@ destroy(dns_view_t *view) {
dns_rpz_detach_rpzs(&view->rpzs);
}
if (view->catzs != NULL) {
dns_catz_shutdown_catzs(view->catzs);
dns_catz_detach_catzs(&view->catzs);
dns_catz_zones_shutdown(view->catzs);
dns_catz_zones_detach(&view->catzs);
}
for (dlzdb = ISC_LIST_HEAD(view->dlz_searched); dlzdb != NULL;
dlzdb = ISC_LIST_HEAD(view->dlz_searched))
@ -514,8 +514,8 @@ dns_view_detach(dns_view_t **viewp) {
}
}
if (view->catzs != NULL) {
dns_catz_shutdown_catzs(view->catzs);
dns_catz_detach_catzs(&view->catzs);
dns_catz_zones_shutdown(view->catzs);
dns_catz_zones_detach(&view->catzs);
}
if (view->ntatable_priv != NULL) {
dns_ntatable_shutdown(view->ntatable_priv);

View File

@ -1301,7 +1301,7 @@ zone_free(dns_zone_t *zone) {
zone->rpz_num = DNS_RPZ_INVALID_NUM;
}
if (zone->catzs != NULL) {
dns_catz_detach_catzs(&zone->catzs);
dns_catz_zones_detach(&zone->catzs);
}
zone_freedbargs(zone);
@ -1961,7 +1961,7 @@ zone_catz_enable(dns_zone_t *zone, dns_catz_zones_t *catzs) {
INSIST(zone->catzs == NULL || zone->catzs == catzs);
dns_catz_catzs_set_view(catzs, zone->view);
if (zone->catzs == NULL) {
dns_catz_attach_catzs(catzs, &zone->catzs);
dns_catz_zones_attach(catzs, &zone->catzs);
}
}
@ -1982,7 +1982,7 @@ zone_catz_disable(dns_zone_t *zone) {
if (zone->db != NULL) {
dns_zone_catz_disable_db(zone, zone->db);
}
dns_catz_detach_catzs(&zone->catzs);
dns_catz_zones_detach(&zone->catzs);
}
}
@ -2016,9 +2016,16 @@ dns_zone_set_parentcatz(dns_zone_t *zone, dns_catz_zone_t *catz) {
}
dns_catz_zone_t *
dns_zone_get_parentcatz(const dns_zone_t *zone) {
dns_zone_get_parentcatz(dns_zone_t *zone) {
REQUIRE(DNS_ZONE_VALID(zone));
return (zone->parentcatz);
dns_catz_zone_t *parentcatz = NULL;
LOCK_ZONE(zone);
parentcatz = zone->parentcatz;
UNLOCK_ZONE(zone);
return (parentcatz);
}
static bool