diff --git a/lib/dns/db.c b/lib/dns/db.c index a1e5bb44c1..24529cae0c 100644 --- a/lib/dns/db.c +++ b/lib/dns/db.c @@ -21,11 +21,13 @@ #include +#include #include #include #include #include +#include #include /*** @@ -586,3 +588,45 @@ dns_db_deleterdataset(dns_db_t *db, dns_dbnode_t *node, return ((db->methods->deleterdataset)(db, node, version, type, covers)); } + +isc_result_t +dns_db_getsoaserial(dns_db_t *db, dns_dbversion_t *ver, isc_uint32_t *serialp) +{ + isc_result_t result; + dns_dbnode_t *node = NULL; + dns_rdataset_t rdataset; + dns_rdata_t rdata; + isc_buffer_t buffer; + + REQUIRE(dns_db_iszone(db)); + + result = dns_db_findnode(db, dns_db_origin(db), ISC_FALSE, &node); + if (result != ISC_R_SUCCESS) + return (result); + + dns_rdataset_init(&rdataset); + result = dns_db_findrdataset(db, node, ver, dns_rdatatype_soa, 0, + (isc_stdtime_t)0, &rdataset, NULL); + if (result != ISC_R_SUCCESS) + goto freenode; + + result = dns_rdataset_first(&rdataset); + if (result != ISC_R_SUCCESS) + goto freerdataset; + dns_rdataset_current(&rdataset, &rdata); + + INSIST(rdata.length > 20); + isc_buffer_init(&buffer, rdata.data, rdata.length); + isc_buffer_add(&buffer, rdata.length); + isc_buffer_forward(&buffer, rdata.length - 20); + *serialp = isc_buffer_getuint32(&buffer); + + result = ISC_R_SUCCESS; + + freerdataset: + dns_rdataset_disassociate(&rdataset); + + freenode: + dns_db_detachnode(db, &node); + return (result); +} diff --git a/lib/dns/include/dns/db.h b/lib/dns/include/dns/db.h index 17a57a54b8..814088e4ce 100644 --- a/lib/dns/include/dns/db.h +++ b/lib/dns/include/dns/db.h @@ -1113,6 +1113,16 @@ dns_db_deleterdataset(dns_db_t *db, dns_dbnode_t *node, * implementation used. */ +isc_result_t +dns_db_getsoaserial(dns_db_t *db, dns_dbversion_t *ver, isc_uint32_t *serialp); +/* + * Get the current SOA serial number from a zone database. + * + * Requires: + * 'db' is a valid database with zone semantics. + * 'ver' is a valid version. + */ + ISC_LANG_ENDDECLS #endif /* DNS_DB_H */ diff --git a/lib/dns/include/dns/journal.h b/lib/dns/include/dns/journal.h index efcbcbbe11..2969ed8a7b 100644 --- a/lib/dns/include/dns/journal.h +++ b/lib/dns/include/dns/journal.h @@ -303,16 +303,6 @@ dns_soa_setserial(isc_uint32_t val, dns_rdata_t *rdata); * rdata refers to the rdata of a well-formed SOA record. */ -isc_result_t -dns_db_getsoaserial(dns_db_t *db, dns_dbversion_t *ver, isc_uint32_t *serialp); -/* - * Get the current SOA serial number from a zone database. - * - * Requires: - * 'db' is a valid database with zone semantics. - * 'ver' is a valid version. - */ - isc_result_t dns_db_createsoatuple(dns_db_t *db, dns_dbversion_t *ver, isc_mem_t *mctx, dns_diffop_t op, dns_difftuple_t **tp); diff --git a/lib/dns/journal.c b/lib/dns/journal.c index 097a77b9ab..94983d0a63 100644 --- a/lib/dns/journal.c +++ b/lib/dns/journal.c @@ -121,42 +121,6 @@ dns_soa_setserial(isc_uint32_t val, dns_rdata_t *rdata) { encode_uint32(val, rdata->data + rdata->length - 20); } -isc_result_t -dns_db_getsoaserial(dns_db_t *db, dns_dbversion_t *ver, isc_uint32_t *serialp) -{ - isc_result_t result; - dns_dbnode_t *node = NULL; - dns_rdataset_t rdataset; - dns_rdata_t rdata; - - REQUIRE(dns_db_iszone(db)); - - result = dns_db_findnode(db, dns_db_origin(db), ISC_FALSE, &node); - if (result != ISC_R_SUCCESS) - return (result); - - dns_rdataset_init(&rdataset); - result = dns_db_findrdataset(db, node, ver, dns_rdatatype_soa, 0, - (isc_stdtime_t) 0, &rdataset, NULL); - if (result != ISC_R_SUCCESS) - goto freenode; - - result = dns_rdataset_first(&rdataset); - if (result != ISC_R_SUCCESS) - goto freerdataset; - dns_rdataset_current(&rdataset, &rdata); - - *serialp = dns_soa_getserial(&rdata); - result = ISC_R_SUCCESS; - - freerdataset: - dns_rdataset_disassociate(&rdataset); - - freenode: - dns_db_detachnode(db, &node); - return (result); -} - isc_result_t dns_db_createsoatuple(dns_db_t *db, dns_dbversion_t *ver, isc_mem_t *mctx, dns_diffop_t op, dns_difftuple_t **tp) @@ -228,7 +192,7 @@ dns_difftuple_create(isc_mem_t *mctx, t->mctx = mctx; t->op = op; - datap = (unsigned char *) (t + 1); + datap = (unsigned char *)(t + 1); memcpy(datap, name->ndata, name->length); dns_name_init(&t->name, NULL); @@ -248,7 +212,7 @@ dns_difftuple_create(isc_mem_t *mctx, ISC_LINK_INIT(&t->rdata, link); t->magic = DNS_DIFFTUPLE_MAGIC; - INSIST(datap == (unsigned char *) t + size); + INSIST(datap == (unsigned char *)t + size); *tp = t; return (ISC_R_SUCCESS);