#include "dns_random.hh"
#include "stubresolver.hh"
#include "arguments.hh"
+#include "threadname.hh"
extern StatBag S;
}
//! look up qname target with r->qtype, plonk it in the answer section of 'r' with name aname
-bool DNSProxy::completePacket(DNSPacket *r, const DNSName& target,const DNSName& aname)
+bool DNSProxy::completePacket(DNSPacket *r, const DNSName& target,const DNSName& aname, const uint8_t scopeMask)
{
if(r->d_tcp) {
vector<DNSZoneRecord> ips;
ret2 = stubDoResolve(target, QType::AAAA, ips);
if(ret1 != RCode::NoError || ret2 != RCode::NoError) {
- g_log<<Logger::Error<<"Error resolving for "<<aname<<" ALIAS "<<target;
+ 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);
}
ce.anyLocal = r->d_anyLocal;
ce.complete = r;
ce.aname=aname;
+ ce.anameScopeMask = scopeMask;
d_conntrack[id]=ce;
}
void DNSProxy::mainloop(void)
{
+ setThreadName("pdns/dnsproxy");
try {
char buffer[1500];
ssize_t len;
/* Set up iov and msgh structures. */
memset(&msgh, 0, sizeof(struct msghdr));
string reply; // needs to be alive at time of sendmsg!
- if(i->second.complete) {
-
- MOADNSParser mdp(false, p.getString());
- // cerr<<"Got completion, "<<mdp.d_answers.size()<<" answers, rcode: "<<mdp.d_header.rcode<<endl;
+ MOADNSParser mdp(false, p.getString());
+ // cerr<<"Got completion, "<<mdp.d_answers.size()<<" answers, rcode: "<<mdp.d_header.rcode<<endl;
+ if (mdp.d_header.rcode == RCode::NoError) {
for(MOADNSParser::answers_t::const_iterator j=mdp.d_answers.begin(); j!=mdp.d_answers.end(); ++j) {
// cerr<<"comp: "<<(int)j->first.d_place-1<<" "<<j->first.d_label<<" " << DNSRecordContent::NumberToType(j->first.d_type)<<" "<<j->first.d_content->getZoneRepresentation()<<endl;
if(j->first.d_place == DNSResourceRecord::ANSWER || (j->first.d_place == DNSResourceRecord::AUTHORITY && j->first.d_type == QType::SOA)) {
}
}
i->second.complete->setRcode(mdp.d_header.rcode);
- reply=i->second.complete->getString();
- iov.iov_base = (void*)reply.c_str();
- iov.iov_len = reply.length();
- delete i->second.complete;
- i->second.complete=0;
- }
- else {
- iov.iov_base = buffer;
- iov.iov_len = len;
+ } else {
+ g_log<<Logger::Error<<"Error resolving for "<<i->second.aname<<" ALIAS "<<i->second.qname<<" over UDP, "<<QType(i->second.qtype).getName()<<"-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();
+ iov.iov_base = (void*)reply.c_str();
+ iov.iov_len = reply.length();
+ delete i->second.complete;
+ i->second.complete=0;
msgh.msg_iov = &iov;
msgh.msg_iovlen = 1;
msgh.msg_name = (struct sockaddr*)&i->second.remote;