]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
implement an official pretty ordering for DNSRecords and use it
authorbert hubert <bert.hubert@powerdns.com>
Mon, 18 Apr 2016 11:05:25 +0000 (13:05 +0200)
committerbert hubert <bert.hubert@powerdns.com>
Mon, 18 Apr 2016 11:05:25 +0000 (13:05 +0200)
pdns/dnsparser.hh
pdns/pdnsutil.cc

index baf3a82a7166b42c840cc27766f7bf9bfc17a777..a0d6a727ace5e6aeae571e741e573a8321e05248 100644 (file)
@@ -286,6 +286,33 @@ struct DNSRecord
     return lzrp < rzrp;
   }
 
+  // this orders in canonical order and keeps the SOA record on top
+  static bool prettyCompare(const DNSRecord& a, const DNSRecord& b) 
+  {
+    auto aType = (a.d_type == QType::SOA) ? 0 : a.d_type; 
+    auto bType = (b.d_type == QType::SOA) ? 0 : b.d_type; 
+
+    if(a.d_name.canonCompare(b.d_name))
+      return true;
+    if(b.d_name.canonCompare(a.d_name))
+      return false;
+
+    if(tie(aType, a.d_class, a.d_ttl) < tie(bType, b.d_class, b.d_ttl))
+      return true;
+    
+    if(tie(aType, a.d_class, a.d_ttl) != tie(bType, b.d_class, b.d_ttl))
+      return false;
+    
+    string lzrp, rzrp;
+    if(a.d_content)
+      lzrp=toLower(a.d_content->getZoneRepresentation());
+    if(b.d_content)
+      rzrp=toLower(b.d_content->getZoneRepresentation());
+    
+    return lzrp < rzrp;
+  }
+
+
   bool operator==(const DNSRecord& rhs) const
   {
     string lzrp, rzrp;
index b664268918112e8c6505f773ba6983898787940f..98a9819722e954d249e492a89f95f89add391f86 100644 (file)
@@ -923,16 +923,6 @@ int clearZone(DNSSECKeeper& dk, const DNSName &zone) {
   return EXIT_SUCCESS;
 }
 
-bool prettyDROrder(const DNSRecord& a, const DNSRecord& b) 
-{
-  if(a.d_type == QType::SOA && b.d_type != QType::SOA)
-    return true;
-  if(a.d_type != QType::SOA && b.d_type == QType::SOA)
-    return false;
-
-  return a<b;
-}
-
 int editZone(DNSSECKeeper& dk, const DNSName &zone) {
   UeberBackend B;
   DomainInfo di;
@@ -975,7 +965,7 @@ int editZone(DNSSECKeeper& dk, const DNSName &zone) {
       DNSRecord dr(rr);
       pre.push_back(dr);
     }
-    sort(pre.begin(), pre.end(), prettyDROrder);
+    sort(pre.begin(), pre.end(), DNSRecord::prettyCompare);
     for(const auto& dr : pre) {
       ostringstream os;
       os<<dr.d_name<<"\t"<<dr.d_ttl<<"\tIN\t"<<DNSRecordContent::NumberToType(dr.d_type)<<"\t"<<dr.d_content->getZoneRepresentation(true)<<endl;
@@ -1018,7 +1008,7 @@ int editZone(DNSSECKeeper& dk, const DNSName &zone) {
       goto reAsk;
     }
   }
-  sort(post.begin(), post.end(), prettyDROrder);
+  sort(post.begin(), post.end(), DNSRecord::prettyCompare);
   checkrr.clear();
 
   for(const DNSRecord& rr : post) {
@@ -1048,7 +1038,7 @@ int editZone(DNSSECKeeper& dk, const DNSName &zone) {
   vector<DNSRecord> diff;
 
   map<pair<DNSName,uint16_t>, string> changed;
-  set_difference(pre.cbegin(), pre.cend(), post.cbegin(), post.cend(), back_inserter(diff), prettyDROrder);
+  set_difference(pre.cbegin(), pre.cend(), post.cbegin(), post.cend(), back_inserter(diff), DNSRecord::prettyCompare);
   for(const auto& d : diff) {
     ostringstream str;
     str<<'-'<< d.d_name <<" "<<d.d_ttl<<" IN "<<DNSRecordContent::NumberToType(d.d_type)<<" "<<d.d_content->getZoneRepresentation(true)<<endl;
@@ -1056,7 +1046,7 @@ int editZone(DNSSECKeeper& dk, const DNSName &zone) {
 
   }
   diff.clear();
-  set_difference(post.cbegin(), post.cend(), pre.cbegin(), pre.cend(), back_inserter(diff), prettyDROrder);
+  set_difference(post.cbegin(), post.cend(), pre.cbegin(), pre.cend(), back_inserter(diff), DNSRecord::prettyCompare);
   for(const auto& d : diff) {
     ostringstream str;