diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/dns.h | 44 | ||||
-rw-r--r-- | include/users.h | 2 |
2 files changed, 41 insertions, 5 deletions
diff --git a/include/dns.h b/include/dns.h index cb7e0549a..83e4ab902 100644 --- a/include/dns.h +++ b/include/dns.h @@ -37,6 +37,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "base.h" #include "socketengine.h" #include "socket.h" +#include "hash_map.h" +#include "hashcomp.h" using namespace std; using irc::sockets::insp_aton; @@ -56,8 +58,9 @@ class DNSResult : public classbase int id; std::string result; unsigned long ttl; + std::string original; - DNSResult(int i, const std::string &res, unsigned long timetolive) : id(i), result(res), ttl(timetolive) { } + DNSResult(int i, const std::string &res, unsigned long timetolive, const std::string &orig) : id(i), result(res), ttl(timetolive), original(orig) { } }; /** @@ -65,6 +68,30 @@ class DNSResult : public classbase */ typedef std::pair<unsigned char*, std::string> DNSInfo; +/** Cached item + */ +class CachedQuery +{ + public: + std::string data; + time_t expires; + + CachedQuery(const std::string &res, unsigned int ttl) : data(res) + { + expires = time(NULL) + ttl; + } + + int CalcTTLRemaining() + { + int n = expires - time(NULL); + return (n < 0 ? 0 : n); + } +}; + +/** DNS cache information + */ +typedef nspace::hash_map<irc::string, CachedQuery, nspace::hash<irc::string> > dnscache; + /** * Error types that class Resolver can emit to its error method. */ @@ -201,7 +228,7 @@ class Resolver : public Extensible * whilst lookups are in progress, they can be safely removed and your module will not * crash the server. */ - Resolver(InspIRCd* Instance, const std::string &source, QueryType qt, Module* creator = NULL); + Resolver(InspIRCd* Instance, const std::string &source, QueryType qt, bool &cached, Module* creator = NULL); /** * The default destructor does nothing. @@ -211,7 +238,7 @@ class Resolver : public Extensible * When your lookup completes, this method will be called. * @param result The resulting DNS lookup, either an IP address or a hostname. */ - virtual void OnLookupComplete(const std::string &result, unsigned int ttl) = 0; + virtual void OnLookupComplete(const std::string &result, unsigned int ttl); /** * If an error occurs (such as NXDOMAIN, no domain name found) then this method * will be called. @@ -271,6 +298,11 @@ class DNS : public EventHandler bool ip6munge; /** + * Currently cached items + */ + dnscache* cache; + + /** * Build a dns packet payload */ int MakePayload(const char* name, const QueryType rr, const unsigned short rr_class, unsigned char* payload); @@ -352,7 +384,7 @@ class DNS : public EventHandler /** * Add a query to the list to be sent */ - DNSRequest* AddQuery(DNSHeader *header, int &id); + DNSRequest* AddQuery(DNSHeader *header, int &id, const char* original); /** * The constructor initialises the dns socket, @@ -388,6 +420,10 @@ class DNS : public EventHandler * are dns requests currently in progress. */ void CleanResolvers(Module* module); + + CachedQuery* GetCache(const std::string &source); + + void DelCache(const std::string &source); }; #endif diff --git a/include/users.h b/include/users.h index 749030894..c26d791fa 100644 --- a/include/users.h +++ b/include/users.h @@ -67,7 +67,7 @@ class UserResolver : public Resolver int bound_fd; bool fwd; public: - UserResolver(InspIRCd* Instance, userrec* user, std::string to_resolve, QueryType qt); + UserResolver(InspIRCd* Instance, userrec* user, std::string to_resolve, QueryType qt, bool &cache); void OnLookupComplete(const std::string &result, unsigned int ttl); void OnError(ResolverError e, const std::string &errormessage); |