X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fdnsqueue.cpp;h=116f09010b963f50f56232e1e77d303c9a639721;hb=55bd1494b060dba7c266b91824f3fcce64a4d7a8;hp=cf1fb7484eb089b474fbf7892031319b5090aca3;hpb=1a12f849b82ffa7d6cab5685c35700b6bda798f1;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/dnsqueue.cpp b/src/dnsqueue.cpp index cf1fb7484..116f09010 100644 --- a/src/dnsqueue.cpp +++ b/src/dnsqueue.cpp @@ -23,7 +23,6 @@ using namespace std; #include "inspircd_util.h" #include "inspircd_config.h" #include -#include #include #include #include @@ -38,11 +37,7 @@ using namespace std; #include #include #include -#include #include -#include -#include -#include #include "connection.h" #include "users.h" #include "servers.h" @@ -57,7 +52,6 @@ using namespace std; #include "xline.h" #include "inspstring.h" #include "dnsqueue.h" -#include #include #include #include @@ -65,159 +59,104 @@ using namespace std; #include #include #include -#include -#include -#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; extern std::vector modules; extern std::vector module_names; extern std::vector factory; -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, irc::StrHashComp> user_hash; +typedef nspace::hash_map, irc::StrHashComp> chan_hash; +typedef nspace::hash_map, irc::InAddr_HashComp> address_cache; +typedef nspace::hash_map, irc::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 address_cache IP; 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,""); } ~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) { - log(DEBUG,"Applying hostname lookup to %s: %s",usr->nick,hostname.c_str()); - if (hostname != "") + if (usr->registered > 3) + { + usr->dns_done = true; + return true; + } + 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; } - return false; + usr->dns_done = true; + return true; } } else { - usr->dns_done = true; + usr = Find(u); + if (usr) + usr->dns_done = true; return true; } } @@ -227,17 +166,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; } }; -typedef std::deque dns_queue; - -dns_queue dnsq; +Lookup dnsq[255]; bool lookup_dns(std::string nick) { @@ -247,9 +184,26 @@ 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); - dnsq.push_back(L); - return true; + Lookup L; + if (L.DoLookup(nick)) + { + for (int j = 0; j < 255; j++) + { + 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; } @@ -257,17 +211,21 @@ bool lookup_dns(std::string nick) void dns_poll() { // do we have items in the queue? - if (dnsq.size()) + for (int j = 0; j <= max_fd_alloc; j++) { // are any ready, or stale? - if (dnsq[0].Done() || (!dnsq[0].GetFD())) + if (dnsq[j].GetFD()) { - if (dnsq[0].GetFD()) + if (dnsq[j].Done()) { - log(DEBUG,"****** DNS lookup for fd %d is complete. ******",dnsq[0].GetFD()); + dnsq[j].Reset(); } - dnsq.pop_front(); } } -} + // 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; +}