class Lookup;
Lookup* dnslist[MAX_DESCRIPTORS];
+Lookup* user_fd_to_dns[MAX_DESCRIPTORS];
+extern userrec* fd_ref_table[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 (usr)
{
resolver1.SetNS(std::string(Config->DNSServer));
- if (!resolver1.ReverseLookup(std::string(usr->host)))
+ if (!resolver1.ReverseLookup(std::string(usr->host), true))
{
return false;
}
if (resolver1.GetFD() != -1)
{
dnslist[resolver1.GetFD()] = this;
+ user_fd_to_dns[usr->fd] = this;
return true;
}
}
}
if ((hostname != "") && (usr->registered != 7))
{
- if ((std::string((char*)inet_ntoa(usr->ip4)) == ip) && (hostname.length() < 65))
+ if ((std::string(inet_ntoa(usr->ip4)) == ip) && (hostname.length() < 65))
{
- strlcpy(usr->host,hostname.c_str(),MAXBUF);
- strlcpy(usr->dhost,hostname.c_str(),MAXBUF);
- /*address_cache::iterator address = addrcache.find(usr->ip4);
- if (address == addrcache.end())
+ if ((hostname.find_last_of(".in-addr.arpa") == hostname.length() - 1) && (hostname.find_last_of(".in-addr.arpa") != std::string::npos))
{
- log(DEBUG,"Caching hostname %s -> %s",(char*)inet_ntoa(usr->ip4),hostname.c_str());
- addrcache[usr->ip4] = new std::string(hostname);
- }*/
- WriteServ(usr->fd,"NOTICE Auth :*** Found your hostname");
+ WriteServ(usr->fd,"NOTICE Auth :*** Your ISP are muppets -- reverse resolution resolves back to same reverse .arpa domain (!)");
+ }
+ else
+ {
+ strlcpy(usr->host,hostname.c_str(),64);
+ strlcpy(usr->dhost,hostname.c_str(),64);
+ WriteServ(usr->fd,"NOTICE Auth :*** Found your hostname");
+ }
}
usr->dns_done = true;
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");
usr->dns_done = true;
return true;
}
- }
- if (hostname != "")
- {
- resolver2.ForwardLookup(hostname);
- if (resolver2.GetFD() != -1)
- dnslist[resolver2.GetFD()] = this;
+ if (hostname != "")
+ {
+ resolver2.ForwardLookup(hostname, true);
+ if (resolver2.GetFD() != -1)
+ {
+ dnslist[resolver2.GetFD()] = this;
+ if (usr)
+ user_fd_to_dns[usr->fd] = this;
+ }
+ }
}
}
}
return false;
}
+void ZapThisDns(int fd)
+{
+#ifdef THREADED_DNS
+/* if (fd_ref_table[fd])
+ {
+ if (fd_ref_table[fd]->registered >= 3)
+ {
+ log(DEBUG,"Joining thread for user %d",fd);
+ if (pthread_join(fd_ref_table[fd]->dnsthread, NULL))
+ {
+ log(DEBUG,"Can't pthread_join(): %s", strerror(errno));
+ }
+ }
+ }*/
+#else
+ if ((fd < 0) || (fd > MAX_DESCRIPTORS))
+ return;
+
+ Lookup *x = user_fd_to_dns[fd];
+
+ if (x)
+ {
+ if (x->resolver1.GetFD() > 0)
+ {
+ log(DEBUG,"Whacked resolver1");
+ dns_close(x->resolver1.GetFD());
+ }
+
+ if (x->resolver2.GetFD() > 0)
+ {
+ log(DEBUG,"Whacked resolver2");
+ dns_close(x->resolver2.GetFD());
+ }
+ }
+#endif
+}
+
void dns_poll(int fdcheck)
{
/* Check the given file descriptor is in valid range */
* from the socket engine, as dns.cpp tracks it
* for us if we are in single-threaded country.
*/
- delete x;
+ DELETE(x);
}
}
else
/* its fd is dodgy, the dns code probably
* bashed it due to error. Free the class.
*/
- delete x;
+ DELETE(x);
}
/* If we got down here, the dns lookup was valid, BUT,
* its still in progress. Be patient, and wait for