time_t axfrStart = time(nullptr);
time_t axfrNow = time(nullptr);
- vector<DNSRecord> v;
+ auto zonemd = pdns::ZoneMD(d_zone);
while (axfr.getChunk(nop, &chunk, (axfrStart + axfrTimeout - axfrNow))) {
for (auto& dr : chunk) {
if (config.d_zonemd != pdns::ZoneMD::Config::Ignore) {
- v.push_back(dr);
+ zonemd.readRecord(dr);
}
parseDRForCache(dr);
}
}
}
if (config.d_zonemd != pdns::ZoneMD::Config::Ignore) {
- auto zonemd = pdns::ZoneMD(d_zone);
- zonemd.readRecords(v);
bool validationDone, validationSuccess;
zonemd.verify(validationDone, validationSuccess);
if (!validationDone) {
zpt.setMaxGenerateSteps(1);
zpt.setMaxIncludes(0);
- std::vector<DNSRecord> v;
+ auto zonemd = pdns::ZoneMD(d_zone);
while (zpt.get(drr)) {
DNSRecord dr(drr);
if (config.d_zonemd != pdns::ZoneMD::Config::Ignore) {
- v.push_back(dr);
+ zonemd.readRecord(dr);
}
parseDRForCache(dr);
}
if (config.d_zonemd != pdns::ZoneMD::Config::Ignore) {
- auto zonemd = pdns::ZoneMD(d_zone);
- zonemd.readRecords(v);
bool validationDone, validationSuccess;
zonemd.verify(validationDone, validationSuccess);
if (!validationDone) {
void pdns::ZoneMD::readRecords(const vector<DNSRecord>& records)
{
for (auto& record : records) {
- if (!record.d_name.isPartOf(d_zone) && record.d_name != d_zone) {
- continue;
- }
- if (record.d_type == QType::SOA && d_soaRecordContent) {
- continue;
- }
+ readRecord(record);
+ }
+}
- if (record.d_type == QType::SOA && record.d_name == d_zone) {
- d_soaRecordContent = std::dynamic_pointer_cast<SOARecordContent>(record.d_content);
+void pdns::ZoneMD::readRecord(const DNSRecord& record)
+{
+ if (!record.d_name.isPartOf(d_zone) && record.d_name != d_zone) {
+ return;
}
- if (record.d_type == QType::ZONEMD && record.d_name == d_zone) {
- auto zonemd = std::dynamic_pointer_cast<ZONEMDRecordContent>(record.d_content);
- auto inserted = d_zonemdRecords.insert({pair(zonemd->d_scheme, zonemd->d_hashalgo), {zonemd, false}});
- if (!inserted.second) {
- // Mark as duplicate
- inserted.first->second.duplicate = true;
- }
+ if (record.d_type == QType::SOA && d_soaRecordContent) {
+ return;
+ }
+
+ if (record.d_type == QType::SOA && record.d_name == d_zone) {
+ d_soaRecordContent = std::dynamic_pointer_cast<SOARecordContent>(record.d_content);
+ }
+ if (record.d_type == QType::ZONEMD && record.d_name == d_zone) {
+ auto zonemd = std::dynamic_pointer_cast<ZONEMDRecordContent>(record.d_content);
+ auto inserted = d_zonemdRecords.insert({pair(zonemd->d_scheme, zonemd->d_hashalgo), {zonemd, false}});
+ if (!inserted.second) {
+ // Mark as duplicate
+ inserted.first->second.duplicate = true;
}
- RRSetKey_t key = std::pair(record.d_name, record.d_type);
- d_resourceRecordSets[key].push_back(record.d_content);
- d_resourceRecordSetTTLs[key] = record.d_ttl;
}
+ RRSetKey_t key = std::pair(record.d_name, record.d_type);
+ d_resourceRecordSets[key].push_back(record.d_content);
+ d_resourceRecordSetTTLs[key] = record.d_ttl;
}
void pdns::ZoneMD::verify(bool& validationDone, bool& validationOK)