]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add DNS_VECHEADER_FOREACH
authorAlessio Podda <alessio@isc.org>
Tue, 9 Dec 2025 20:05:27 +0000 (21:05 +0100)
committerAlessio Podda <alessio@isc.org>
Wed, 10 Dec 2025 11:18:34 +0000 (12:18 +0100)
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.

lib/dns/qpzone.c
lib/dns/rdatavec_p.h

index 706d218ff21d096a17cae849721a09070e5b5ab0..d2317774f2122ea2c853018dbc68048ae6ffc902 100644 (file)
@@ -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);
 
index f26371656abde4390b7bbd7e3183b3e6b9c415c0..62717f10f72852d1cacdb102b02e0f1ded2dfb15 100644 (file)
@@ -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 */