]> git.ipfire.org Git - thirdparty/pdns.git/blobdiff - pdns/communicator.hh
rec: ensure correct service user on debian
[thirdparty/pdns.git] / pdns / communicator.hh
index babab1cfb15ce76a83e74d7affdc3db0cf25927a..c63534dc232b5fa709eba136905c9bfcde208645 100644 (file)
@@ -47,7 +47,7 @@ using namespace boost::multi_index;
 struct SuckRequest
 {
   DNSName domain;
-  string master;
+  ComboAddress master;
   bool operator<(const SuckRequest& b) const
   {
     return tie(domain, master) < tie(b.domain, b.master);
@@ -167,7 +167,7 @@ public:
   
   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);
@@ -187,12 +187,13 @@ public:
   }
   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);
 
@@ -207,7 +208,14 @@ private:
   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;
@@ -243,18 +251,32 @@ private:
 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;
   }
@@ -274,7 +296,7 @@ private:
         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));