bool DNSBackend::get(DNSZoneRecord& dzr)
{
+ // cout<<"DNSBackend::get(DNSZoneRecord&) called - translating into DNSResourceRecord query"<<endl;
DNSResourceRecord rr;
if(!this->get(rr))
return false;
public:
includeboilerplate(NS)
explicit NSRecordContent(const DNSName& content) : d_content(content){}
- DNSName getNS() const { return d_content; }
+ const DNSName& getNS() const { return d_content; }
private:
DNSName d_content;
};
sd.db=0;
if(p->qtype.getCode()!=QType::AXFR) { // this packet needs additional processing
- vector<DNSZoneRecord *> arrs=r->getAPRecords();
- if(arrs.empty())
- return 1;
-
- DLOG(L<<Logger::Warning<<"This packet needs additional processing!"<<endl);
-
- vector<DNSZoneRecord> crrs;
+ // we now have a copy, push_back on packet might reallocate!
+ auto& records = r->getRRS();
+ vector<DNSZoneRecord> toAdd;
- for(vector<DNSZoneRecord *>::const_iterator i=arrs.begin(); i!=arrs.end(); ++i)
- crrs.push_back(**i);
+ for(auto i = records.cbegin() ; i!= records.cend(); ++i) {
+ if(i->dr.d_place==DNSResourceRecord::ADDITIONAL ||
+ !(i->dr.d_type==QType::MX || i->dr.d_type==QType::NS || i->dr.d_type==QType::SRV))
+ continue;
- // we now have a copy, push_back on packet might reallocate!
- for(auto i=crrs.cbegin(); i!=crrs.cend(); ++i) {
if(r->d.aa && i->dr.d_name.countLabels() && i->dr.d_type==QType::NS && !B.getSOA(i->dr.d_name,sd,p) && !retargeted) { // drop AA in case of non-SOA-level NS answer, except for root referral
r->setA(false);
// i->d_place=DNSResourceRecord::AUTHORITY; // XXX FIXME
lookup = getRR<MXRecordContent>(i->dr)->d_mxname;
else if(i->dr.d_type == QType::SRV)
lookup = getRR<SRVRecordContent>(i->dr)->d_target;
-
+ else if(i->dr.d_type == QType::NS)
+ lookup = getRR<NSRecordContent>(i->dr)->getNS();
+ else
+ continue;
B.lookup(QType(d_doIPv6AdditionalProcessing ? QType::ANY : QType::A), lookup, p);
while(B.get(rr)) {
if(rr.auth && !rr.dr.d_name.isPartOf(soadata.qname)) // don't sign out of zone data using the main key
rr.auth=false;
rr.dr.d_place=DNSResourceRecord::ADDITIONAL;
- r->addRecord(rr);
+ toAdd.push_back(rr);
}
}
+ // records.reserve(records.size()+toAdd.size());
+ records.insert(records.end(), toAdd.cbegin(), toAdd.cend());
}
return 1;
}
throw RecordTextException("expected digits at position "+std::to_string(d_pos)+" in '"+d_string+"'");
size_t pos;
- val=pdns_stou(d_string.substr(d_pos), &pos);
+ val=pdns_stou(d_string.c_str()+d_pos, &pos);
d_pos += pos;
}
d_question.zoneId=zoneId;
int cstat=cacheHas(d_question, d_answers);
if(cstat<0) { // nothing
+ // cout<<"UeberBackend::lookup("<<qname<<"|"<<DNSRecordContent::NumberToType(qtype.getCode())<<"): uncached"<<endl;
d_negcached=d_cached=false;
d_answers.clear();
(d_handle.d_hinterBackend=backends[d_handle.i++])->lookup(qtype, qname,pkt_p,zoneId);
}
else if(cstat==0) {
+ // cout<<"UeberBackend::lookup("<<qname<<"|"<<DNSRecordContent::NumberToType(qtype.getCode())<<"): NEGcached"<<endl;
d_negcached=true;
d_cached=false;
d_answers.clear();
}
else {
+ // cout<<"UeberBackend::lookup("<<qname<<"|"<<DNSRecordContent::NumberToType(qtype.getCode())<<"): CACHED"<<endl;
d_negcached=false;
d_cached=true;
d_cachehandleiter = d_answers.begin();
bool UeberBackend::get(DNSResourceRecord &rr)
{
+ // cout<<"UeberBackend::get(DNSResourceRecord&) called, translating to a DNSZoneRecord query"<<endl;
DNSZoneRecord dzr;
if(!this->get(dzr))
return false;
bool UeberBackend::get(DNSZoneRecord &rr)
{
+ // cout<<"UeberBackend::get(DNSZoneRecord) called"<<endl;
if(d_negcached) {
return false;
}
return false;
}
if(!d_handle.get(rr)) {
- if(!d_ancount && d_handle.qname.countLabels()) // don't cache axfr
+ // cout<<"end of ueberbackend get, seeing if we should cache"<<endl;
+ if(!d_ancount && d_handle.qname.countLabels()) {// don't cache axfr
+ // cout<<"adding negache"<<endl;
addNegCache(d_question);
-
- addCache(d_question, d_answers);
+ }
+ else {
+ // cout<<"adding query cache"<<endl;
+ addCache(d_question, d_answers);
+ }
d_answers.clear();
return false;
}