X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fdnsqueue.cpp;h=ce309a6880f817c73d467cd29142fa7c9a4e433d;hb=cc0cd720c6910e63834fdf9d82399637cda37786;hp=5562b2299bfaa1acac15e13839bc83d068df6c4d;hpb=c07db3cfd25e4432a8a4450b7cb1f7bd715ca8ab;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/dnsqueue.cpp b/src/dnsqueue.cpp index 5562b2299..ce309a688 100644 --- a/src/dnsqueue.cpp +++ b/src/dnsqueue.cpp @@ -14,8 +14,6 @@ * --------------------------------------------------- */ -/* Now with added unF! ;) */ - using namespace std; #include "inspircd_config.h" @@ -39,53 +37,26 @@ using namespace std; #include #include #include "users.h" -#include "ctables.h" #include "globals.h" -#include "modules.h" -#include "dynamic.h" -#include "wildcard.h" -#include "message.h" -#include "mode.h" -#include "commands.h" -#include "xline.h" #include "inspstring.h" #include "dnsqueue.h" #include #include #include -#include #include #include #include #include "dns.h" #include "helperfuncs.h" #include "hashcomp.h" +#include "socketengine.h" -extern int MaxWhoResults; - -extern std::vector modules; -extern std::vector module_names; -extern std::vector factory; - -extern int MODCOUNT; - -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 whowas_hash whowas; -extern command_table cmdlist; - -extern ClassVector Classes; +extern SocketEngine* SE; +extern ServerConfig* Config; -extern char DNSServer[MAXBUF]; -long max_fd_alloc = 0; +class Lookup; -extern time_t TIME; +Lookup* dnslist[65535]; //enum LookupState { reverse, forward }; @@ -116,29 +87,35 @@ public: userrec* usr = Find(nick); if (usr) { - log(DEBUG,"New Lookup class for %s with DNSServer set to '%s'",nick.c_str(),DNSServer); - resolver1.SetNS(std::string(DNSServer)); + resolver1.SetNS(std::string(Config->DNSServer)); if (!resolver1.ReverseLookup(std::string(usr->host))) + { return false; + } strlcpy(u,nick.c_str(),NICKMAX); - return true; + + /* ASSOCIATE WITH DNS LOOKUP LIST */ + if (resolver1.GetFD() != -1) + { + dnslist[resolver1.GetFD()] = this; + return true; + } } return false; } - bool Done() + bool Done(int fdcheck) { if (hostname != "") { // doing forward lookup userrec* usr = NULL; - if (resolver2.HasResult()) + if (resolver2.HasResult(fdcheck)) { - if (resolver2.GetFD() != 0) + if (resolver2.GetFD() != -1) { + dnslist[resolver2.GetFD()] = NULL; std::string ip = resolver2.GetResultIP(); - log(DEBUG,"FORWARD RESULT! %s",ip.c_str()); - usr = Find(u); if (usr) { @@ -153,11 +130,6 @@ public: { strlcpy(usr->host,hostname.c_str(),MAXBUF); strlcpy(usr->dhost,hostname.c_str(),MAXBUF); - log(DEBUG,"Forward and reverse match, assigning hostname"); - } - else - { - log(DEBUG,"AWOOGA! Forward lookup doesn't match reverse: R='%s',F='%s',IP='%s'",hostname.c_str(),ip.c_str(),usr->ip); } usr->dns_done = true; return true; @@ -168,31 +140,45 @@ public: { usr = Find(u); if (usr) + { usr->dns_done = true; + } return true; } } + return false; } else { // doing reverse lookup userrec* usr = NULL; - if (resolver1.HasResult()) + if (resolver1.HasResult(fdcheck)) { - if (resolver1.GetFD() != 0) + usr = Find(u); + if ((usr) && (usr->dns_done)) { + if (resolver1.GetFD() != -1) + dnslist[resolver1.GetFD()] = NULL; + return true; + } + if (resolver1.GetFD() != -1) + { + dnslist[resolver1.GetFD()] = NULL; hostname = resolver1.GetResult(); - log(DEBUG,"REVERSE RESULT! %s",hostname.c_str()); - usr = Find(u); if (usr) { - if (usr->registered > 3) + if ((usr->registered > 3) || (hostname == "")) { usr->dns_done = true; return true; } } - resolver2.ForwardLookup(hostname); + if (hostname != "") + { + resolver2.ForwardLookup(hostname); + if (resolver2.GetFD() != -1) + dnslist[resolver2.GetFD()] = this; + } } } } @@ -210,58 +196,75 @@ public: } }; -Lookup dnsq[255]; - bool lookup_dns(std::string nick) { + /* First attempt to find the nickname */ userrec* u = Find(nick); if (u) { - // 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; - 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; - } + /* If the user exists, create a new + * lookup object, and associate it + * with the user. The lookup object + * will maintain the reference table + * which we use for quickly finding + * dns results. Please note that we + * do not associate a lookup with a + * userrec* pointer and we use the + * nickname instead because, by the + * time the DNS lookup has completed, + * the nickname could have quit and + * if we then try and access the + * pointer we get a nice segfault. + */ + Lookup* L = new Lookup(); + L->DoLookup(nick); + return true; } return false; } -void dns_poll() +void dns_poll(int fdcheck) { - // do we have items in the queue? - for (int j = 0; j <= max_fd_alloc; j++) + /* Check the given file descriptor is in valid range */ + if ((fdcheck < 0) || (fdcheck > 65535)) + return; + + /* Try and find the file descriptor in our list of + * active DNS lookups + */ + Lookup *x = dnslist[fdcheck]; + if (x) { - // are any ready, or stale? - if (dnsq[j].GetFD()) + /* If it exists check if its a valid fd still */ + if (x->GetFD() != -1) { - if (dnsq[j].Done()) + /* Check if its done, if it is delete it */ + if (x->Done(fdcheck)) { - dnsq[j].Reset(); + /* We don't need to delete the file descriptor + * from the socket engine, as dns.cpp tracks it + * for us if we are in single-threaded country. + */ + delete x; } } + else + { + /* its fd is dodgy, the dns code probably + * bashed it due to error. Free the class. + */ + delete x; + } + /* If we got down here, the dns lookup was valid, BUT, + * its still in progress. Be patient, and wait for + * more socketengine events to complete the lookups. + */ + return; } - // 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; - + /* This FD doesnt belong here, lets be rid of it, + * just to be safe so we dont get any more events + * about it. + */ + SE->DelFd(fdcheck); } +