]> git.ipfire.org Git - thirdparty/pdns.git/blobdiff - pdns/ixfrutils.cc
rec: ensure correct service user on debian
[thirdparty/pdns.git] / pdns / ixfrutils.cc
index c7757042baa263aff47e6754d009166854492467..cd5f7155c6e4229e031862dec96a0a5bc4e449dd 100644 (file)
@@ -99,8 +99,10 @@ uint32_t getSerialFromRecords(const records_t& records, DNSRecord& soaret)
 
   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;
 }
@@ -134,7 +136,9 @@ void writeZoneToDisk(const records_t& records, const DNSName& zone, const std::s
   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)
@@ -143,9 +147,7 @@ void loadZoneFromDisk(records_t& records, const string& fname, const DNSName& zo
 
   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);
@@ -166,7 +168,7 @@ void loadZoneFromDisk(records_t& records, const string& fname, const DNSName& zo
  * 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;
@@ -174,6 +176,7 @@ void loadSOAFromDisk(const DNSName& zone, const string& fname, shared_ptr<SOARec
   while(zpt.get(rr)) {
     if (rr.qtype == QType::SOA) {
       soa = getRR<SOARecordContent>(DNSRecord(rr));
+      soaTTL = rr.ttl;
       return;
     }
   }