X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fdnsqueue.cpp;h=2198d0bed2e19677b98a8fbb5e791b57703d7eba;hb=eb7125445e8740e177ad05a74a5cc90324a35f98;hp=58d55c1a5aad717e797227ddeb1a50c61879daa5;hpb=d046263d7577521a10f40296ea4a574fded1d821;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/dnsqueue.cpp b/src/dnsqueue.cpp index 58d55c1a5..2198d0bed 100644 --- a/src/dnsqueue.cpp +++ b/src/dnsqueue.cpp @@ -70,12 +70,8 @@ using namespace std; #include #include #include "dns.h" - -#ifdef GCC3 -#define nspace __gnu_cxx -#else -#define nspace std -#endif +#include "helperfuncs.h" +#include "hashcomp.h" extern int MaxWhoResults; @@ -86,128 +82,67 @@ extern std::vector fd_reap; extern int MODCOUNT; -namespace nspace -{ -#ifdef GCC34 - template<> struct hash -#else - template<> struct nspace::hash -#endif - { - size_t operator()(const struct in_addr &a) const - { - size_t q; - memcpy(&q,&a,sizeof(size_t)); - return q; - } - }; -#ifdef GCC34 - template<> struct hash -#else - template<> struct nspace::hash -#endif - { - size_t operator()(const string &s) const - { - char a[MAXBUF]; - static struct hash strhash; - strlcpy(a,s.c_str(),MAXBUF); - strlower(a); - return strhash(a); - } - }; -} - - -struct StrHashComp -{ - - bool operator()(const string& s1, const string& s2) const - { - char a[MAXBUF],b[MAXBUF]; - strlcpy(a,s1.c_str(),MAXBUF); - strlcpy(b,s2.c_str(),MAXBUF); - return (strcasecmp(a,b) == 0); - } - -}; - -struct InAddr_HashComp -{ - - bool operator()(const in_addr &s1, const in_addr &s2) const - { - size_t q; - size_t p; - - memcpy(&q,&s1,sizeof(size_t)); - memcpy(&p,&s2,sizeof(size_t)); - - return (q == p); - } - -}; - - typedef nspace::hash_map, StrHashComp> user_hash; typedef nspace::hash_map, StrHashComp> chan_hash; typedef nspace::hash_map, InAddr_HashComp> address_cache; +typedef nspace::hash_map, StrHashComp> whowas_hash; typedef std::deque command_table; extern user_hash clientlist; extern chan_hash chanlist; -extern user_hash whowas; +extern whowas_hash whowas; extern command_table cmdlist; extern ClassVector Classes; extern char DNSServer[MAXBUF]; +long max_fd_alloc = 0; + +extern time_t TIME; class Lookup { private: - DNS* resolver; + DNS resolver; char u[NICKMAX]; public: Lookup() { strcpy(u,""); - resolver = NULL; } void Reset() { strcpy(u,""); - if (resolver) - delete resolver; - resolver = NULL; } ~Lookup() { - if (resolver) - delete resolver; } - Lookup(std::string nick) + bool DoLookup(std::string nick) { userrec* usr = Find(nick); if (usr) { log(DEBUG,"New Lookup class for %s with DNSServer set to '%s'",nick.c_str(),DNSServer); - resolver = new DNS(std::string(DNSServer)); - resolver->ReverseLookup(std::string(usr->host)); + resolver.SetNS(std::string(DNSServer)); + if (!resolver.ReverseLookup(std::string(usr->host))) + return false; strlcpy(u,nick.c_str(),NICKMAX); + return true; } + return false; } bool Done() { userrec* usr = NULL; - if (resolver->HasResult()) + if (resolver.HasResult()) { - if (resolver->GetFD() != 0) + if (resolver.GetFD() != 0) { - std::string hostname = resolver->GetResult(); + std::string hostname = resolver.GetResult(); + log(DEBUG,"RESULT! %s",hostname.c_str()); usr = Find(u); if (usr) { @@ -219,6 +154,7 @@ public: if ((hostname != "") && (usr->registered != 7)) { strlcpy(usr->host,hostname.c_str(),MAXBUF); + strlcpy(usr->dhost,hostname.c_str(),MAXBUF); WriteServ(usr->fd,"NOTICE Auth :Resolved your hostname: %s",hostname.c_str()); usr->dns_done = true; return true; @@ -229,7 +165,9 @@ public: } else { - usr->dns_done = true; + usr = Find(u); + if (usr) + usr->dns_done = true; return true; } } @@ -239,15 +177,15 @@ public: int GetFD() { userrec* usr = Find(u); - if (usr) - { - return usr->fd; - } - else return 0; + if (!usr) + return 0; + if (usr->dns_done) + return 0; + return usr->fd; } }; -Lookup dnsq[MAXBUF]; +Lookup dnsq[255]; bool lookup_dns(std::string nick) { @@ -257,14 +195,25 @@ bool lookup_dns(std::string nick) // place a new user into the queue... log(DEBUG,"Queueing DNS lookup for %s",u->nick); WriteServ(u->fd,"NOTICE Auth :Looking up your hostname..."); - Lookup L(nick); - for (int j = 0; j < MAXBUF; j++) + Lookup L; + if (L.DoLookup(nick)) { - if (!dnsq[j].GetFD()) + for (int j = 0; j < 255; j++) { - dnsq[j] = L; - return true; + if (!dnsq[j].GetFD()) + { + dnsq[j] = L; + return true; + } } + // calculate the maximum value, this saves cpu time later + for (int p = 0; p < 255; p++) + if (dnsq[p].GetFD()) + max_fd_alloc = p; + } + else + { + return false; } } return false; @@ -273,7 +222,7 @@ bool lookup_dns(std::string nick) void dns_poll() { // do we have items in the queue? - for (int j = 0; j < MAXBUF; j++) + for (int j = 0; j <= max_fd_alloc; j++) { // are any ready, or stale? if (dnsq[j].GetFD()) @@ -283,7 +232,11 @@ void dns_poll() dnsq[j].Reset(); } } - else dnsq[j].Reset(); } -} + // looks like someones freed an item, recalculate end of list. + if ((!dnsq[max_fd_alloc].GetFD()) && (max_fd_alloc != 0)) + for (int p = 0; p < 255; p++) + if (dnsq[p].GetFD()) + max_fd_alloc = p; +}