From d622042fb1a06038b59172a98d1f591a6b6138d9 Mon Sep 17 00:00:00 2001 From: bert hubert Date: Thu, 30 Nov 2017 23:22:26 +0100 Subject: [PATCH] make DomainInfo not carry IP addresses as strings. And some subsequent cleanups.. --- modules/bindbackend/bindbackend2.cc | 2 +- modules/bindbackend/bindbackend2.hh | 2 +- modules/ldapbackend/ldapbackend.cc | 6 +++-- modules/luabackend/private.cc | 2 +- modules/opendbxbackend/odbxbackend.cc | 7 +++++- modules/opendbxbackend/odbxprivate.cc | 7 +++++- modules/remotebackend/remotebackend.cc | 2 +- pdns/backends/gsql/gsqlbackend.cc | 17 +++++++++++--- pdns/bindparser.yy | 3 ++- pdns/bindparserclasses.hh | 2 +- pdns/communicator.hh | 6 ++--- pdns/dbdnsseckeeper.cc | 2 +- pdns/dnsbackend.hh | 2 +- pdns/dnsseckeeper.hh | 2 +- pdns/dynhandler.cc | 2 +- pdns/iputils.hh | 11 +++++++++ pdns/packethandler.cc | 10 ++++----- pdns/pdnsutil.cc | 6 ++--- pdns/resolver.cc | 18 +++++++-------- pdns/resolver.hh | 6 ++--- pdns/rfc2136handler.cc | 12 ++-------- pdns/slavecommunicator.cc | 31 +++++++++++++------------- pdns/test-bindparser_cc.cc | 3 ++- pdns/ws-auth.cc | 8 +++++-- pdns/zone2sql.cc | 6 ++--- 25 files changed, 102 insertions(+), 73 deletions(-) diff --git a/modules/bindbackend/bindbackend2.cc b/modules/bindbackend/bindbackend2.cc index 28a5b4295..3a1971fd2 100644 --- a/modules/bindbackend/bindbackend2.cc +++ b/modules/bindbackend/bindbackend2.cc @@ -1299,7 +1299,7 @@ bool Bind2Backend::createSlaveDomain(const string &ip, const DNSName& domain, co BB2DomainInfo bbd = createDomainEntry(domain, filename); bbd.d_kind = DomainInfo::Slave; - bbd.d_masters.push_back(ip); + bbd.d_masters.push_back(ComboAddress(ip, 53)); safePutBBDomainInfo(bbd); return true; } diff --git a/modules/bindbackend/bindbackend2.hh b/modules/bindbackend/bindbackend2.hh index c85003eef..76ce49908 100644 --- a/modules/bindbackend/bindbackend2.hh +++ b/modules/bindbackend/bindbackend2.hh @@ -162,7 +162,7 @@ public: DomainInfo::DomainKind d_kind; //!< the kind of domain string d_filename; //!< full absolute filename of the zone on disk string d_status; //!< message describing status of a domain, for human consumption - vector d_masters; //!< IP address of the master of this domain + vector d_masters; //!< IP address of the master of this domain set d_also_notify; //!< IP list of hosts to also notify LookButDontTouch d_records; //!< the actual records belonging to this domain time_t d_ctime; //!< last known ctime of the file on disk diff --git a/modules/ldapbackend/ldapbackend.cc b/modules/ldapbackend/ldapbackend.cc index f974b82c0..428c94f40 100644 --- a/modules/ldapbackend/ldapbackend.cc +++ b/modules/ldapbackend/ldapbackend.cc @@ -743,8 +743,10 @@ bool LdapBackend::getDomainInfo( const DNSName& domain, DomainInfo& di, bool get else di.notified_serial = 0; - if ( result.count( "PdnsDomainMaster" ) && !result["PdnsDomainMaster"].empty() ) - di.masters = result["PdnsDomainMaster"]; + if ( result.count( "PdnsDomainMaster" ) && !result["PdnsDomainMaster"].empty() ) { + for(const auto& m : result["PdnsDomainMaster"]) + di.masters.emplace_back(m, 53); + } if ( result.count( "PdnsDomainType" ) && !result["PdnsDomainType"].empty() ) { string kind = result["PdnsDomainType"][0]; diff --git a/modules/luabackend/private.cc b/modules/luabackend/private.cc index 480a50e04..78b2b5427 100644 --- a/modules/luabackend/private.cc +++ b/modules/luabackend/private.cc @@ -72,7 +72,7 @@ bool LUABackend::domaininfo_from_table(DomainInfo *di) { while (lua_next(lua, -2)) { value = lua_tostring(lua, -1); lua_pop(lua,1); - di->masters.push_back(value); + di->masters.push_back(ComboAddress(value, 53)); } } diff --git a/modules/opendbxbackend/odbxbackend.cc b/modules/opendbxbackend/odbxbackend.cc index 8187fa58a..debfa5080 100644 --- a/modules/opendbxbackend/odbxbackend.cc +++ b/modules/opendbxbackend/odbxbackend.cc @@ -141,7 +141,12 @@ bool OdbxBackend::getDomainInfo( const DNSName& domain, DomainInfo& di, bool get if( ( tmp = odbx_field_value( m_result, 3 ) ) != NULL ) { - stringtok(di.masters, string( tmp, odbx_field_length( m_result, 3 ) ), ", \t"); + vector masters; + stringtok(masters, string( tmp, odbx_field_length( m_result, 3 ) ), ", \t"); + for(const auto& m : masters) + { + di.masters.emplace_back(m, 53); + } } if( ( tmp = odbx_field_value( m_result, 2 ) ) != NULL ) diff --git a/modules/opendbxbackend/odbxprivate.cc b/modules/opendbxbackend/odbxprivate.cc index 0cf96a06d..03308d00b 100644 --- a/modules/opendbxbackend/odbxprivate.cc +++ b/modules/opendbxbackend/odbxprivate.cc @@ -231,7 +231,12 @@ bool OdbxBackend::getDomainList( const string& stmt, vector* list, b { if( ( tmp = odbx_field_value( m_result, 2 ) ) != NULL ) { - stringtok(di.masters, string( tmp, odbx_field_length( m_result, 2 )), ", \t" ); + vector masters; + stringtok(masters, string( tmp, odbx_field_length( m_result, 2 )), ", \t" ); + for(const auto& m : masters) + { + di.masters.emplace_back(m, 53); + } } if( ( tmp = odbx_field_value( m_result, 1 ) ) != NULL ) diff --git a/modules/remotebackend/remotebackend.cc b/modules/remotebackend/remotebackend.cc index 31d4e80d3..cc0af2ada 100644 --- a/modules/remotebackend/remotebackend.cc +++ b/modules/remotebackend/remotebackend.cc @@ -557,7 +557,7 @@ void RemoteBackend::parseDomainInfo(const Json &obj, DomainInfo &di) di.id = intFromJson(obj, "id", -1); di.zone = DNSName(stringFromJson(obj, "zone")); for(const auto& master: obj["masters"].array_items()) - di.masters.push_back(master.string_value()); + di.masters.push_back(ComboAddress(master.string_value(), 53)); di.notified_serial = static_cast(doubleFromJson(obj, "notified_serial", -1)); di.serial = static_cast(obj["serial"].number_value()); diff --git a/pdns/backends/gsql/gsqlbackend.cc b/pdns/backends/gsql/gsqlbackend.cc index 66ecb13b5..c20df8730 100644 --- a/pdns/backends/gsql/gsqlbackend.cc +++ b/pdns/backends/gsql/gsqlbackend.cc @@ -294,7 +294,10 @@ bool GSQLBackend::getDomainInfo(const DNSName &domain, DomainInfo &di, bool getS } catch (...) { return false; } - stringtok(di.masters, d_result[0][2], " ,\t"); + vector masters; + stringtok(masters, d_result[0][2], " ,\t"); + for(const auto& m : masters) + di.masters.emplace_back(m, 53); di.last_check=pdns_stou(d_result[0][3]); di.notified_serial = pdns_stou(d_result[0][4]); string type=d_result[0][5]; @@ -347,7 +350,12 @@ void GSQLBackend::getUnfreshSlaveInfos(vector *unfreshDomains) } catch (...) { continue; } - stringtok(sd.masters, d_result[n][2], ", \t"); + + vector masters; + stringtok(masters, d_result[n][2], ", \t"); + for(const auto& m : masters) + sd.masters.emplace_back(m, 53); + sd.last_check=pdns_stou(d_result[n][3]); sd.backend=this; sd.kind=DomainInfo::Slave; @@ -1251,7 +1259,10 @@ void GSQLBackend::getAllDomains(vector *domains, bool include_disabl } if (!row[4].empty()) { - stringtok(di.masters, row[4], " ,\t"); + vector masters; + stringtok(masters, row[4], " ,\t"); + for(const auto& m : masters) + di.masters.emplace_back(m, 53); } SOAData sd; diff --git a/pdns/bindparser.yy b/pdns/bindparser.yy index 9f3bf4b8c..df0534146 100644 --- a/pdns/bindparser.yy +++ b/pdns/bindparser.yy @@ -10,6 +10,7 @@ #include "misc.hh" #include "pdnsexception.hh" #include "namespaces.hh" +#include "iputils.hh" #define YYDEBUG 1 extern int yydebug; #include "bindparserclasses.hh" @@ -253,7 +254,7 @@ masters: /* empty */ master: AWORD { - s_di.masters.push_back($1); + s_di.masters.push_back(ComboAddress($1, 53)); free($1); } ; diff --git a/pdns/bindparserclasses.hh b/pdns/bindparserclasses.hh index 33f7c6187..12e60c227 100644 --- a/pdns/bindparserclasses.hh +++ b/pdns/bindparserclasses.hh @@ -48,7 +48,7 @@ public: DNSName name; string viewName; string filename; - vector masters; + vector masters; set alsoNotify; string type; bool hadFileDirective; diff --git a/pdns/communicator.hh b/pdns/communicator.hh index 8991d6cc0..f853e69ae 100644 --- a/pdns/communicator.hh +++ b/pdns/communicator.hh @@ -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); @@ -193,7 +193,7 @@ private: int d_nsock4, d_nsock6; map,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& pdl, ZoneStatus& zs, vector* axfr); diff --git a/pdns/dbdnsseckeeper.cc b/pdns/dbdnsseckeeper.cc index 39bad74aa..415a5d07a 100644 --- a/pdns/dbdnsseckeeper.cc +++ b/pdns/dbdnsseckeeper.cc @@ -575,7 +575,7 @@ bool DNSSECKeeper::TSIGGrantsAccess(const DNSName& zone, const DNSName& keyname) return false; } -bool DNSSECKeeper::getTSIGForAccess(const DNSName& zone, const string& master, DNSName* keyname) +bool DNSSECKeeper::getTSIGForAccess(const DNSName& zone, const ComboAddress& master, DNSName* keyname) { vector keynames; d_keymetadb->getDomainMetadata(zone, "AXFR-MASTER-TSIG", keynames); diff --git a/pdns/dnsbackend.hh b/pdns/dnsbackend.hh index 0de177dd8..e09e99306 100644 --- a/pdns/dnsbackend.hh +++ b/pdns/dnsbackend.hh @@ -52,7 +52,7 @@ struct DomainInfo DNSName zone; time_t last_check; string account; - vector masters; // FIXME use ComboAddress + vector masters; DNSBackend *backend; uint32_t id; diff --git a/pdns/dnsseckeeper.hh b/pdns/dnsseckeeper.hh index 3e50a584f..d1fd12962 100644 --- a/pdns/dnsseckeeper.hh +++ b/pdns/dnsseckeeper.hh @@ -210,7 +210,7 @@ public: bool unsetPublishCDS(const DNSName& zname); bool TSIGGrantsAccess(const DNSName& zone, const DNSName& keyname); - bool getTSIGForAccess(const DNSName& zone, const string& master, DNSName* keyname); + bool getTSIGForAccess(const DNSName& zone, const ComboAddress& master, DNSName* keyname); void startTransaction(const DNSName& zone, int zone_id) { diff --git a/pdns/dynhandler.cc b/pdns/dynhandler.cc index 44564b231..90f01a913 100644 --- a/pdns/dynhandler.cc +++ b/pdns/dynhandler.cc @@ -252,7 +252,7 @@ string DLNotifyRetrieveHandler(const vector&parts, Utility::pid_t ppid) random_shuffle(di.masters.begin(), di.masters.end()); Communicator.addSuckRequest(domain, di.masters.front()); - return "Added retrieval request for '"+domain.toString()+"' from master "+di.masters.front(); + return "Added retrieval request for '"+domain.toString()+"' from master "+di.masters.front().toStringWithPortExcept(53); } string DLNotifyHostHandler(const vector&parts, Utility::pid_t ppid) diff --git a/pdns/iputils.hh b/pdns/iputils.hh index 1b8d7f843..6b265aca0 100644 --- a/pdns/iputils.hh +++ b/pdns/iputils.hh @@ -284,6 +284,17 @@ union ComboAddress { return "["+toString() + "]:" + std::to_string(ntohs(sin4.sin_port)); } + string toStringWithPortExcept(int port) const + { + if(ntohs(sin4.sin_port) == port) + return toString(); + if(sin4.sin_family==AF_INET) + return toString() + ":" + std::to_string(ntohs(sin4.sin_port)); + else + return "["+toString() + "]:" + std::to_string(ntohs(sin4.sin_port)); + } + + void truncate(unsigned int bits) noexcept; uint16_t getPort() const diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index 17f3f0965..d82744983 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -731,16 +731,16 @@ int PacketHandler::trySuperMaster(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)) { - remote = p->getRealRemote().toStringNoMask(); + ComboAddress remote = p->getRemote(); + if(p->hasEDNSSubnet() && ::arg().contains("trusted-notification-proxy", remote.toString())) { + remote = p->getRealRemote().getNetwork(); } Resolver::res_t nsset; try { Resolver resolver; uint32_t theirserial; - resolver.getSoaSerial(remote,p->qdomain, &theirserial); + resolver.getSoaSerial(remote, p->qdomain, &theirserial); resolver.resolve(remote, p->qdomain, QType::NS, &nsset); } catch(ResolverException &re) { @@ -768,7 +768,7 @@ int PacketHandler::trySuperMasterSynchronous(const DNSPacket *p, const DNSName& return RCode::Refused; } - if(!B.superMasterBackend(remote, p->qdomain, nsset, &nameserver, &account, &db)) { + if(!B.superMasterBackend(remote.toString(), p->qdomain, nsset, &nameserver, &account, &db)) { g_log<qdomain<<" for potential supermaster "<setAccount(di.zone,di.account); string masters=""; bool first = true; - for(const string& master: di.masters) { + for(const auto& master: di.masters) { if (!first) masters += ", "; first = false; - masters += master; + masters += master.toStringWithPortExcept(53); } tgt->setMaster(di.zone, masters); // move records diff --git a/pdns/resolver.cc b/pdns/resolver.cc index 24e9cc979..98d26fce7 100644 --- a/pdns/resolver.cc +++ b/pdns/resolver.cc @@ -292,11 +292,9 @@ bool Resolver::tryGetSOASerial(DNSName *domain, ComboAddress* remote, uint32_t * return true; } -int Resolver::resolve(const string &ipport, const DNSName &domain, int type, Resolver::res_t* res, const ComboAddress &local) +int Resolver::resolve(const ComboAddress& to, const DNSName &domain, int type, Resolver::res_t* res, const ComboAddress &local) { try { - ComboAddress to(ipport, 53); - int sock = -1; int id = sendResolve(to, local, domain, type, &sock); int err=waitForData(sock, 0, 3000000); @@ -323,38 +321,38 @@ int Resolver::resolve(const string &ipport, const DNSName &domain, int type, Res return parseResult(mdp, domain, type, id, res); } catch(ResolverException &re) { - throw ResolverException(re.reason+" from "+ipport); + throw ResolverException(re.reason+" from "+to.toStringWithPortExcept(53)); } return -1; } -int Resolver::resolve(const string &ipport, const DNSName &domain, int type, Resolver::res_t* res) { +int Resolver::resolve(const ComboAddress& ipport, const DNSName &domain, int type, Resolver::res_t* res) { ComboAddress local; local.sin4.sin_family = 0; return resolve(ipport, domain, type, res, local); } -void Resolver::getSoaSerial(const string &ipport, const DNSName &domain, uint32_t *serial) +void Resolver::getSoaSerial(const ComboAddress& ipport, const DNSName &domain, uint32_t *serial) { vector res; int ret = resolve(ipport, domain, QType::SOA, &res); if(ret || res.empty()) - throw ResolverException("Query to '" + ipport + "' for SOA of '" + domain.toLogString() + "' produced no answers"); + throw ResolverException("Query to '" + ipport.toStringWithPortExcept(53) + "' for SOA of '" + domain.toString() + "' produced no answers"); if(res[0].qtype.getCode() != QType::SOA) - throw ResolverException("Query to '" + ipport + "' for SOA of '" + domain.toLogString() + "' produced a "+res[0].qtype.getName()+" record"); + throw ResolverException("Query to '" + ipport.toStringWithPortExcept(53) + "' for SOA of '" + domain.toString() + "' produced a "+res[0].qtype.getName()+" record"); vectorparts; stringtok(parts, res[0].content); if(parts.size()<3) - throw ResolverException("Query to '" + ipport + "' for SOA of '" + domain.toLogString() + "' produced an unparseable response"); + throw ResolverException("Query to '" + ipport.toStringWithPortExcept(53) + "' for SOA of '" + domain.toString() + "' produced an unparseable response"); try { *serial=pdns_stou(parts[2]); } catch(const std::out_of_range& oor) { - throw ResolverException("Query to '" + ipport + "' for SOA of '" + domain.toLogString() + "' produced an unparseable serial"); + throw ResolverException("Query to '" + ipport.toStringWithPortExcept(53) + "' for SOA of '" + domain.toString() + "' produced an unparseable serial"); } } diff --git a/pdns/resolver.hh b/pdns/resolver.hh index 419aa032e..375bf74d7 100644 --- a/pdns/resolver.hh +++ b/pdns/resolver.hh @@ -60,9 +60,9 @@ public: typedef vector res_t; //! synchronously resolve domain|type at IP, store result in result, rcode in ret - int resolve(const string &ip, const DNSName &domain, int type, res_t* result, const ComboAddress& local); + int resolve(const ComboAddress &ip, const DNSName &domain, int type, res_t* result, const ComboAddress& local); - int resolve(const string &ip, const DNSName &domain, int type, res_t* result); + int resolve(const ComboAddress &ip, const DNSName &domain, int type, res_t* result); //! only send out a resolution request uint16_t sendResolve(const ComboAddress& remote, const ComboAddress& local, const DNSName &domain, int type, int *localsock, bool dnssecOk=false, @@ -72,7 +72,7 @@ public: bool tryGetSOASerial(DNSName *theirDomain, ComboAddress* remote, uint32_t* theirSerial, uint32_t* theirInception, uint32_t* theirExpire, uint16_t* id); //! convenience function that calls resolve above - void getSoaSerial(const string &, const DNSName &, uint32_t *); + void getSoaSerial(const ComboAddress&, const DNSName &, uint32_t *); private: std::map locals; diff --git a/pdns/rfc2136handler.cc b/pdns/rfc2136handler.cc index ed8e381ac..ca8445179 100644 --- a/pdns/rfc2136handler.cc +++ b/pdns/rfc2136handler.cc @@ -585,16 +585,8 @@ int PacketHandler::forwardPacket(const string &msgPrefix, DNSPacket *p, DomainIn return RCode::Refused; } - for(vector::const_iterator master=di->masters.begin(); master != di->masters.end(); master++) { - g_log<masters) { + g_log< doAxfr(const ComboAddress& raddr, const DNSName } -void CommunicatorClass::suck(const DNSName &domain, const string &remote) +void CommunicatorClass::suck(const DNSName &domain, const ComboAddress& remote) { { Lock l(&d_lock); @@ -299,7 +299,7 @@ void CommunicatorClass::suck(const DNSName &domain, const string &remote) } RemoveSentinel rs(domain, this); // this removes us from d_inprogress when we go out of scope - g_log< localaddr; ComboAddress laddr; - ComboAddress raddr(remote, 53); + if(B.getDomainMetadata(domain, "AXFR-SOURCE", localaddr) && !localaddr.empty()) { try { laddr = ComboAddress(localaddr[0]); @@ -365,12 +365,12 @@ void CommunicatorClass::suck(const DNSName &domain, const string &remote) return; } } else { - if(raddr.sin4.sin_family == AF_INET && !::arg()["query-local-address"].empty()) { + if(remote.sin4.sin_family == AF_INET && !::arg()["query-local-address"].empty()) { laddr = ComboAddress(::arg()["query-local-address"]); - } else if(raddr.sin4.sin_family == AF_INET6 && !::arg()["query-local-address6"].empty()) { + } else if(remote.sin4.sin_family == AF_INET6 && !::arg()["query-local-address6"].empty()) { laddr = ComboAddress(::arg()["query-local-address6"]); } else { - bool isv6 = raddr.sin4.sin_family == AF_INET6; + bool isv6 = remote.sin4.sin_family == AF_INET6; g_log< axfr; - g_log< #include "dnsname.hh" #include "bindparserclasses.hh" +#include "iputils.hh" using std::string; @@ -43,7 +44,7 @@ BOOST_AUTO_TEST_CASE(test_parser) { checkzone(0, example.com, "./zones//example.com", master, 0); checkzone(1, test.com, "./zones//test.com", slave, 1); - BOOST_CHECK_EQUAL(domains[1].masters[0], "1.2.3.4:5678"); + BOOST_CHECK_EQUAL(domains[1].masters[0].toString(), ComboAddress("1.2.3.4", 5678).toString()); checkzone(2, test.dyndns, "./zones//test.dyndns", garblewarble, 0); checkzone(3, wtest.com, "./zones//wtest.com", master, 0); checkzone(4, nztest.com, "./zones//nztest.com", master, 0); diff --git a/pdns/ws-auth.cc b/pdns/ws-auth.cc index 72ecc5174..7bfc82215 100644 --- a/pdns/ws-auth.cc +++ b/pdns/ws-auth.cc @@ -303,6 +303,10 @@ static inline string makeBackendRecordContent(const QType& qtype, const string& static Json::object getZoneInfo(const DomainInfo& di, DNSSECKeeper *dk) { string zoneId = apiZoneNameToId(di.zone); + vector masters; + for(const auto& m : di.masters) + masters.push_back(m.toStringWithPortExcept(53)); + return Json::object { // id is the canonical lookup key, which doesn't actually match the name (in some cases) { "id", zoneId }, @@ -311,7 +315,7 @@ static Json::object getZoneInfo(const DomainInfo& di, DNSSECKeeper *dk) { { "kind", di.getKindString() }, { "dnssec", dk->isSecuredZone(di.zone) }, { "account", di.account }, - { "masters", di.masters }, + { "masters", masters }, { "serial", (double)di.serial }, { "notified_serial", (double)di.notified_serial }, { "last_check", (double)di.last_check } @@ -1454,7 +1458,7 @@ static void apiServerZoneAxfrRetrieve(HttpRequest* req, HttpResponse* resp) { random_shuffle(di.masters.begin(), di.masters.end()); Communicator.addSuckRequest(zonename, di.masters.front()); - resp->setSuccessResult("Added retrieval request for '"+zonename.toString()+"' from master "+di.masters.front()); + resp->setSuccessResult("Added retrieval request for '"+zonename.toString()+"' from master "+di.masters.front().toStringWithPortExcept(53)); } static void apiServerZoneNotify(HttpRequest* req, HttpResponse* resp) { diff --git a/pdns/zone2sql.cc b/pdns/zone2sql.cc index 7fa9eadb7..a87abadd1 100644 --- a/pdns/zone2sql.cc +++ b/pdns/zone2sql.cc @@ -111,7 +111,7 @@ static void startNewTransaction() cout<<"BEGIN TRANSACTION;"< *masters = 0) { +static void emitDomain(const DNSName& domain, const vector *masters = 0) { string iDomain = domain.toStringRootDot(); if(!::arg().mustDo("slave")) { if(g_mode==POSTGRES || g_mode==MYSQL || g_mode==SQLITE) { @@ -130,8 +130,8 @@ static void emitDomain(const DNSName& domain, const vector *masters = 0) if(g_mode==POSTGRES || g_mode==MYSQL || g_mode==SQLITE) { string mstrs; if (masters != 0 && ! masters->empty()) { - for(const string& mstr : *masters) { - mstrs.append(mstr); + for(const auto& mstr : *masters) { + mstrs.append(mstr.toStringWithPortExcept(53)); mstrs.append(1, ' '); } } -- 2.40.0