Semaphore d_any_sem;
time_t d_tickinterval;
set<DomainInfo> d_tocheck;
- vector<DNSPacket> d_potentialsupermasters;
+ struct cmp {
+ bool operator()(const DNSPacket& a, const DNSPacket& b) {
+ return a.qdomain < b.qdomain;
+ };
+ };
+
+ std::set<DNSPacket, cmp> d_potentialsupermasters;
+
set<string> d_alsoNotify;
NotificationQueue d_nq;
NetmaskGroup d_onlyNotify;
d_remote=*s;
}
-bool DNSPacket::hasEDNSSubnet()
+bool DNSPacket::hasEDNSSubnet() const
{
return d_haveednssubnet;
}
void setMaxReplyLen(int bytes); //!< set the max reply len (used when retrieving from the packet cache, and this changed)
bool couldBeCached(); //!< returns 0 if this query should bypass the packet cache
- bool hasEDNSSubnet();
+ bool hasEDNSSubnet() const;
bool hasEDNS();
uint8_t getEDNSVersion() const { return d_ednsversion; };
void setEDNSRcode(uint16_t extRCode)
}
}
-int PacketHandler::trySuperMasterSynchronous(DNSPacket *p, const DNSName& tsigkeyname)
+int PacketHandler::trySuperMasterSynchronous(const DNSPacket *p, const DNSName& tsigkeyname)
{
string remote = p->getRemote().toString();
if(p->hasEDNSSubnet() && ::arg().contains("trusted-notification-proxy", remote)) {
UeberBackend *getBackend();
- int trySuperMasterSynchronous(DNSPacket *p, const DNSName& tsigkeyname);
+ int trySuperMasterSynchronous(const DNSPacket *p, const DNSName& tsigkeyname);
static NetmaskGroup s_allowNotifyFrom;
static set<string> s_forwardNotify;
{
Lock l(&d_lock);
DNSPacket ours = *p;
- d_potentialsupermasters.push_back(ours);
- d_any_sem.post(); // kick the loop!
+ if(d_potentialsupermasters.insert(ours).second)
+ d_any_sem.post(); // kick the loop!
}
void CommunicatorClass::slaveRefresh(PacketHandler *P)
UeberBackend *B=P->getBackend();
vector<DomainInfo> rdomains;
- vector<DomainNotificationInfo> sdomains;
- vector<DNSPacket> trysuperdomains;
-
+ vector<DomainNotificationInfo> sdomains;
+ set<DNSPacket, cmp> trysuperdomains;
{
Lock l(&d_lock);
rdomains.insert(rdomains.end(), d_tocheck.begin(), d_tocheck.end());
d_tocheck.clear();
- trysuperdomains.insert(trysuperdomains.end(), d_potentialsupermasters.begin(), d_potentialsupermasters.end());
+
+ trysuperdomains = d_potentialsupermasters;
d_potentialsupermasters.clear();
}
- for(DNSPacket& dp : trysuperdomains) {
+ for(const DNSPacket& dp : trysuperdomains) {
// get the TSIG key name
TSIGRecordContent trc;
DNSName tsigkeyname;