extern StatBag S;
-DNSProxy::DNSProxy(const string &remote): d_xor(dns_random_uint16())
+DNSProxy::DNSProxy(const string& remote) :
+ d_xor(dns_random_uint16())
{
- d_resanswers=S.getPointer("recursing-answers");
- d_resquestions=S.getPointer("recursing-questions");
- d_udpanswers=S.getPointer("udp-answers");
+ d_resanswers = S.getPointer("recursing-answers");
+ d_resquestions = S.getPointer("recursing-questions");
+ d_udpanswers = S.getPointer("udp-answers");
vector<string> addresses;
stringtok(addresses, remote, " ,\t");
d_remote = ComboAddress(addresses[0], 53);
- if((d_sock=socket(d_remote.sin4.sin_family, SOCK_DGRAM,0))<0) {
- throw PDNSException(string("socket: ")+stringerror());
+ if ((d_sock = socket(d_remote.sin4.sin_family, SOCK_DGRAM, 0)) < 0) {
+ throw PDNSException(string("socket: ") + stringerror());
}
ComboAddress local;
- if(d_remote.sin4.sin_family==AF_INET) {
+ if (d_remote.sin4.sin_family == AF_INET) {
local = ComboAddress("0.0.0.0");
}
else {
local = ComboAddress("::");
}
-
- unsigned int n=0;
- for(;n<10;n++) {
- local.sin4.sin_port = htons(10000+dns_random(50000));
-
- if(::bind(d_sock, (struct sockaddr *)&local, local.getSocklen()) >= 0)
+
+ unsigned int n = 0;
+ for (; n < 10; n++) {
+ local.sin4.sin_port = htons(10000 + dns_random(50000));
+
+ if (::bind(d_sock, (struct sockaddr*)&local, local.getSocklen()) >= 0)
break;
}
- if(n==10) {
+ if (n == 10) {
closesocket(d_sock);
- d_sock=-1;
- throw PDNSException(string("binding dnsproxy socket: ")+stringerror());
+ d_sock = -1;
+ throw PDNSException(string("binding dnsproxy socket: ") + stringerror());
}
- if(connect(d_sock, (sockaddr *)&d_remote, d_remote.getSocklen())<0) {
- throw PDNSException("Unable to UDP connect to remote nameserver "+d_remote.toStringWithPort()+": "+stringerror());
+ if (connect(d_sock, (sockaddr*)&d_remote, d_remote.getSocklen()) < 0) {
+ throw PDNSException("Unable to UDP connect to remote nameserver " + d_remote.toStringWithPort() + ": " + stringerror());
}
- g_log<<Logger::Error<<"DNS Proxy launched, local port "<<ntohs(local.sin4.sin_port)<<", remote "<<d_remote.toStringWithPort()<<endl;
-}
+ g_log << Logger::Error << "DNS Proxy launched, local port " << ntohs(local.sin4.sin_port) << ", remote " << d_remote.toStringWithPort() << endl;
+}
void DNSProxy::go()
{
- std::thread t([this](){mainloop();});
+ std::thread t([this]() { mainloop(); });
t.detach();
}
//! look up qname target with r->qtype, plonk it in the answer section of 'r' with name aname
-bool DNSProxy::completePacket(std::unique_ptr<DNSPacket>& r, const DNSName& target,const DNSName& aname, const uint8_t scopeMask)
+bool DNSProxy::completePacket(std::unique_ptr<DNSPacket>& r, const DNSName& target, const DNSName& aname, const uint8_t scopeMask)
{
string ECSOptionStr;
- if (r->hasEDNSSubnet())
- {
- DLOG(g_log<<"dnsproxy::completePacket: Parsed edns source: "<<r->d_eso.source.toString()<<", scope: "<<r->d_eso.scope.toString()<<", family = "<<r->d_eso.scope.getNetwork().sin4.sin_family<<endl);
+ if (r->hasEDNSSubnet()) {
+ DLOG(g_log << "dnsproxy::completePacket: Parsed edns source: " << r->d_eso.source.toString() << ", scope: " << r->d_eso.scope.toString() << ", family = " << r->d_eso.scope.getNetwork().sin4.sin_family << endl);
ECSOptionStr = makeEDNSSubnetOptsString(r->d_eso);
- DLOG(g_log<<"from dnsproxy::completePacket: Creating ECS option string "<<makeHexDump(ECSOptionStr)<<endl);
+ DLOG(g_log << "from dnsproxy::completePacket: Creating ECS option string " << makeHexDump(ECSOptionStr) << endl);
}
- if(r->d_tcp) {
+ if (r->d_tcp) {
vector<DNSZoneRecord> ips;
int ret1 = 0, ret2 = 0;
// rip out edns info here, pass it to the stubDoResolve
- if(r->qtype == QType::A || r->qtype == QType::ANY)
+ if (r->qtype == QType::A || r->qtype == QType::ANY)
ret1 = stubDoResolve(target, QType::A, ips, r->hasEDNSSubnet() ? &r->d_eso : nullptr);
- if(r->qtype == QType::AAAA || r->qtype == QType::ANY)
+ if (r->qtype == QType::AAAA || r->qtype == QType::ANY)
ret2 = stubDoResolve(target, QType::AAAA, ips, r->hasEDNSSubnet() ? &r->d_eso : nullptr);
- if(ret1 != RCode::NoError || ret2 != RCode::NoError) {
- g_log<<Logger::Error<<"Error resolving for "<<aname<<" ALIAS "<<target<<" over UDP, original query came in over TCP";
+ if (ret1 != RCode::NoError || ret2 != RCode::NoError) {
+ g_log << Logger::Error << "Error resolving for " << aname << " ALIAS " << target << " over UDP, original query came in over TCP";
if (ret1 != RCode::NoError) {
- g_log<<Logger::Error<<", A-record query returned "<<RCode::to_s(ret1);
+ g_log << Logger::Error << ", A-record query returned " << RCode::to_s(ret1);
}
if (ret2 != RCode::NoError) {
- g_log<<Logger::Error<<", AAAA-record query returned "<<RCode::to_s(ret2);
+ g_log << Logger::Error << ", AAAA-record query returned " << RCode::to_s(ret2);
}
- g_log<<Logger::Error<<", returning SERVFAIL"<<endl;
+ g_log << Logger::Error << ", returning SERVFAIL" << endl;
r->clearRecords();
r->setRcode(RCode::ServFail);
- } else {
- for (auto &ip : ips)
- {
+ }
+ else {
+ for (auto& ip : ips) {
ip.dr.d_name = aname;
r->addRecord(std::move(ip));
}
}
- uint16_t len=htons(r->getString().length());
+ uint16_t len = htons(r->getString().length());
string buffer((const char*)&len, 2);
buffer.append(r->getString());
- writen2WithTimeout(r->getSocket(), buffer.c_str(), buffer.length(), timeval{::arg().asNum("tcp-idle-timeout"),0});
+ writen2WithTimeout(r->getSocket(), buffer.c_str(), buffer.length(), timeval{::arg().asNum("tcp-idle-timeout"), 0});
return true;
}
id = getID_locked(*conntrack);
ConntrackEntry ce;
- ce.id = r->d.id;
- ce.remote = r->d_remote;
- ce.outsock = r->getSocket();
- ce.created = time( nullptr );
+ ce.id = r->d.id;
+ ce.remote = r->d_remote;
+ ce.outsock = r->getSocket();
+ ce.created = time(nullptr);
ce.qtype = r->qtype.getCode();
ce.qname = target;
ce.anyLocal = r->d_anyLocal;
ce.complete = std::move(r);
- ce.aname=aname;
+ ce.aname = aname;
ce.anameScopeMask = scopeMask;
- (*conntrack)[id]=std::move(ce);
+ (*conntrack)[id] = std::move(ce);
}
vector<uint8_t> packet;
DNSPacketWriter pw(packet, target, qtype);
- pw.getHeader()->rd=true;
- pw.getHeader()->id=id ^ d_xor;
+ pw.getHeader()->rd = true;
+ pw.getHeader()->id = id ^ d_xor;
// Add EDNS Subnet if the client sent one - issue #5469
if (!ECSOptionStr.empty()) {
- DLOG(g_log<<"from dnsproxy::completePacket: adding ECS option string to packet options "<<makeHexDump(ECSOptionStr)<<endl);
+ DLOG(g_log << "from dnsproxy::completePacket: adding ECS option string to packet options " << makeHexDump(ECSOptionStr) << endl);
DNSPacketWriter::optvect_t opts;
opts.emplace_back(EDNSOptionCode::ECS, ECSOptionStr);
pw.addOpt(512, 0, 0, opts);
pw.commit();
}
- if(send(d_sock,&packet[0], packet.size() , 0)<0) { // zoom
- g_log<<Logger::Error<<"Unable to send a packet to our recursing backend: "<<stringerror()<<endl;
+ if (send(d_sock, &packet[0], packet.size(), 0) < 0) { // zoom
+ g_log << Logger::Error << "Unable to send a packet to our recursing backend: " << stringerror() << endl;
}
return true;
-
}
-
/** This finds us an unused or stale ID. Does not actually clean the contents */
int DNSProxy::getID_locked(map_t& conntrack)
{
map_t::iterator i;
- for(int n=0;;++n) {
- i=conntrack.find(n);
- if(i==conntrack.end()) {
+ for (int n = 0;; ++n) {
+ i = conntrack.find(n);
+ if (i == conntrack.end()) {
return n;
}
- else if(i->second.created<time(nullptr)-60) {
- if(i->second.created) {
- g_log<<Logger::Warning<<"Recursive query for remote "<<
- i->second.remote.toStringWithPort()<<" with internal id "<<n<<
- " was not answered by backend within timeout, reusing id"<<endl;
- i->second.complete.reset();
- S.inc("recursion-unanswered");
+ else if (i->second.created < time(nullptr) - 60) {
+ if (i->second.created) {
+ g_log << Logger::Warning << "Recursive query for remote " << i->second.remote.toStringWithPort() << " with internal id " << n << " was not answered by backend within timeout, reusing id" << endl;
+ i->second.complete.reset();
+ S.inc("recursion-unanswered");
}
return n;
}
cmsgbuf_aligned cbuf;
ComboAddress fromaddr;
- for(;;) {
+ for (;;) {
socklen_t fromaddrSize = sizeof(fromaddr);
- len=recvfrom(d_sock, buffer, sizeof(buffer),0, (struct sockaddr*) &fromaddr, &fromaddrSize); // answer from our backend
- if(len<(ssize_t)sizeof(dnsheader)) {
- if(len<0)
- g_log<<Logger::Error<<"Error receiving packet from recursor backend: "<<stringerror()<<endl;
- else if(len==0)
- g_log<<Logger::Error<<"Error receiving packet from recursor backend, EOF"<<endl;
+ len = recvfrom(d_sock, buffer, sizeof(buffer), 0, (struct sockaddr*)&fromaddr, &fromaddrSize); // answer from our backend
+ if (len < (ssize_t)sizeof(dnsheader)) {
+ if (len < 0)
+ g_log << Logger::Error << "Error receiving packet from recursor backend: " << stringerror() << endl;
+ else if (len == 0)
+ g_log << Logger::Error << "Error receiving packet from recursor backend, EOF" << endl;
else
- g_log<<Logger::Error<<"Short packet from recursor backend, "<<len<<" bytes"<<endl;
-
+ g_log << Logger::Error << "Short packet from recursor backend, " << len << " bytes" << endl;
+
continue;
}
if (fromaddr != d_remote) {
- g_log<<Logger::Error<<"Got answer from unexpected host "<<fromaddr.toStringWithPort()<<" instead of our recursor backend "<<d_remote.toStringWithPort()<<endl;
+ g_log << Logger::Error << "Got answer from unexpected host " << fromaddr.toStringWithPort() << " instead of our recursor backend " << d_remote.toStringWithPort() << endl;
continue;
}
(*d_resanswers)++;
(*d_udpanswers)++;
dnsheader d;
- memcpy(&d,buffer,sizeof(d));
+ memcpy(&d, buffer, sizeof(d));
{
auto conntrack = d_conntrack.lock();
#if BYTE_ORDER == BIG_ENDIAN
// this is needed because spoof ID down below does not respect the native byteorder
- d.id = ( 256 * (uint16_t)buffer[1] ) + (uint16_t)buffer[0];
+ d.id = (256 * (uint16_t)buffer[1]) + (uint16_t)buffer[0];
#endif
- map_t::iterator i=conntrack->find(d.id^d_xor);
- if(i==conntrack->end()) {
- g_log<<Logger::Error<<"Discarding untracked packet from recursor backend with id "<<(d.id^d_xor)<<
- ". Conntrack table size="<<conntrack->size()<<endl;
+ map_t::iterator i = conntrack->find(d.id ^ d_xor);
+ if (i == conntrack->end()) {
+ g_log << Logger::Error << "Discarding untracked packet from recursor backend with id " << (d.id ^ d_xor) << ". Conntrack table size=" << conntrack->size() << endl;
continue;
}
- else if(i->second.created==0) {
- g_log<<Logger::Error<<"Received packet from recursor backend with id "<<(d.id^d_xor)<<" which is a duplicate"<<endl;
+ else if (i->second.created == 0) {
+ g_log << Logger::Error << "Received packet from recursor backend with id " << (d.id ^ d_xor) << " which is a duplicate" << endl;
continue;
}
-
- d.id=i->second.id;
- memcpy(buffer,&d,sizeof(d)); // commit spoofed id
+
+ d.id = i->second.id;
+ memcpy(buffer, &d, sizeof(d)); // commit spoofed id
DNSPacket p(false);
- p.parse(buffer,(size_t)len);
+ p.parse(buffer, (size_t)len);
- if(p.qtype.getCode() != i->second.qtype || p.qdomain != i->second.qname) {
- g_log<<Logger::Error<<"Discarding packet from recursor backend with id "<<(d.id^d_xor)<<
- ", qname or qtype mismatch ("<<p.qtype.getCode()<<" v " <<i->second.qtype<<", "<<p.qdomain<<" v "<<i->second.qname<<")"<<endl;
+ if (p.qtype.getCode() != i->second.qtype || p.qdomain != i->second.qname) {
+ g_log << Logger::Error << "Discarding packet from recursor backend with id " << (d.id ^ d_xor) << ", qname or qtype mismatch (" << p.qtype.getCode() << " v " << i->second.qtype << ", " << p.qdomain << " v " << i->second.qname << ")" << endl;
continue;
}
// update the EDNS options with info from the resolver - issue #5469
// note that this relies on the ECS string encoder to use the source network, and only take the prefix length from scope
i->second.complete->d_eso.scope = p.d_eso.scope;
- DLOG(g_log<<"from dnsproxy::mainLoop: updated EDNS options from resolver EDNS source: "<<i->second.complete->d_eso.source.toString()<<" EDNS scope: "<<i->second.complete->d_eso.scope.toString()<<endl);
+ DLOG(g_log << "from dnsproxy::mainLoop: updated EDNS options from resolver EDNS source: " << i->second.complete->d_eso.source.toString() << " EDNS scope: " << i->second.complete->d_eso.scope.toString() << endl);
if (mdp.d_header.rcode == RCode::NoError) {
- for (const auto & answer : mdp.d_answers) {
- if(answer.first.d_place == DNSResourceRecord::ANSWER || (answer.first.d_place == DNSResourceRecord::AUTHORITY && answer.first.d_type == QType::SOA)) {
+ for (const auto& answer : mdp.d_answers) {
+ if (answer.first.d_place == DNSResourceRecord::ANSWER || (answer.first.d_place == DNSResourceRecord::AUTHORITY && answer.first.d_type == QType::SOA)) {
- if(answer.first.d_type == i->second.qtype || (i->second.qtype == QType::ANY && (answer.first.d_type == QType::A || answer.first.d_type == QType::AAAA))) {
+ if (answer.first.d_type == i->second.qtype || (i->second.qtype == QType::ANY && (answer.first.d_type == QType::A || answer.first.d_type == QType::AAAA))) {
DNSZoneRecord dzr;
- dzr.dr.d_name=i->second.aname;
+ dzr.dr.d_name = i->second.aname;
dzr.dr.d_type = answer.first.d_type;
- dzr.dr.d_ttl=answer.first.d_ttl;
- dzr.dr.d_place= answer.first.d_place;
+ dzr.dr.d_ttl = answer.first.d_ttl;
+ dzr.dr.d_place = answer.first.d_place;
dzr.dr.setContent(answer.first.getContent());
i->second.complete->addRecord(std::move(dzr));
}
}
i->second.complete->setRcode(mdp.d_header.rcode);
- } else {
- g_log<<Logger::Error<<"Error resolving for "<<i->second.aname<<" ALIAS "<<i->second.qname<<" over UDP, "<<QType(i->second.qtype).toString()<<"-record query returned "<<RCode::to_s(mdp.d_header.rcode)<<", returning SERVFAIL"<<endl;
+ }
+ else {
+ g_log << Logger::Error << "Error resolving for " << i->second.aname << " ALIAS " << i->second.qname << " over UDP, " << QType(i->second.qtype).toString() << "-record query returned " << RCode::to_s(mdp.d_header.rcode) << ", returning SERVFAIL" << endl;
i->second.complete->clearRecords();
i->second.complete->setRcode(RCode::ServFail);
}
- reply=i->second.complete->getString();
+ reply = i->second.complete->getString();
iov.iov_base = (void*)reply.c_str();
iov.iov_len = reply.length();
i->second.complete.reset();
msgh.msg_iovlen = 1;
msgh.msg_name = (struct sockaddr*)&i->second.remote;
msgh.msg_namelen = i->second.remote.getSocklen();
- msgh.msg_control=nullptr;
+ msgh.msg_control = nullptr;
- if(i->second.anyLocal) {
+ if (i->second.anyLocal) {
addCMsgSrcAddr(&msgh, &cbuf, i->second.anyLocal.get_ptr(), 0);
}
- if(sendmsg(i->second.outsock, &msgh, 0) < 0) {
+ if (sendmsg(i->second.outsock, &msgh, 0) < 0) {
int err = errno;
- g_log<<Logger::Warning<<"dnsproxy.cc: Error sending reply with sendmsg (socket="<<i->second.outsock<<"): "<<stringerror(err)<<endl;
+ g_log << Logger::Warning << "dnsproxy.cc: Error sending reply with sendmsg (socket=" << i->second.outsock << "): " << stringerror(err) << endl;
}
- i->second.created=0;
+ i->second.created = 0;
}
}
}
- catch(PDNSException &ae) {
- g_log<<Logger::Error<<"Fatal error in DNS proxy: "<<ae.reason<<endl;
+ catch (PDNSException& ae) {
+ g_log << Logger::Error << "Fatal error in DNS proxy: " << ae.reason << endl;
}
- catch(std::exception &e) {
- g_log<<Logger::Error<<"Communicator thread died because of STL error: "<<e.what()<<endl;
+ catch (std::exception& e) {
+ g_log << Logger::Error << "Communicator thread died because of STL error: " << e.what() << endl;
}
- catch( ... )
- {
+ catch (...) {
g_log << Logger::Error << "Caught unknown exception." << endl;
}
- g_log<<Logger::Error<<"Exiting because DNS proxy failed"<<endl;
+ g_log << Logger::Error << "Exiting because DNS proxy failed" << endl;
_exit(1);
}
-DNSProxy::~DNSProxy() {
- if (d_sock>-1) {
+DNSProxy::~DNSProxy()
+{
+ if (d_sock > -1) {
try {
closesocket(d_sock);
}
- catch(const PDNSException& e) {
+ catch (const PDNSException& e) {
}
}
- d_sock=-1;
+ d_sock = -1;
}
#include "ednssubnet.hh"
#include "dns.hh"
-namespace {
- struct EDNSSubnetOptsWire
- {
- uint16_t family;
- uint8_t sourceMask;
- uint8_t scopeMask;
- } GCCPACKATTRIBUTE; // BRRRRR
+namespace
+{
+struct EDNSSubnetOptsWire
+{
+ uint16_t family;
+ uint8_t sourceMask;
+ uint8_t scopeMask;
+} GCCPACKATTRIBUTE; // BRRRRR
}
bool getEDNSSubnetOptsFromString(const string& options, EDNSSubnetOpts* eso)
{
- //cerr<<"options.size:"<<options.size()<<endl;
+ // cerr<<"options.size:"<<options.size()<<endl;
return getEDNSSubnetOptsFromString(options.c_str(), options.length(), eso);
}
bool getEDNSSubnetOptsFromString(const char* options, unsigned int len, EDNSSubnetOpts* eso)
{
EDNSSubnetOptsWire esow;
- static_assert (sizeof(esow) == 4, "sizeof(EDNSSubnetOptsWire) must be 4 bytes");
- if(len < sizeof(esow))
+ static_assert(sizeof(esow) == 4, "sizeof(EDNSSubnetOptsWire) must be 4 bytes");
+ if (len < sizeof(esow))
return false;
memcpy(&esow, options, sizeof(esow));
esow.family = ntohs(esow.family);
- //cerr<<"Family when parsing from string: "<<esow.family<<endl;
+ // cerr<<"Family when parsing from string: "<<esow.family<<endl;
ComboAddress address;
- unsigned int octetsin = esow.sourceMask > 0 ? (((esow.sourceMask - 1)>> 3)+1) : 0;
- //cerr<<"octetsin:"<<octetsin<<endl;
- if(esow.family == 1) {
- if(len != sizeof(esow)+octetsin)
+ unsigned int octetsin = esow.sourceMask > 0 ? (((esow.sourceMask - 1) >> 3) + 1) : 0;
+ // cerr<<"octetsin:"<<octetsin<<endl;
+ if (esow.family == 1) {
+ if (len != sizeof(esow) + octetsin)
return false;
- if(octetsin > sizeof(address.sin4.sin_addr.s_addr))
+ if (octetsin > sizeof(address.sin4.sin_addr.s_addr))
return false;
address.reset();
address.sin4.sin_family = AF_INET;
- if(octetsin > 0)
- memcpy(&address.sin4.sin_addr.s_addr, options+sizeof(esow), octetsin);
- } else if(esow.family == 2) {
- if(len != sizeof(esow)+octetsin)
+ if (octetsin > 0)
+ memcpy(&address.sin4.sin_addr.s_addr, options + sizeof(esow), octetsin);
+ }
+ else if (esow.family == 2) {
+ if (len != sizeof(esow) + octetsin)
return false;
- if(octetsin > sizeof(address.sin6.sin6_addr.s6_addr))
+ if (octetsin > sizeof(address.sin6.sin6_addr.s6_addr))
return false;
address.reset();
address.sin4.sin_family = AF_INET6;
- if(octetsin > 0)
- memcpy(&address.sin6.sin6_addr.s6_addr, options+sizeof(esow), octetsin);
+ if (octetsin > 0)
+ memcpy(&address.sin6.sin6_addr.s6_addr, options + sizeof(esow), octetsin);
}
else
return false;
eso->source = Netmask(address, esow.sourceMask);
/* 'address' has more bits set (potentially) than scopeMask. This leads to odd looking netmasks that promise
more precision than they have. For this reason we truncate the address to scopeMask bits */
-
+
address.truncate(esow.scopeMask); // truncate will not throw for odd scopeMasks
eso->scope = Netmask(address, esow.scopeMask);
esow.sourceMask = eso.source.getBits();
esow.scopeMask = eso.scope.getBits();
ret.assign((const char*)&esow, sizeof(esow));
- int octetsout = ((esow.sourceMask - 1)>> 3)+1;
+ int octetsout = ((esow.sourceMask - 1) >> 3) + 1;
- ComboAddress src=eso.source.getNetwork();
+ ComboAddress src = eso.source.getNetwork();
src.truncate(esow.sourceMask);
- if(family == htons(1))
- ret.append((const char*) &src.sin4.sin_addr.s_addr, octetsout);
+ if (family == htons(1))
+ ret.append((const char*)&src.sin4.sin_addr.s_addr, octetsout);
else
- ret.append((const char*) &src.sin6.sin6_addr.s6_addr, octetsout);
+ ret.append((const char*)&src.sin6.sin6_addr.s6_addr, octetsout);
return ret;
}
-
bool resolversDefined()
{
if (s_resolversForStub.read_lock()->empty()) {
- g_log<<Logger::Warning<<logPrefix<<"No upstream resolvers configured, stub resolving (including secpoll and ALIAS) impossible."<<endl;
+ g_log << Logger::Warning << logPrefix << "No upstream resolvers configured, stub resolving (including secpoll and ALIAS) impossible." << endl;
return false;
}
return true;
{
const time_t now = time(nullptr);
if ((s_localResolvConfLastCheck + LOCAL_RESOLV_CONF_MAX_CHECK_INTERVAL) > now)
- return ;
+ return;
parseLocalResolvConf_locked(*(s_resolversForStub.write_lock()), now);
}
-
/*
* Fill the s_resolversForStub vector with addresses for the upstream resolvers.
* First, parse the `resolver` configuration option for IP addresses to use.
*/
void stubParseResolveConf()
{
- if(::arg().mustDo("resolver")) {
+ if (::arg().mustDo("resolver")) {
auto resolversForStub = s_resolversForStub.write_lock();
vector<string> parts;
stringtok(parts, ::arg()["resolver"], " ,\t");
}
// only check if resolvers come from local resolv.conf in the first place
if (s_localResolvConfMtime != 0) {
- parseLocalResolvConf();
+ parseLocalResolvConf();
}
if (!resolversDefined())
return RCode::ServFail;
vector<uint8_t> packet;
DNSPacketWriter pw(packet, qname, qtype);
- pw.getHeader()->id=dns_random_uint16();
- pw.getHeader()->rd=1;
-
- if (d_eso != nullptr)
- {
+ pw.getHeader()->id = dns_random_uint16();
+ pw.getHeader()->rd = 1;
+
+ if (d_eso != nullptr) {
// pass along EDNS subnet from client if given - issue #5469
string origECSOptionStr = makeEDNSSubnetOptsString(*d_eso);
DNSPacketWriter::optvect_t opts;
}
string queryNameType = qname.toString() + "|" + QType(qtype).toString();
- string msg ="Doing stub resolving for '" + queryNameType + "', using resolvers: ";
+ string msg = "Doing stub resolving for '" + queryNameType + "', using resolvers: ";
for (const auto& server : *resolversForStub) {
msg += server.toString() + ", ";
}
- g_log<<Logger::Debug<<logPrefix<<msg.substr(0, msg.length() - 2)<<endl;
+ g_log << Logger::Debug << logPrefix << msg.substr(0, msg.length() - 2) << endl;
- for(const ComboAddress& dest : *resolversForStub) {
+ for (const ComboAddress& dest : *resolversForStub) {
Socket sock(dest.sin4.sin_family, SOCK_DGRAM);
sock.setNonBlocking();
sock.connect(dest);
try {
retry:
sock.read(reply); // this calls recv
- if(reply.size() > sizeof(struct dnsheader)) {
+ if (reply.size() > sizeof(struct dnsheader)) {
struct dnsheader d;
memcpy(&d, reply.c_str(), sizeof(d));
- if(d.id != pw.getHeader()->id)
+ if (d.id != pw.getHeader()->id)
goto retry;
}
}
- catch(...) {
+ catch (...) {
continue;
}
MOADNSParser mdp(false, reply);
- if(mdp.d_header.rcode == RCode::ServFail)
+ if (mdp.d_header.rcode == RCode::ServFail)
continue;
- for(const auto & answer : mdp.d_answers) {
- if(answer.first.d_place == 1 && answer.first.d_type==qtype) {
+ for (const auto& answer : mdp.d_answers) {
+ if (answer.first.d_place == 1 && answer.first.d_type == qtype) {
DNSZoneRecord zrr;
zrr.dr = answer.first;
- zrr.auth=true;
+ zrr.auth = true;
ret.push_back(zrr);
}
}
- g_log<<Logger::Debug<<logPrefix<<"Question for '"<<queryNameType<<"' got answered by "<<dest.toString()<<endl;
+ g_log << Logger::Debug << logPrefix << "Question for '" << queryNameType << "' got answered by " << dest.toString() << endl;
return mdp.d_header.rcode;
}
return RCode::ServFail;
}
-int stubDoResolve(const DNSName& qname, uint16_t qtype, vector<DNSRecord>& ret, const EDNSSubnetOpts* d_eso) {
+int stubDoResolve(const DNSName& qname, uint16_t qtype, vector<DNSRecord>& ret, const EDNSSubnetOpts* d_eso)
+{
vector<DNSZoneRecord> ret2;
int res = stubDoResolve(qname, qtype, ret2, d_eso);
- for (const auto &r : ret2) {
+ for (const auto& r : ret2) {
ret.push_back(r.dr);
}
return res;