From ec2b2453ed2e34110a2f0549a65859f08dfe2272 Mon Sep 17 00:00:00 2001 From: Bert Hubert Date: Mon, 14 Feb 2011 14:10:07 +0000 Subject: [PATCH] make master notification sender do its utmost to gather IPv6 addresses too. We sorta didn't try. git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2016 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- pdns/mastercommunicator.cc | 44 +++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/pdns/mastercommunicator.cc b/pdns/mastercommunicator.cc index 2b98ba2cab..52f8682920 100644 --- a/pdns/mastercommunicator.cc +++ b/pdns/mastercommunicator.cc @@ -38,29 +38,33 @@ class FindNS { public: - vectorlookup(const string &name, DNSBackend *B) + vector lookup(const string &name, DNSBackend *B) { - vectoraddresses; - 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(*h_addr_list); - os<<(int)*p++<<"."; - os<<(int)*p++<<"."; - os<<(int)*p++<<"."; - os<<(int)*p++; - - addresses.push_back(os.str()); + vector 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 ips; DNSResourceRecord rr; - setnsset; + set nsset; B->lookup(QType(QType::NS),domain); while(B->get(rr)) nsset.insert(rr.content); for(set::const_iterator j=nsset.begin();j!=nsset.end();++j) { - vectornsips=d_fns.lookup(*j, B); + vector nsips=d_fns.lookup(*j, B); if(nsips.empty()) L<::const_iterator k=nsips.begin();k!=nsips.end();++k) -- 2.47.3