dns_rbt_t *table;
};
+struct zt_freeze_params {
+ dns_view_t *view;
+ bool freeze;
+};
+
#define ZTMAGIC ISC_MAGIC('Z', 'T', 'b', 'l')
#define VALID_ZT(zt) ISC_MAGIC_VALID(zt, ZTMAGIC)
}
isc_result_t
-dns_zt_freezezones(dns_zt_t *zt, bool freeze) {
+dns_zt_freezezones(dns_zt_t *zt, dns_view_t *view, bool freeze) {
isc_result_t result, tresult;
+ struct zt_freeze_params params = { view, freeze };
REQUIRE(VALID_ZT(zt));
RWLOCK(&zt->rwlock, isc_rwlocktype_read);
- result = dns_zt_apply(zt, false, &tresult, freezezones, &freeze);
+ result = dns_zt_apply(zt, false, &tresult, freezezones, ¶ms);
RWUNLOCK(&zt->rwlock, isc_rwlocktype_read);
if (tresult == ISC_R_NOTFOUND) {
tresult = ISC_R_SUCCESS;
static isc_result_t
freezezones(dns_zone_t *zone, void *uap) {
- bool freeze = *(bool *)uap;
+ struct zt_freeze_params *params = uap;
bool frozen;
isc_result_t result = ISC_R_SUCCESS;
char classstr[DNS_RDATACLASS_FORMATSIZE];
if (raw != NULL) {
zone = raw;
}
+ if (params->view != dns_zone_getview(zone)) {
+ if (raw != NULL) {
+ dns_zone_detach(&raw);
+ }
+ return (ISC_R_SUCCESS);
+ }
if (dns_zone_gettype(zone) != dns_zone_master) {
if (raw != NULL) {
dns_zone_detach(&raw);
}
frozen = dns_zone_getupdatedisabled(zone);
- if (freeze) {
+ if (params->freeze) {
if (frozen) {
result = DNS_R_FROZEN;
}
result = dns_zone_flush(zone);
}
if (result == ISC_R_SUCCESS) {
- dns_zone_setupdatedisabled(zone, freeze);
+ dns_zone_setupdatedisabled(zone, params->freeze);
}
} else {
if (frozen) {
level = (result != ISC_R_SUCCESS) ? ISC_LOG_ERROR : ISC_LOG_DEBUG(1);
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_ZONE,
level, "%s zone '%s/%s'%s%s: %s",
- freeze ? "freezing" : "thawing", zonename, classstr, sep,
- vname, isc_result_totext(result));
+ params->freeze ? "freezing" : "thawing", zonename,
+ classstr, sep, vname, isc_result_totext(result));
if (raw != NULL) {
dns_zone_detach(&raw);
}