diff --git a/tdns/dns-storage.cc b/tdns/dns-storage.cc index 28e6f01..070d12a 100644 --- a/tdns/dns-storage.cc +++ b/tdns/dns-storage.cc @@ -66,7 +66,11 @@ DNSNode* DNSNode::add(dnsname name) { cout<<"Add called for '"<& content) { auto cursize = payloadpos; diff --git a/tdns/dnsmessages.hh b/tdns/dnsmessages.hh index c84c2fc..1390d26 100644 --- a/tdns/dnsmessages.hh +++ b/tdns/dnsmessages.hh @@ -11,7 +11,7 @@ struct DNSMessageReader dnsname getName(); void getQuestion(dnsname& name, DNSType& type); - + bool getEDNS(uint16_t* newsize, bool* doBit); std::string serialize() const; }; diff --git a/tdns/tdns.cc b/tdns/tdns.cc index 54eb8cd..4bcd475 100644 --- a/tdns/tdns.cc +++ b/tdns/tdns.cc @@ -52,20 +52,10 @@ bool processQuestion(const DNSNode& zones, DNSMessageReader& dm, const ComboAddr cout<<"Received a query from "< sizeof(dnsheader)) - response.payload.resize(newsize - sizeof(dnsheader)); - - } - } + haveEDNS = dm.getEDNS(&newsize, &doBit); + if(haveEDNS && newsize > sizeof(dnsheader)) + response.payload.resize(newsize - sizeof(dnsheader)); + try { response.dh = dm.dh; response.dh.ad = response.dh.ra = response.dh.aa = 0; @@ -131,28 +121,8 @@ bool processQuestion(const DNSNode& zones, DNSMessageReader& dm, const ComboAddr auto iter = node->rrsets.cbegin(); vector additional; - if(type == DNSType::ANY) { - for(const auto& t : node->rrsets) { - const auto& rrset = t.second; - for(const auto& rr : rrset.contents) { - response.putRR(DNSSection::Answer, lastnode+zone, t.first, rrset.ttl, rr); - if(t.first == DNSType::MX) - additional.push_back(dynamic_cast(rr.get())->d_name); - - } - } - } - else if(iter = node->rrsets.find(type), iter != node->rrsets.end()) { - const auto& rrset = iter->second; - for(const auto& rr : rrset.contents) { - response.putRR(DNSSection::Answer, lastnode+zone, type, rrset.ttl, rr); - if(type == DNSType::MX) - additional.push_back(dynamic_cast(rr.get())->d_name); - } - - } - else if(iter = node->rrsets.find(DNSType::CNAME), iter != node->rrsets.end()) { - cout<<"We do have a CNAME!"<rrsets.find(DNSType::CNAME), iter != node->rrsets.end()) { + cout<<"We have a CNAME!"<second; dnsname target; for(const auto& rr : rrset.contents) { @@ -172,6 +142,25 @@ bool processQuestion(const DNSNode& zones, DNSMessageReader& dm, const ComboAddr else cout<<" CNAME points to record "<rrsets) { + const auto& rrset = t.second; + for(const auto& rr : rrset.contents) { + response.putRR(DNSSection::Answer, lastnode+zone, t.first, rrset.ttl, rr); + if(t.first == DNSType::MX) + additional.push_back(dynamic_cast(rr.get())->d_name); + + } + } + } + else if(iter = node->rrsets.find(type), iter != node->rrsets.end() || type==DNSType::ANY) { + const auto& rrset = iter->second; + for(const auto& rr : rrset.contents) { + response.putRR(DNSSection::Answer, lastnode+zone, type, rrset.ttl, rr); + if(type == DNSType::MX) + additional.push_back(dynamic_cast(rr.get())->d_name); + } + } else { cout<<"Node exists, qtype doesn't, NOERROR situation, inserting SOA"<zone->rrsets[DNSType::SOA];