*serial=(uint32_t)atol(parts[2].c_str());
}
-AXFRRetriever::AXFRRetriever(const ComboAddress& remote, const string& domain, const string& tsigkeyname, const string& tsigalgorithm,
- const string& tsigsecret)
+AXFRRetriever::AXFRRetriever(const ComboAddress& remote,
+ const string& domain,
+ const string& tsigkeyname,
+ const string& tsigalgorithm,
+ const string& tsigsecret,
+ const ComboAddress* laddr)
: d_tsigkeyname(tsigkeyname), d_tsigsecret(tsigsecret), d_tsigPos(0), d_nonSignedMessages(0)
{
ComboAddress local;
- if(remote.sin4.sin_family == AF_INET)
- local=ComboAddress(::arg()["query-local-address"]);
- else if(!::arg()["query-local-address6"].empty())
- local=ComboAddress(::arg()["query-local-address6"]);
- else
- local=ComboAddress("::");
+ if (laddr != NULL) {
+ local = (ComboAddress) (*laddr);
+ } else {
+ if(remote.sin4.sin_family == AF_INET)
+ local=ComboAddress(::arg()["query-local-address"]);
+ else if(!::arg()["query-local-address6"].empty())
+ local=ComboAddress(::arg()["query-local-address6"]);
+ else
+ local=ComboAddress("::");
+ }
d_sock = -1;
try {
d_sock = makeQuerySocket(local, false); // make a TCP socket
class AXFRRetriever : public boost::noncopyable
{
public:
- AXFRRetriever(const ComboAddress& remote, const string& zone, const string& tsigkeyname=string(), const string& tsigalgorithm=string(), const string& tsigsecret=string());
+ AXFRRetriever(const ComboAddress& remote,
+ const string& zone,
+ const string& tsigkeyname=string(),
+ const string& tsigalgorithm=string(),
+ const string& tsigsecret=string(),
+ const ComboAddress* laddr = NULL);
~AXFRRetriever();
int getChunk(Resolver::res_t &res);
/*
PowerDNS Versatile Database Driven Nameserver
- Copyright (C) 2002-2011 PowerDNS.COM BV
+ Copyright (C) 2002-2012 PowerDNS.COM BV
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as
return;
}
}
- AXFRRetriever retriever(raddr, domain.c_str(), tsigkeyname, tsigalgorithm, tsigsecret);
+
+ vector<string> localaddr;
+ ComboAddress laddr;
+
+ if(B->getDomainMetadata(domain, "AXFR-SOURCE", localaddr) && !localaddr.empty()) {
+ try {
+ laddr = ComboAddress(localaddr[0]);
+ L<<Logger::Info<<"AXFR source for domain '"<<domain<<"' set to "<<localaddr[0]<<endl;
+ }
+ catch(std::exception& e) {
+ L<<Logger::Error<<"Failed to load AXFR source '"<<localaddr[0]<<"' for incoming AXFR of '"<<domain<<"': "<<e.what()<<endl;
+ return;
+ }
+ } else {
+ laddr.sin4.sin_family = 0;
+ }
+
+ AXFRRetriever retriever(raddr, domain.c_str(), tsigkeyname, tsigalgorithm, tsigsecret,
+ (laddr.sin4.sin_family == 0) ? NULL : &laddr);
bool gotPresigned = false;
bool gotNSEC3 = false;