]> granicus.if.org Git - pdns/commitdiff
make master notification sender do its utmost to gather IPv6 addresses too. We sorta...
authorBert Hubert <bert.hubert@netherlabs.nl>
Mon, 14 Feb 2011 14:10:07 +0000 (14:10 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Mon, 14 Feb 2011 14:10:07 +0000 (14:10 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2016 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/mastercommunicator.cc

index 2b98ba2cab2c6ab7f88c3d57a6d7130ab4053d66..52f86829201ebb248a6378a92f300784bc9f6b71 100644 (file)
 class FindNS
 {
 public:
-  vector<string>lookup(const string &name, DNSBackend *B)
+  vector<string> lookup(const string &name, DNSBackend *B)
   {
-    vector<string>addresses;
-    struct hostent *h;
-    h=gethostbyname(name.c_str());
-
-    if(h) {
-      for(char **h_addr_list=h->h_addr_list;*h_addr_list;++h_addr_list) {
-        ostringstream os;
-        unsigned char *p=reinterpret_cast<unsigned char *>(*h_addr_list);
-        os<<(int)*p++<<".";
-        os<<(int)*p++<<".";
-        os<<(int)*p++<<".";
-        os<<(int)*p++;
-
-        addresses.push_back(os.str());
+    vector<string> addresses;
+    
+    struct addrinfo* res;
+    struct addrinfo hints;
+    memset(&hints, 0, sizeof(hints));
+    
+    for(int n = 0; n < 2; ++n) {
+      hints.ai_family = n ? AF_INET : AF_INET6;
+      ComboAddress remote;
+      remote.sin4.sin_family = AF_INET6;
+      if(!getaddrinfo(name.c_str(), 0, &hints, &res)) { 
+        struct addrinfo* address = res;
+        do {
+          memcpy(&remote, address->ai_addr, address->ai_addrlen);
+          addresses.push_back(remote.toString());
+        } while((address = address->ai_next));
+        freeaddrinfo(res);
       }
     }
-
-    B->lookup(QType(QType::A),name);
+    
+    B->lookup(QType(QType::ANY),name);
     DNSResourceRecord rr;
     while(B->get(rr)) 
-      addresses.push_back(rr.content);   // SOL if you have a CNAME for an NS
+      if(rr.qtype.getCode() == QType::A || rr.qtype.getCode()==QType::AAAA)
+        addresses.push_back(rr.content);   // SOL if you have a CNAME for an NS
 
     return addresses;
   }
@@ -71,14 +75,14 @@ void CommunicatorClass::queueNotifyDomain(const string &domain, DNSBackend *B)
   set<string> ips;
   
   DNSResourceRecord rr;
-  set<string>nsset;
+  set<string> nsset;
 
   B->lookup(QType(QType::NS),domain);
   while(B->get(rr)) 
     nsset.insert(rr.content);
   
   for(set<string>::const_iterator j=nsset.begin();j!=nsset.end();++j) {
-    vector<string>nsips=d_fns.lookup(*j, B);
+    vector<string> nsips=d_fns.lookup(*j, B);
     if(nsips.empty())
       L<<Logger::Warning<<"Unable to queue notification of domain '"<<domain<<"': nameservers do not resolve!"<<endl;
     for(vector<string>::const_iterator k=nsips.begin();k!=nsips.end();++k)