]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/dnsqueue.cpp
Fix test client error cheecking on result types
[user/henk/code/inspircd.git] / src / dnsqueue.cpp
index 93d682012f36bb728d96810fe89f272639105758..fb0e0bd75999900c96170afed78f019b5253c63f 100644 (file)
@@ -2,7 +2,7 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
+ *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
  *                       E-mail:
  *                <brain@chatspike.net>
  *               <Craig@chatspike.net>
  * ---------------------------------------------------
  */
 
-using namespace std;
-
 #include "inspircd_config.h"
 #include "inspircd.h"
-#include "inspircd_io.h"
-#include "inspircd_util.h"
+#include "configreader.h"
 #include <unistd.h>
 #include <sys/errno.h>
 #include <sys/ioctl.h>
 #include <sys/utsname.h>
-#include <cstdio>
-#include <time.h>
 #include <string>
-#ifdef GCC3
-#include <ext/hash_map>
-#else
-#include <hash_map>
-#endif
-#include <map>
-#include <sstream>
-#include <vector>
-#include <deque>
 #include "users.h"
 #include "globals.h"
 #include "inspstring.h"
 #include "dnsqueue.h"
-#include <time.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <netinet/in.h>
-#include <string.h>
 #include "dns.h"
 #include "helperfuncs.h"
 #include "hashcomp.h"
 #include "socketengine.h"
+#include "socket.h"
 
-extern SocketEngine* SE;
 extern ServerConfig* Config;
+extern InspIRCd* ServerInstance;
 
 class Lookup;
 
-Lookup* dnslist[65535];
+Lookup* dnslist[MAX_DESCRIPTORS];
+Lookup* user_fd_to_dns[MAX_DESCRIPTORS];
+extern userrec* fd_ref_table[MAX_DESCRIPTORS];
 
 //enum LookupState { reverse, forward };
 
 class Lookup {
 private:
-       DNS resolver1;
-       DNS resolver2;
        char u[NICKMAX];
        std::string hostname;
 public:
+       DNS resolver1;
+       DNS resolver2;
+
        Lookup()
        {
-               strcpy(u,"");
+               *u = 0;
+               hostname = "";
        }
 
        void Reset()
        {
-               strcpy(u,"");
+               *u = 0;
+               hostname = "";
        }
 
        ~Lookup()
@@ -87,17 +73,18 @@ public:
                userrec* usr = Find(nick);
                if (usr)
                {
-                       resolver1.SetNS(std::string(DNSServer));
-                       if (!resolver1.ReverseLookup(std::string(usr->host)))
+                       resolver1.SetNS(std::string(Config->DNSServer));
+                       if (!resolver1.ReverseLookup(std::string(usr->host), true))
                        {
                                return false;
                        }
-                       strlcpy(u,nick.c_str(),NICKMAX);
+                       strlcpy(u,nick.c_str(),NICKMAX-1);
 
                        /* ASSOCIATE WITH DNS LOOKUP LIST */
                        if (resolver1.GetFD() != -1)
                        {
                                dnslist[resolver1.GetFD()] = this;
+                               user_fd_to_dns[usr->fd] = this;
                                return true;
                        }
                }
@@ -126,10 +113,18 @@ public:
                                                }
                                                if ((hostname != "") && (usr->registered != 7))
                                                {
-                                                       if (std::string(usr->ip) == ip)
+                                                       if ((std::string(inet_ntoa(usr->ip4)) == ip) && (hostname.length() < 65))
                                                        {
-                                                               strlcpy(usr->host,hostname.c_str(),MAXBUF);
-                                                               strlcpy(usr->dhost,hostname.c_str(),MAXBUF);
+                                                               if ((hostname.find_last_of(".in-addr.arpa") == hostname.length() - 1) && (hostname.find_last_of(".in-addr.arpa") != std::string::npos))
+                                                               {
+                                                                       WriteServ(usr->fd,"NOTICE Auth :*** Your ISP are muppets -- reverse resolution resolves back to same reverse .arpa domain (!)");
+                                                               }
+                                                               else
+                                                               {
+                                                                       strlcpy(usr->host,hostname.c_str(),64);
+                                                                       strlcpy(usr->dhost,hostname.c_str(),64);
+                                                                       WriteServ(usr->fd,"NOTICE Auth :*** Found your hostname");
+                                                               }
                                                        }
                                                        usr->dns_done = true;
                                                        return true;
@@ -158,7 +153,10 @@ public:
                                if ((usr) && (usr->dns_done))
                                {
                                        if (resolver1.GetFD() != -1)
+                                       {
                                                dnslist[resolver1.GetFD()] = NULL;
+                                               user_fd_to_dns[usr->fd] = NULL;
+                                       }
                                        return true;
                                }
                                if (resolver1.GetFD() != -1)
@@ -167,17 +165,23 @@ public:
                                        hostname = resolver1.GetResult();
                                        if (usr)
                                        {
+                                               user_fd_to_dns[usr->fd] = NULL;
                                                if ((usr->registered > 3) || (hostname == ""))
                                                {
+                                                       WriteServ(usr->fd,"NOTICE Auth :*** Could not resolve your hostname -- Using your IP address instead");
                                                        usr->dns_done = true;
                                                        return true;
                                                }
-                                       }
-                                       if (hostname != "")
-                                       {
-                                               resolver2.ForwardLookup(hostname);
-                                               if (resolver2.GetFD() != -1)
-                                                       dnslist[resolver2.GetFD()] = this;
+                                               if (hostname != "")
+                                               {
+                                                       resolver2.ForwardLookup(hostname, true);
+                                                       if (resolver2.GetFD() != -1)
+                                                       {
+                                                               dnslist[resolver2.GetFD()] = this;
+                                                               if (usr)
+                                                                       user_fd_to_dns[usr->fd] = this;
+                                                       }
+                                               }
                                        }
                                }
                        }
@@ -196,12 +200,23 @@ public:
        }
 };
 
-bool lookup_dns(std::string nick)
+bool lookup_dns(const std::string &nick)
 {
        /* First attempt to find the nickname */
        userrec* u = Find(nick);
        if (u)
        {
+               /* Check the cache */
+               /*address_cache::iterator address = addrcache.find(u->ip4);
+               if (address != addrcache.end())
+               {
+                       WriteServ(u->fd,"NOTICE Auth :*** Found your hostname (cached)");
+                       log(DEBUG,"Found cached host");
+                       strlcpy(u->host,address->second->c_str(),MAXBUF);
+                       strlcpy(u->dhost,address->second->c_str(),MAXBUF);
+                       u->dns_done = true;
+                       return true;
+               }*/
                /* If the user exists, create a new
                 * lookup object, and associate it
                 * with the user. The lookup object
@@ -223,10 +238,47 @@ bool lookup_dns(std::string nick)
        return false;
 }
 
+void ZapThisDns(int fd)
+{
+#ifdef THREADED_DNS
+/*     if (fd_ref_table[fd])
+       {
+                       if (fd_ref_table[fd]->registered >= 3)
+               {
+                       log(DEBUG,"Joining thread for user %d",fd);
+                       if (pthread_join(fd_ref_table[fd]->dnsthread, NULL))
+                       {
+                               log(DEBUG,"Can't pthread_join(): %s", strerror(errno));
+                       }
+               }
+       }*/
+#else
+       if ((fd < 0) || (fd > MAX_DESCRIPTORS))
+               return;
+
+       Lookup *x = user_fd_to_dns[fd];
+
+       if (x)
+       {
+               if (x->resolver1.GetFD() > 0)
+               {
+                       log(DEBUG,"Whacked resolver1");
+                       dns_close(x->resolver1.GetFD());
+               }
+
+               if (x->resolver2.GetFD() > 0)
+               {
+                       log(DEBUG,"Whacked resolver2");
+                       dns_close(x->resolver2.GetFD());
+               }
+       }
+#endif
+}
+
 void dns_poll(int fdcheck)
 {
        /* Check the given file descriptor is in valid range */
-       if ((fdcheck < 0) || (fdcheck > 65535))
+       if ((fdcheck < 0) || (fdcheck > MAX_DESCRIPTORS))
                return;
 
        /* Try and find the file descriptor in our list of
@@ -245,7 +297,7 @@ void dns_poll(int fdcheck)
                                 * from the socket engine, as dns.cpp tracks it
                                 * for us if we are in single-threaded country.
                                 */
-                               delete x;
+                               DELETE(x);
                        }
                }
                else
@@ -253,7 +305,7 @@ void dns_poll(int fdcheck)
                        /* its fd is dodgy, the dns code probably
                         * bashed it due to error. Free the class.
                         */
-                       delete x;
+                       DELETE(x);
                }
                /* If we got down here, the dns lookup was valid, BUT,
                 * its still in progress. Be patient, and wait for
@@ -265,6 +317,6 @@ void dns_poll(int fdcheck)
         * just to be safe so we dont get any more events
         * about it.
         */
-       SE->DelFd(fdcheck);
+       if (ServerInstance && ServerInstance->SE)
+               ServerInstance->SE->DelFd(fdcheck);
 }
-