]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/sortlist.cc
fix up sortlist to removal of confusing operator[] from netmasktree
[thirdparty/pdns.git] / pdns / sortlist.cc
1 #include "sortlist.hh"
2 #include "dnsrecords.hh"
3
4 void SortList::clear()
5 {
6 d_sortlist.clear();
7 }
8
9 int SortList::getMaxOrder(const Netmask& formask) const
10 {
11 int order=0;
12
13 auto place = d_sortlist.lookup(formask);
14 if(place && place->first == formask) {
15 for(const auto& o : place->second.d_orders)
16 order = std::max(order, o->second); // aki, shouldn't this be o.second?
17 }
18
19 return order;
20 }
21
22 void SortList::addEntry(const Netmask& formask, const Netmask& valmask, int order)
23 {
24 if(order < 0) {
25 order=getMaxOrder(formask);
26 ++order;
27 }
28 // cout<<"Adding for netmask "<<formask.toString()<<" the order instruction that "<<valmask.toString()<<" is order "<<order<<endl;
29 d_sortlist.insert(formask).second.d_orders.insert(valmask).second=order;
30 }
31
32 std::unique_ptr<SortListOrderCmp> SortList::getOrderCmp(const ComboAddress& who)
33 {
34 if(!d_sortlist.match(who)) {
35 return std::unique_ptr<SortListOrderCmp>();
36 }
37 auto fnd = d_sortlist.lookup(who);
38 // cerr<<"Returning sort order for "<<who.toString()<<", have "<<fnd->second.d_orders.size()<<" entries"<<endl;
39 return make_unique<SortListOrderCmp>(fnd->second);
40 }
41
42 bool SortListOrderCmp::operator()(const ComboAddress& a, const ComboAddress& b) const
43 {
44 int aOrder=std::numeric_limits<int>::max();
45 int bOrder=aOrder;
46
47 if(d_slo.d_orders.match(a))
48 aOrder = d_slo.d_orders.lookup(a)->second;
49 if(d_slo.d_orders.match(b))
50 bOrder = d_slo.d_orders.lookup(b)->second;
51
52 return aOrder < bOrder;
53 }
54
55 static ComboAddress getAddr(const DNSRecord& dr)
56 {
57 if(auto addr=getRR<ARecordContent>(dr)) {
58 return addr->getCA();
59 }
60 else
61 return getRR<AAAARecordContent>(dr)->getCA();
62 }
63 bool SortListOrderCmp::operator()(const DNSRecord& ar, const DNSRecord& br) const
64 {
65 if(ar.d_type < br.d_type)
66 return true;
67 if(ar.d_type > br.d_type)
68 return false;
69
70 if(ar.d_type != QType::A && ar.d_type != QType::AAAA)
71 return false; // all other types are equal among themselves
72
73 int aOrder=std::numeric_limits<int>::max();
74 int bOrder=aOrder;
75
76 ComboAddress a=getAddr(ar), b=getAddr(br);
77
78 if(d_slo.d_orders.match(a))
79 aOrder = d_slo.d_orders.lookup(a)->second;
80 else {
81 // cout<<"Could not find anything for "<<a.toString()<<" in our orders!"<<endl;
82 }
83 if(d_slo.d_orders.match(b))
84 bOrder = d_slo.d_orders.lookup(b)->second;
85 else {
86 // cout<<"Could not find anything for "<<b.toString()<<" in our orders!"<<endl;
87 }
88 return aOrder < bOrder;
89 }