Small refactor lib/dns/zone.c

Introduce some macros that can be reused in 'zone_load_soa_rr()' and
'zone_get_from_db()' to make those functions more readable.
This commit is contained in:
Matthijs Mekking
2021-04-13 11:26:26 +02:00
parent 032110bd2e
commit 8fcbef2423
+34 -95
View File
@@ -5455,43 +5455,42 @@ invalidate_rdataset:
return (result);
}
#define SET_IF_NOT_NULL(obj, val) \
if (obj != NULL) { \
*obj = val; \
}
#define SET_SOA_VALUES(soattl_v, serial_v, refresh_v, retry_v, expire_v, \
minimum_v) \
{ \
SET_IF_NOT_NULL(soattl, soattl_v); \
SET_IF_NOT_NULL(serial, serial_v); \
SET_IF_NOT_NULL(refresh, refresh_v); \
SET_IF_NOT_NULL(retry, retry_v); \
SET_IF_NOT_NULL(expire, expire_v); \
SET_IF_NOT_NULL(minimum, minimum_v); \
}
#define CLR_SOA_VALUES() \
{ \
SET_SOA_VALUES(0, 0, 0, 0, 0, 0); \
}
static isc_result_t
zone_load_soa_rr(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
unsigned int *soacount, uint32_t *soattl, uint32_t *serial,
uint32_t *refresh, uint32_t *retry, uint32_t *expire,
uint32_t *minimum) {
isc_result_t result;
unsigned int count;
unsigned int count = 0;
dns_rdataset_t rdataset;
dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdata_soa_t soa;
dns_rdataset_init(&rdataset);
result = dns_db_findrdataset(db, node, version, dns_rdatatype_soa,
dns_rdatatype_none, 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND) {
INSIST(!dns_rdataset_isassociated(&rdataset));
if (soacount != NULL) {
*soacount = 0;
}
if (soattl != NULL) {
*soattl = 0;
}
if (serial != NULL) {
*serial = 0;
}
if (refresh != NULL) {
*refresh = 0;
}
if (retry != NULL) {
*retry = 0;
}
if (expire != NULL) {
*expire = 0;
}
if (minimum != NULL) {
*minimum = 0;
}
result = ISC_R_SUCCESS;
goto invalidate_rdataset;
}
@@ -5500,17 +5499,16 @@ zone_load_soa_rr(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
goto invalidate_rdataset;
}
count = 0;
result = dns_rdataset_first(&rdataset);
while (result == ISC_R_SUCCESS) {
dns_rdata_init(&rdata);
dns_rdataset_current(&rdataset, &rdata);
count++;
if (count == 1) {
dns_rdata_soa_t soa;
result = dns_rdata_tostruct(&rdata, &soa, NULL);
if (soattl != NULL) {
*soattl = rdataset.ttl;
}
SET_SOA_VALUES(rdataset.ttl, soa.serial, soa.refresh,
soa.retry, soa.expire, soa.minimum);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
}
@@ -5519,53 +5517,14 @@ zone_load_soa_rr(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
}
dns_rdataset_disassociate(&rdataset);
if (soacount != NULL) {
*soacount = count;
}
if (count > 0) {
if (serial != NULL) {
*serial = soa.serial;
}
if (refresh != NULL) {
*refresh = soa.refresh;
}
if (retry != NULL) {
*retry = soa.retry;
}
if (expire != NULL) {
*expire = soa.expire;
}
if (minimum != NULL) {
*minimum = soa.minimum;
}
} else {
if (soacount != NULL) {
*soacount = 0;
}
if (soattl != NULL) {
*soattl = 0;
}
if (serial != NULL) {
*serial = 0;
}
if (refresh != NULL) {
*refresh = 0;
}
if (retry != NULL) {
*retry = 0;
}
if (expire != NULL) {
*expire = 0;
}
if (minimum != NULL) {
*minimum = 0;
}
}
result = ISC_R_SUCCESS;
invalidate_rdataset:
SET_IF_NOT_NULL(soacount, count);
if (count == 0) {
CLR_SOA_VALUES();
}
dns_rdataset_invalidate(&rdataset);
return (result);
@@ -5589,30 +5548,10 @@ zone_get_from_db(dns_zone_t *zone, dns_db_t *db, unsigned int *nscount,
dns_db_currentversion(db, &version);
if (nscount != NULL) {
*nscount = 0;
}
if (soacount != NULL) {
*soacount = 0;
}
if (soattl != NULL) {
*soattl = 0;
}
if (serial != NULL) {
*serial = 0;
}
if (refresh != NULL) {
*refresh = 0;
}
if (retry != NULL) {
*retry = 0;
}
if (expire != NULL) {
*expire = 0;
}
if (errors != NULL) {
*errors = 0;
}
SET_IF_NOT_NULL(nscount, 0);
SET_IF_NOT_NULL(soacount, 0);
SET_IF_NOT_NULL(errors, 0);
CLR_SOA_VALUES();
node = NULL;
result = dns_db_findnode(db, &zone->origin, false, &node);