* ---------------------------------------------------
*/
-using namespace std;
-
#include "inspircd_config.h"
#include "inspircd.h"
-#include "inspircd_io.h"
+#include "configreader.h"
#include <unistd.h>
#include <sys/errno.h>
#include <sys/ioctl.h>
#include <sys/utsname.h>
-#include <cstdio>
-#include <time.h>
#include <string>
-#ifdef GCC3
-#include <ext/hash_map>
-#else
-#include <hash_map>
-#endif
-#include <map>
-#include <sstream>
-#include <vector>
-#include <deque>
#include "users.h"
#include "globals.h"
#include "inspstring.h"
#include "dnsqueue.h"
-#include <time.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <netinet/in.h>
-#include <string.h>
#include "dns.h"
#include "helperfuncs.h"
#include "hashcomp.h"
#include "socketengine.h"
+#include "socket.h"
extern ServerConfig* Config;
extern InspIRCd* ServerInstance;
-address_cache addrcache;
-
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;
}
- strlcpy(u,nick.c_str(),NICKMAX);
+ strlcpy(u,nick.c_str(),NICKMAX-1);
/* ASSOCIATE WITH DNS LOOKUP LIST */
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)
+ 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))
+ {
+ WriteServ(usr->fd,"NOTICE Auth :*** Your ISP are muppets -- reverse resolution resolves back to same reverse .arpa domain (!)");
+ }
+ else
{
- 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");
+ 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;
+ }
+ }
}
}
}
}
};
-bool lookup_dns(std::string nick)
+bool lookup_dns(const std::string &nick)
{
/* First attempt to find the nickname */
userrec* u = Find(nick);
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
if (ServerInstance && ServerInstance->SE)
ServerInstance->SE->DelFd(fdcheck);
}
-