struct SuckRequest
{
DNSName domain;
- string master;
+ ComboAddress master;
bool operator<(const SuckRequest& b) const
{
return tie(domain, master) < tie(b.domain, b.master);
void drillHole(const DNSName &domain, const string &ip);
bool justNotified(const DNSName &domain, const string &ip);
- void addSuckRequest(const DNSName &domain, const string &master);
+ void addSuckRequest(const DNSName &domain, const ComboAddress& master);
void addSlaveCheckRequest(const DomainInfo& di, const ComboAddress& remote);
void addTrySuperMasterRequest(DNSPacket *p);
void notify(const DNSName &domain, const string &ip);
}
bool notifyDomain(const DNSName &domain);
private:
+ void loadArgsIntoSet(const char *listname, set<string> &listset);
void makeNotifySockets();
void queueNotifyDomain(const DomainInfo& di, UeberBackend* B);
int d_nsock4, d_nsock6;
map<pair<DNSName,string>,time_t>d_holes;
pthread_mutex_t d_holelock;
- void suck(const DNSName &domain, const string &remote);
+ void suck(const DNSName &domain, const ComboAddress& remote);
void ixfrSuck(const DNSName &domain, const TSIGTriplet& tt, const ComboAddress& laddr, const ComboAddress& remote, boost::scoped_ptr<AuthLua4>& pdl,
ZoneStatus& zs, vector<DNSRecord>* axfr);
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) const {
+ return a.qdomain < b.qdomain;
+ };
+ };
+
+ std::set<DNSPacket, cmp> d_potentialsupermasters;
+
set<string> d_alsoNotify;
NotificationQueue d_nq;
NetmaskGroup d_onlyNotify;
class FindNS
{
public:
- vector<string> lookup(const DNSName &name, UeberBackend *b)
+ vector<string> lookup(const DNSName &name, UeberBackend *b, const DNSName& zone)
{
vector<string> addresses;
this->resolve_name(&addresses, name);
if(b) {
- b->lookup(QType(QType::ANY),name);
- DNSZoneRecord rr;
- while(b->get(rr))
- if(rr.dr.d_type == QType::A || rr.dr.d_type==QType::AAAA)
+ b->lookup(QType(QType::ANY),name);
+ while (true) {
+ try {
+ DNSZoneRecord rr;
+ if (!b->get(rr))
+ break;
+ if (rr.dr.d_type == QType::A || rr.dr.d_type == QType::AAAA)
addresses.push_back(rr.dr.d_content->getZoneRepresentation()); // SOL if you have a CNAME for an NS
+ }
+ // After an exception, b can be inconsistent so break
+ catch (PDNSException &ae) {
+ g_log << Logger::Error << "Could not lookup address for nameserver " << name << " in zone " << zone << ", cannot notify: " << ae.reason << endl;
+ break;
+ }
+ catch (std::exception &e) {
+ g_log << Logger::Error << "Could not lookup address for nameserver " << name << " in zone " << zone << ", cannot notify: " << e.what() << endl;
+ break;
+ }
+ }
}
return addresses;
}
struct addrinfo* address = res;
do {
if (address->ai_addrlen <= sizeof(remote)) {
- memcpy(&remote, address->ai_addr, address->ai_addrlen);
+ remote.setSockaddr(address->ai_addr, address->ai_addrlen);
addresses->push_back(remote.toString());
}
} while((address = address->ai_next));