* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * InspIRCd: (C) 2002-2008 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* ---------------------------------------------------
*/
-/* $Core: libIRCDuserresolver */
+/* $Core */
#include "inspircd.h"
-
UserResolver::UserResolver(InspIRCd* Instance, User* user, std::string to_resolve, QueryType qt, bool &cache) :
Resolver(Instance, to_resolve, qt, cache), bound_user(user)
{
if (resultnum)
return;
+ UserResolver *res_forward; // for forward-resolution
+
if ((!this->fwd) && (ServerInstance->SE->GetRef(this->bound_fd) == this->bound_user))
{
this->bound_user->stored_host = result;
/* Check we didnt time out */
if (this->bound_user->registered != REG_ALL)
{
- bool cached;
+ bool lcached = false;
#ifdef IPV6
if (this->bound_user->GetProtocolFamily() == AF_INET6)
{
/* IPV6 forward lookup (with possibility of 4in6) */
const char* ip = this->bound_user->GetIPString();
- bound_user->res_forward = new UserResolver(this->ServerInstance, this->bound_user, result, (!strncmp(ip, "0::ffff:", 8) ? DNS_QUERY_A : DNS_QUERY_AAAA), cached);
+ res_forward = new UserResolver(this->ServerInstance, this->bound_user, result, (!strncmp(ip, "0::ffff:", 8) ? DNS_QUERY_A : DNS_QUERY_AAAA), lcached);
}
else
/* IPV4 lookup (mixed protocol mode) */
#endif
- /* IPV4 lookup (ipv4 only mode) */
- bound_user->res_forward = new UserResolver(this->ServerInstance, this->bound_user, result, DNS_QUERY_A, cached);
- this->ServerInstance->AddResolver(bound_user->res_forward, cached);
+ {
+ /* IPV4 lookup (ipv4 only mode) */
+ res_forward = new UserResolver(this->ServerInstance, this->bound_user, result, DNS_QUERY_A, lcached);
+ }
+ this->ServerInstance->AddResolver(res_forward, lcached);
}
}
catch (CoreException& e)
{
- ServerInstance->Log(DEBUG,"Error in resolver: %s",e.GetReason());
+ ServerInstance->Logs->Log("RESOLVER", DEBUG,"Error in resolver: %s",e.GetReason());
}
}
else if ((this->fwd) && (ServerInstance->SE->GetRef(this->bound_fd) == this->bound_user))
if ((this->bound_user->registered != REG_ALL) && (!this->bound_user->dns_done))
{
/* Hostnames starting with : are not a good thing (tm) */
- if (*(hostname.c_str()) == ':')
+ if (hostname[0] == ':')
hostname.insert(0, "0");
this->bound_user->WriteServ("NOTICE Auth :*** Found your hostname (%s)%s", hostname.c_str(), (cached ? " -- cached" : ""));
this->bound_user->dns_done = true;
- strlcpy(this->bound_user->dhost, hostname.c_str(),64);
- strlcpy(this->bound_user->host, hostname.c_str(),64);
+ this->bound_user->dhost.assign(hostname, 0, 64);
+ this->bound_user->host.assign(hostname, 0, 64);
/* Invalidate cache */
this->bound_user->InvalidateCache();
}
this->bound_user->dns_done = true;
}
}
+
+ // Save some memory by freeing this up; it's never used again in the user's lifetime.
+ this->bound_user->stored_host.resize(0);
}
}
{
this->bound_user->WriteServ("NOTICE Auth :*** Could not resolve your hostname: %s; using your IP address (%s) instead.", errormessage.c_str(), this->bound_user->GetIPString());
this->bound_user->dns_done = true;
+ this->bound_user->stored_host.resize(0);
ServerInstance->stats->statsDnsBad++;
}
}
-
-