From ade5e948783377dfb7820f8ba8957fe9ae0e3147 Mon Sep 17 00:00:00 2001 From: brain Date: Fri, 1 Apr 2005 17:08:31 +0000 Subject: Added nonblocking dns *** BUG BUG BUG - If dns is slow, things will go wrong!!!! do not use this on a live net without accepting the risk involved! *** Will be fixed by next commit. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@938 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/dnsqueue.cpp | 248 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 src/dnsqueue.cpp (limited to 'src/dnsqueue.cpp') diff --git a/src/dnsqueue.cpp b/src/dnsqueue.cpp new file mode 100644 index 000000000..ac521f091 --- /dev/null +++ b/src/dnsqueue.cpp @@ -0,0 +1,248 @@ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * Inspire is copyright (C) 2002-2004 ChatSpike-Dev. + * E-mail: + * + * + * + * Written by Craig Edwards, Craig McLure, and others. + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +/* Now with added unF! ;) */ + +using namespace std; + +#include "inspircd.h" +#include "inspircd_io.h" +#include "inspircd_util.h" +#include "inspircd_config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef GCC3 +#include +#else +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include "connection.h" +#include "users.h" +#include "servers.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 +#include +#include +#include +#include +#include "dns.h" + +#ifdef GCC3 +#define nspace __gnu_cxx +#else +#define nspace std +#endif + +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 std::deque command_table; + +extern user_hash clientlist; +extern chan_hash chanlist; +extern user_hash whowas; +extern command_table cmdlist; +extern address_cache IP; + +extern ClassVector Classes; + +extern char DNSServer[MAXBUF]; + +class Lookup { +private: + DNS* resolver; + userrec* u; +public: + Lookup() + { + u = NULL; + resolver = NULL; + } + + ~Lookup() + { + if (resolver) + delete resolver; + } + + Lookup(userrec* user) + { + u = user; + log(DEBUG,"New Lookup class with DNSServer set to '%s'",DNSServer); + resolver = new DNS(std::string(DNSServer)); + resolver->ReverseLookup(std::string(user->host)); + } + + bool Done() + { + if (resolver->HasResult()) + { + log(DEBUG,"DNS Result available!"); + std::string hostname = resolver->GetResult(); + if (u) + { + log(DEBUG,"Applying hostname lookup to %s: %s",u->nick,hostname.c_str()); + if (hostname != "") + strlcpy(u->host,hostname.c_str(),MAXBUF); + u->dns_done = true; + return true; + } + } + return false; + } + + int GetFD() + { + if (u) + { + return u->fd; + } + else return 0; + } +}; + +typedef std::vector dns_queue; + +dns_queue dnsq; + +bool lookup_dns(userrec* u) +{ + // place a new user into the queue... + log(DEBUG,"Queueing DNS lookup for %s",u->nick); + Lookup L(u); + dnsq.push_back(L); + return true; +} + +void dns_poll() +{ + // do we have items in the queue? + if (dnsq.size()) + { + log(DEBUG,"DNS items pending..."); + // are any ready, or stale? + if (dnsq[0].Done() || (!dnsq[0].GetFD())) + { + // if they are take them out... + log(DEBUG,"****** DNS lookup for fd %d is complete. ******",dnsq[0].GetFD()); + dnsq.erase(dnsq.begin()); + } + } +} + -- cgit v1.3.1-10-gc9f91