]> git.ipfire.org Git - thirdparty/pdns.git/blobdiff - pdns/sortlist.cc
auth: switch circleci mssql image
[thirdparty/pdns.git] / pdns / sortlist.cc
index e5a03508daf10b9ba17198061290998f47cffd17..c1743389d205e70d27d9f5d928948f21d37f04dd 100644 (file)
@@ -26,10 +26,10 @@ void SortList::addEntry(const Netmask& formask, const Netmask& valmask, int orde
     ++order;
   }
   //  cout<<"Adding for netmask "<<formask.toString()<<" the order instruction that "<<valmask.toString()<<" is order "<<order<<endl;
-  d_sortlist[formask].d_orders[valmask]=order;
+  d_sortlist.insert(formask).second.d_orders.insert(valmask).second=order;
 }
 
-std::unique_ptr<SortListOrderCmp> SortList::getOrderCmp(const ComboAddress& who)
+std::unique_ptr<SortListOrderCmp> SortList::getOrderCmp(const ComboAddress& who) const
 {
   if(!d_sortlist.match(who)) {
     return std::unique_ptr<SortListOrderCmp>();
@@ -39,36 +39,21 @@ std::unique_ptr<SortListOrderCmp> SortList::getOrderCmp(const ComboAddress& who)
   return make_unique<SortListOrderCmp>(fnd->second);
 }
 
-bool SortListOrderCmp::operator()(const ComboAddress& a, const ComboAddress& b) const
-{
-  int aOrder=std::numeric_limits<int>::max();
-  int bOrder=aOrder;
-
-  if(d_slo.d_orders.match(a))
-    aOrder = d_slo.d_orders[a];
-  if(d_slo.d_orders.match(b))
-    bOrder = d_slo.d_orders[b];
-
-  return aOrder < bOrder;
-}
-
-static ComboAddress getAddr(const DNSRecord& dr)
-{
-  if(auto addr=getRR<ARecordContent>(dr)) {
-    return addr->getCA();
-  }
-  else
-    return getRR<AAAARecordContent>(dr)->getCA();
-}
+// call this with **stable_sort**
 bool SortListOrderCmp::operator()(const DNSRecord& ar, const DNSRecord& br) const
 {
-  if(ar.d_type < br.d_type)
+  bool aAddr = (ar.d_type == QType::A || ar.d_type == QType::AAAA);
+  bool bAddr = (br.d_type == QType::A || br.d_type == QType::AAAA);
+
+  // anything address related is always 'larger', rest is equal
+  
+  if(aAddr && !bAddr)
+    return false;
+  else if(!aAddr && bAddr)
     return true;
-  if(ar.d_type > br.d_type)
+  else if(!aAddr && !bAddr)
     return false;
-
-  if(ar.d_type != QType::A && ar.d_type != QType::AAAA) 
-    return false;  // all other types are equal among themselves
+  
 
   int aOrder=std::numeric_limits<int>::max();
   int bOrder=aOrder;