From: Alessio Podda Date: Tue, 9 Dec 2025 20:05:27 +0000 (+0100) Subject: Add DNS_VECHEADER_FOREACH X-Git-Tag: v9.21.17~42^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9d74a913019248f4ea8a787563b3ba1023826fc9;p=thirdparty%2Fbind9.git Add DNS_VECHEADER_FOREACH Add a FOREACH macro modelled around the DNS_RDATASET_FOREACH one, that uses vecheader directly. Useful when you want to manipulate a vecheader without binding it to avoid having to take the node lock inside qpzone.c. --- diff --git a/lib/dns/qpzone.c b/lib/dns/qpzone.c index 706d218ff21..d2317774f21 100644 --- a/lib/dns/qpzone.c +++ b/lib/dns/qpzone.c @@ -1076,10 +1076,7 @@ setnsec3parameters(dns_db_t *db, qpz_version_t *version) { */ rdatavec_iter_t iter; - for (isc_result_t res = vecheader_first(&iter, found, qpdb->common.rdclass); - res == ISC_R_SUCCESS; - res = vecheader_next(&iter)) - { + DNS_VECHEADER_FOREACH(&iter, found, qpdb->common.rdclass) { dns_rdata_t rdata = DNS_RDATA_INIT; vecheader_current(&iter, &rdata); @@ -2564,10 +2561,7 @@ matchparams(dns_vecheader_t *header, qpz_search_t *search) { REQUIRE(header->typepair == DNS_TYPEPAIR(dns_rdatatype_nsec3)); rdatavec_iter_t iter; - for (isc_result_t res = vecheader_first(&iter, header, search->qpdb->common.rdclass); - res == ISC_R_SUCCESS; - res = vecheader_next(&iter)) - { + DNS_VECHEADER_FOREACH(&iter, header, search->qpdb->common.rdclass) { dns_rdata_t rdata = DNS_RDATA_INIT; vecheader_current(&iter, &rdata); diff --git a/lib/dns/rdatavec_p.h b/lib/dns/rdatavec_p.h index f26371656ab..62717f10f72 100644 --- a/lib/dns/rdatavec_p.h +++ b/lib/dns/rdatavec_p.h @@ -67,3 +67,17 @@ vecheader_next(rdatavec_iter_t *iter); void vecheader_current(rdatavec_iter_t *iter, dns_rdata_t *rdata); + +/* clang-format off */ +/* + * An adaptation of DNS_RDATASET_FOREACH from rdataset.h. Used to manipulate a + * vecheader without going through the rdataset interface, e.g. in qpzone.c. + */ +#define DNS__VECHEADER_CONNECT(x,y) x##y +#define DNS__VECHEADER_CONCAT(x,y) DNS__VECHEADER_CONNECT(x,y) +#define DNS_VECHEADER_FOREACH_RES(iter, header, rdclass, res) \ + for (isc_result_t res = vecheader_first((iter), (header), (rdclass)); \ + res == ISC_R_SUCCESS; res = vecheader_next((iter))) +#define DNS_VECHEADER_FOREACH(iter, header, rdclass) \ + DNS_VECHEADER_FOREACH_RES(iter, header, rdclass, DNS__VECHEADER_CONCAT(x, __LINE__)) +/* clang-format on */