for(auto iter = found.first; iter != found.second; ++iter) {
auto soa = std::dynamic_pointer_cast<SOARecordContent>(iter->d_content);
- soaret = *iter;
- return soa->d_st.serial;
+ if (soa) {
+ soaret = *iter;
+ return soa->d_st.serial;
+ }
}
return 0;
}
writeRecords(fp, soarecord);
fclose(fp);
- rename( (fname+".partial").c_str(), fname.c_str());
+ if (rename( (fname+".partial").c_str(), fname.c_str()) != 0) {
+ throw std::runtime_error("Unable to move the zone file for " + zone.toLogString() + " from " + fname + ".partial to " + fname + ": " + string(strerror(errno)));
+ }
}
void loadZoneFromDisk(records_t& records, const string& fname, const DNSName& zone)
DNSResourceRecord rr;
bool seenSOA=false;
- unsigned int nrecords=0;
while(zpt.get(rr)) {
- ++nrecords;
if(rr.qtype.getCode() == QType::CNAME && rr.content.empty())
rr.content=".";
rr.qname = rr.qname.makeRelative(zone);
* Load the zone `zone` from `fname` and put the first found SOA into `soa`
* Does NOT check for nullptr
*/
-void loadSOAFromDisk(const DNSName& zone, const string& fname, shared_ptr<SOARecordContent>& soa)
+void loadSOAFromDisk(const DNSName& zone, const string& fname, shared_ptr<SOARecordContent>& soa, uint32_t& soaTTL)
{
ZoneParserTNG zpt(fname, zone);
DNSResourceRecord rr;
while(zpt.get(rr)) {
if (rr.qtype == QType::SOA) {
soa = getRR<SOARecordContent>(DNSRecord(rr));
+ soaTTL = rr.ttl;
return;
}
}