X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fdns.cpp;h=50fdee34b03e91987de547178a62f92dcb846a6f;hb=71f7e47bcd7b72d7999daa9f061c8850b5a6521b;hp=4bb2da02083ffe7a5c3f0958fca1ccb0c9ff4101;hpb=58385dd458e927994957b6d603f7f9da3fc52e14;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/dns.cpp b/src/dns.cpp index 4bb2da020..50fdee34b 100644 --- a/src/dns.cpp +++ b/src/dns.cpp @@ -2,8 +2,8 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see * the file COPYING for details. @@ -11,7 +11,7 @@ * --------------------------------------------------- */ -/* $Core: libIRCDasyncdns */ +/* $Core */ /* dns.cpp - Nonblocking DNS functions. @@ -40,11 +40,6 @@ looks like this, walks like this or tastes like this. #include "configreader.h" #include "socket.h" -using irc::sockets::insp_inaddr; -using irc::sockets::insp_ntoa; -using irc::sockets::insp_aton; -using irc::sockets::OpenTCPSocket; - /** Masks to mask off the responses we get from the DNSRequest methods */ enum QueryInfo @@ -131,7 +126,7 @@ class RequestTimeout : public Timer DNSRequest* watch; int watchid; public: - RequestTimeout(unsigned long n, InspIRCd* SI, DNSRequest* watching, int id) : Timer(n, time(NULL)), ServerInstance(SI), watch(watching), watchid(id) + RequestTimeout(unsigned long n, InspIRCd* SI, DNSRequest* watching, int id) : Timer(n, SI->Time()), ServerInstance(SI), watch(watching), watchid(id) { } @@ -219,7 +214,7 @@ int DNSRequest::SendRequests(const DNSHeader *header, const int length, QueryTyp this->rr_class = 1; this->type = qt; - + DNS::EmptyHeader(payload,header,length); #ifdef IPV6 @@ -255,7 +250,7 @@ DNSRequest* DNS::AddQuery(DNSHeader *header, int &id, const char* original) /* Is the DNS connection down? */ if (this->GetFd() == -1) return NULL; - + /* Create an id */ id = this->PRNG() & DNS::MAX_REQUEST_ID; @@ -355,7 +350,7 @@ void DNS::Rehash() #endif /* Initialize mastersocket */ - int s = OpenTCPSocket(ServerInstance->Config->DNSServer, SOCK_DGRAM); + int s = irc::sockets::OpenTCPSocket(ServerInstance->Config->DNSServer, SOCK_DGRAM); this->SetFd(s); ServerInstance->SE->NonBlocking(this->GetFd()); @@ -410,7 +405,7 @@ DNS::DNS(InspIRCd* Instance) : ServerInstance(Instance) /* DNS::Rehash() sets this to a valid ptr */ this->cache = NULL; - + /* Again, DNS::Rehash() sets this to a * valid value */ @@ -468,7 +463,7 @@ int DNS::GetIP(const char *name) DNSHeader h; int id; int length; - + if ((length = this->MakePayload(name, DNS_QUERY_A, 1, (unsigned char*)&h.payload)) == -1) return -1; @@ -517,7 +512,7 @@ int DNS::GetCName(const char *alias) } /** Start lookup of an IP address to a hostname */ -int DNS::GetName(const insp_inaddr *ip) +int DNS::GetName(const irc::sockets::insp_inaddr *ip) { char query[128]; DNSHeader h; @@ -540,7 +535,7 @@ int DNS::GetName(const insp_inaddr *ip) if ((length = this->MakePayload(query, DNS_QUERY_PTR, 1, (unsigned char*)&h.payload)) == -1) return -1; - DNSRequest* req = this->AddQuery(&h, id, insp_ntoa(*ip)); + DNSRequest* req = this->AddQuery(&h, id, irc::sockets::insp_ntoa(*ip)); if ((!req) || (req->SendRequests(&h, length, DNS_QUERY_PTR) == -1)) return -1; @@ -768,7 +763,6 @@ DNSResult DNS::GetResult(int resultnum) default: break; - } /* Build the reply with the id and hostname/ip in it */ @@ -791,6 +785,7 @@ DNSInfo DNSRequest::ResultIsReady(DNSHeader &header, int length, int result_we_w rr.type = DNS_QUERY_NONE; rr.rdlength = 0; rr.ttl = 1; /* GCC is a whiney bastard -- see the XXX below. */ + rr.rr_class = 0; /* Same for VC++ */ if (!(header.flags1 & FLAGS_MASK_QR)) return std::make_pair((unsigned char*)NULL,"Not a query result"); @@ -851,7 +846,7 @@ DNSInfo DNSRequest::ResultIsReady(DNSHeader &header, int length, int result_we_w /* XXX: We actually initialise 'rr' here including its ttl field */ if (curanswer == result_we_want) DNS::FillResourceRecord(&rr,&header.payload[i]); - + i += 10; if (rr.type != this->type) { @@ -933,7 +928,6 @@ DNS::~DNS() ServerInstance->SE->Shutdown(this, 2); ServerInstance->SE->Close(this); ServerInstance->Timers->DelTimer(this->PruneTimer); - delete this->PruneTimer; } CachedQuery* DNS::GetCache(const std::string &source) @@ -944,7 +938,7 @@ CachedQuery* DNS::GetCache(const std::string &source) else return NULL; } - + void DNS::DelCache(const std::string &source) { cache->erase(source.c_str()); @@ -977,7 +971,7 @@ Resolver::Resolver(InspIRCd* Instance, const std::string &source, QueryType qt, } } - insp_inaddr binip; + irc::sockets::insp_inaddr binip; switch (querytype) { @@ -986,7 +980,7 @@ Resolver::Resolver(InspIRCd* Instance, const std::string &source, QueryType qt, break; case DNS_QUERY_PTR: - if (insp_aton(source.c_str(), &binip) > 0) + if (irc::sockets::insp_aton(source.c_str(), &binip) > 0) { /* Valid ip address */ this->myid = ServerInstance->Res->GetName(&binip); @@ -1069,7 +1063,7 @@ void DNS::HandleEvent(EventType, int) res = this->GetResult(resultnum); ServerInstance->Logs->Log("RESOLVER",DEBUG,"Result %d id %d", resultnum, res.id); - + /* Is there a usable request id? */ if (res.id != -1) { @@ -1096,7 +1090,7 @@ void DNS::HandleEvent(EventType, int) { if (ServerInstance && ServerInstance->stats) ServerInstance->stats->statsDnsGood++; - + if (!this->GetCache(res.original.c_str())) this->cache->insert(std::make_pair(res.original.c_str(), CachedQuery(res.result, res.ttl))); @@ -1105,14 +1099,14 @@ void DNS::HandleEvent(EventType, int) Classes[res.id] = NULL; } } - + if (ServerInstance && ServerInstance->stats) ServerInstance->stats->statsDns++; } resultnum++; } - + /** Add a derived Resolver to the working set */ bool DNS::AddResolverClass(Resolver* r) { @@ -1154,7 +1148,7 @@ void DNS::CleanResolvers(Module* module) { if (Classes[i]->GetCreator() == module) { - Classes[i]->OnError(RESLOVER_FORCEUNLOAD, "Parent module is unloading"); + Classes[i]->OnError(RESOLVER_FORCEUNLOAD, "Parent module is unloading"); delete Classes[i]; Classes[i] = NULL; } @@ -1169,9 +1163,8 @@ unsigned long DNS::PRNG() timeval n; serverstats* s = ServerInstance->stats; gettimeofday(&n,NULL); - val = (n.tv_usec ^ getpid() ^ geteuid() ^ (this->currid++)) ^ s->statsAccept + n.tv_sec; - val = val + s->statsCollisions ^ s->statsDnsGood - s->statsDnsBad; + val = (n.tv_usec ^ (getpid() ^ geteuid()) ^ ((this->currid++)) ^ s->statsAccept) + n.tv_sec; + val = val + (s->statsCollisions ^ s->statsDnsGood) - s->statsDnsBad; val += (s->statsConnects ^ (unsigned long)s->statsSent ^ (unsigned long)s->statsRecv) - ServerInstance->Config->ports.size(); return val; } -