class Lookup;
Lookup* dnslist[MAX_DESCRIPTORS];
+Lookup* user_fd_to_dns[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()
{
*u = 0;
if (resolver1.GetFD() != -1)
{
dnslist[resolver1.GetFD()] = this;
+ user_fd_to_dns[usr->fd] = this;
return true;
}
}
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)
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");
{
resolver2.ForwardLookup(hostname, true);
if (resolver2.GetFD() != -1)
+ {
dnslist[resolver2.GetFD()] = this;
+ user_fd_to_dns[usr->fd] = this;
+ }
}
}
}
return false;
}
+void ZapThisDns(int fd)
+{
+ if ((fd < 0) || (fd > MAX_DESCRIPTORS))
+ return;
+
+ Lookup *x = user_fd_to_dns[fd];
+
+ if (x)
+ {
+ if (x->resolver1.GetFD() != -1)
+ {
+ log(DEBUG,"Whacked resolver1");
+ dns_close(x->resolver1.GetFD());
+ }
+
+ if (x->resolver2.GetFD() != -1)
+ {
+ log(DEBUG,"Whacked resolver2");
+ dns_close(x->resolver2.GetFD());
+ }
+ }
+}
+
void dns_poll(int fdcheck)
{
/* Check the given file descriptor is in valid range */
if (((unsigned)TIME > (unsigned)curr->timeout) && (curr->registered != 7))
{
log(DEBUG,"InspIRCd: registration timeout: %s",curr->nick);
+ ZapThisDns(curr->fd);
GlobalGoners.AddItem(curr,"Registration timeout");
continue;
}
if ((TIME > curr->signon) && (curr->registered == 3) && (AllModulesReportReady(curr)))
{
curr->dns_done = true;
+ ZapThisDns(curr->fd);
ServerInstance->stats->statsDnsBad++;
FullConnectUser(curr,&GlobalGoners);
continue;
{
log(DEBUG,"dns done, registered=3, and modules ready, OK");
FullConnectUser(curr,&GlobalGoners);
+ ZapThisDns(curr->fd);
continue;
}