R->setA(false);
R->setRA(true);
- SyncRes<LWRes> sr;
- L<<Logger::Error<<"["<<MT.getTid()<<"] new question arrived for '"<<P.qdomain<<"|"<<P.qtype.getName()<<"' from "<<P.getRemote()<<endl;
+ SyncRes sr;
+ L<<Logger::Error<<"["<<MT.getTid()<<"] question for '"<<P.qdomain<<"|"<<P.qtype.getName()<<"' from "<<P.getRemote()<<endl;
sr.setId(MT.getTid());
if(!P.d.rd)
sr.setCacheOnly();
const char *buffer=R->getData();
sendto(d_serversock,buffer,R->len,0,(struct sockaddr *)(R->remote),R->d_socklen);
- L<<Logger::Error<<"["<<MT.getTid()<<"] sent answer to "<<(P.d.rd?"":"non-rd ")<<"question for '"<<P.qdomain<<"|"<<P.qtype.getName()<<"' to "<<P.getRemote();
- L<<", "<<ntohs(R->d.ancount)<<" answers, "<<ntohs(R->d.arcount)<<" additional, took "<<sr.d_outqueries<<" packets"<<endl;
+ L<<Logger::Error<<"["<<MT.getTid()<<"] answer to "<<(P.d.rd?"":"non-rd ")<<"question '"<<P.qdomain<<"|"<<P.qtype.getName();
+ L<<"': "<<ntohs(R->d.ancount)<<" answers, "<<ntohs(R->d.arcount)<<" additional, took "<<sr.d_outqueries<<" packets, rcode="<<res<<endl;
delete R;
}
catch(AhuException &ae) {
if(qcounter) {
L<<Logger::Error<<"stats: "<<qcounter<<" questions, "<<cache.size()<<" cache entries, "
<<(int)((cacheHits*100.0)/(cacheHits+cacheMisses))<<"% cache hits";
- L<<Logger::Error<<", outpacket/query ratio "<<(int)(SyncRes<LWRes>::s_outqueries*100.0/SyncRes<LWRes>::s_queries)<<"%"<<endl;
+ L<<Logger::Error<<", outpacket/query ratio "<<(int)(SyncRes::s_outqueries*100.0/SyncRes::s_queries)<<"%"<<endl;
}
last_stat=time(0);
}
if(time(0)-last_rootupdate>7200) {
- SyncRes<LWRes> sr;
+ SyncRes sr;
vector<DNSResourceRecord>ret;
sr.setNoCache();
arg().set("soa-serial-offset","0")="0";
arg().set("local-port","port to listen on")="5300";
arg().set("local-address","port to listen on")="0.0.0.0";
- arg().set("trace","if we should output heaps of logging")="true";
+ arg().set("trace","if we should output heaps of logging")="off";
arg().set("daemon","Operate as a daemon")="no";
arg().parse(argc, argv);
L.toConsole(Logger::Warning);
if(arg().mustDo("trace"))
- SyncRes<LWRes>::setLog(true);
+ SyncRes::setLog(true);
makeClientSocket();
makeServerSocket();
#include "arguments.hh"
#include "lwres.hh"
-template<class MultiPlexor>map<string,string> SyncRes<MultiPlexor>::s_negcache;
-template<class MultiPlexor>unsigned int SyncRes<MultiPlexor>::s_queries;
-template<class MultiPlexor>unsigned int SyncRes<MultiPlexor>::s_outqueries;
-template<class MultiPlexor>bool SyncRes<MultiPlexor>::s_log;
+map<string,string> SyncRes::s_negcache;
+unsigned int SyncRes::s_queries;
+unsigned int SyncRes::s_outqueries;
+bool SyncRes::s_log;
#define LOG if(s_log)L<<Logger::Warning
/** everything begins here - this is the entry point just after receiving a packet */
-template<>int SyncRes<>::beginResolve(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret)
+int SyncRes::beginResolve(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret)
{
set<GetBestNSAnswer> beenthere;
s_queries++;
return res;
}
-template<class MultiPlexor>int SyncRes<MultiPlexor>::doResolve(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret, int depth, set<GetBestNSAnswer>& beenthere)
+int SyncRes::doResolve(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret, int depth, set<GetBestNSAnswer>& beenthere)
{
string prefix(d_prefix);
prefix.append(depth, ' ');
return res<0 ? RCode::ServFail : res;
}
-template<class MultiPlexor>string SyncRes<MultiPlexor>::getA(const string &qname, int depth, set<GetBestNSAnswer>& beenthere)
+string SyncRes::getA(const string &qname, int depth, set<GetBestNSAnswer>& beenthere)
{
vector<DNSResourceRecord> res;
string ret;
return ret;
}
-template<class MultiPlexor>void SyncRes<MultiPlexor>::getBestNSFromCache(const string &qname, set<DNSResourceRecord>&bestns, int depth, set<GetBestNSAnswer>& beenthere)
+void SyncRes::getBestNSFromCache(const string &qname, set<DNSResourceRecord>&bestns, int depth, set<GetBestNSAnswer>& beenthere)
{
string prefix(d_prefix), subdomain(qname);
prefix.append(depth, ' ');
answer.qname=toLower(qname); answer.bestns=bestns;
if(beenthere.count(answer)) {
LOG<<prefix<<qname<<": We have NS in cache for '"<<subdomain<<"' but part of LOOP! Trying less specific NS"<<endl;
- for(typename set<GetBestNSAnswer>::const_iterator j=beenthere.begin();j!=beenthere.end();++j)
+ for( set<GetBestNSAnswer>::const_iterator j=beenthere.begin();j!=beenthere.end();++j)
LOG<<prefix<<qname<<": beenthere: "<<j->qname<<" ("<<j->bestns.size()<<")"<<endl;
bestns.clear();
}
/** doesn't actually do the work, leaves that to getBestNSFromCache */
-template<class MultiPlexor>string SyncRes<MultiPlexor>::getBestNSNamesFromCache(const string &qname,set<string>& nsset, int depth, set<GetBestNSAnswer>&beenthere)
+string SyncRes::getBestNSNamesFromCache(const string &qname,set<string>& nsset, int depth, set<GetBestNSAnswer>&beenthere)
{
string subdomain(qname);
return subdomain;
}
-template<class MultiPlexor>bool SyncRes<MultiPlexor>::doCNAMECacheCheck(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret, int depth, int &res)
+bool SyncRes::doCNAMECacheCheck(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret, int depth, int &res)
{
string prefix(d_prefix), tuple=toLower(qname)+"|CNAME";
prefix.append(depth, ' ');
return false;
}
-template<class MultiPlexor>bool SyncRes<MultiPlexor>::doCacheCheck(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret, int depth, int &res)
+bool SyncRes::doCacheCheck(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret, int depth, int &res)
{
string prefix(d_prefix), tuple;
prefix.append(depth, ' ');
return false;
}
-template<class MultiPlexor>bool SyncRes<MultiPlexor>::moreSpecificThan(const string& a, const string &b)
+bool SyncRes::moreSpecificThan(const string& a, const string &b)
{
int counta=!a.empty(), countb=!b.empty();
return counta>countb;
}
-template<class MultiPlexor>vector<string> SyncRes<MultiPlexor>::shuffle(set<string> &nameservers)
+vector<string> SyncRes::shuffle(set<string> &nameservers)
{
vector<string> rnameservers;
for(set<string>::const_iterator i=nameservers.begin();i!=nameservers.end();++i)
}
/** returns -1 in case of no results, rcode otherwise */
-template<class MultiPlexor>int SyncRes<MultiPlexor>::doResolveAt(set<string> nameservers, string auth, const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret,
+int SyncRes::doResolveAt(set<string> nameservers, string auth, const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret,
int depth, set<GetBestNSAnswer>&beenthere)
{
string prefix(d_prefix);
newtarget=i->content;
}
// for ANY answers we *must* have an authoritive answer
- else if(i->d_place==DNSResourceRecord::ANSWER && i->qname==qname && (i->qtype==qtype || ( qtype==QType(QType::ANY) && aabit))) {
+ else if(i->d_place==DNSResourceRecord::ANSWER && toLower(i->qname)==toLower(qname) && (i->qtype==qtype || ( qtype==QType(QType::ANY) && aabit))) {
LOG<<prefix<<qname<<": answer is in: resolved to '"<<i->content<<"|"<<i->qtype.getName()<<"'"<<endl;
done=true;
ret.push_back(*i);
return -1;
}
-template<class MultiPlexor>void SyncRes<MultiPlexor>::addCruft(const string &qname, vector<DNSResourceRecord>& ret)
+void SyncRes::addCruft(const string &qname, vector<DNSResourceRecord>& ret)
{
for(vector<DNSResourceRecord>::const_iterator k=ret.begin();k!=ret.end();++k) // don't add stuff to an NXDOMAIN!
if(k->d_place==DNSResourceRecord::AUTHORITY && k->qtype==QType(QType::SOA))
LOG<<d_prefix<<qname<<": Done with additional processing"<<endl;
}
-template<class MultiPlexor>void SyncRes<MultiPlexor>::addAuthorityRecords(const string& qname, vector<DNSResourceRecord>& ret, int depth)
+void SyncRes::addAuthorityRecords(const string& qname, vector<DNSResourceRecord>& ret, int depth)
{
set<DNSResourceRecord> bestns;
set<GetBestNSAnswer>beenthere;