From 25493049050dadfa08527c813f4209a09beab6a7 Mon Sep 17 00:00:00 2001 From: brain Date: Fri, 10 Nov 2006 20:13:59 +0000 Subject: Add fix for patch #166 (this is a reasonably big one) git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5679 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/dns.h | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'include/dns.h') diff --git a/include/dns.h b/include/dns.h index 79b286233..4a1335cc7 100644 --- a/include/dns.h +++ b/include/dns.h @@ -48,6 +48,7 @@ using irc::sockets::insp_sockaddr; using irc::sockets::insp_inaddr; class InspIRCd; +class Module; /** * Result status, used internally @@ -69,7 +70,8 @@ enum ResolverError RESOLVER_NXDOMAIN = 2, RESOLVER_NOTREADY = 3, RESOLVER_BADIP = 4, - RESOLVER_TIMEOUT = 5 + RESOLVER_TIMEOUT = 5, + RESLOVER_FORCEUNLOAD = 6 }; /** @@ -146,6 +148,10 @@ class Resolver : public Extensible * Pointer to creator */ InspIRCd* ServerInstance; + /** + * Pointer to creator module (if any, or NULL) + */ + Module* Creator; /** * The input data, either a host or an IP address */ @@ -193,8 +199,14 @@ class Resolver : public Extensible * event a lookup could not be allocated, or a similar hard error occurs such as * the network being down. This will also be thrown if an invalid IP address is * passed when resolving a 'PTR' record. + * + * NOTE: If you are instantiating your DNS lookup from a module, you should set the + * value of creator to point at your Module class. This way if your module is unloaded + * 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); + Resolver(InspIRCd* Instance, const std::string &source, QueryType qt, Module* creator = NULL); + /** * The default destructor does nothing. */ @@ -220,6 +232,11 @@ class Resolver : public Extensible * this method will return -1. */ int GetId(); + + /** + * Returns the creator module, or NULL + */ + Module* GetCreator(); }; /** DNS is a singleton class used by the core to dispatch dns @@ -364,6 +381,13 @@ class DNS : public EventHandler * Turn an in6_addr into a .ip6.arpa domain */ static void MakeIP6Int(char* query, const in6_addr *ip); + + /** + * Clean out all dns resolvers owned by a particular + * module, to make unloading a module safe if there + * are dns requests currently in progress. + */ + void CleanResolvers(Module* module); }; #endif -- cgit v1.2.3