summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2007-02-05 23:43:44 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2007-02-05 23:43:44 +0000
commit49369545e34e9d16d53c6c62eb8659a590af62ed (patch)
treed292af57caa4fb2e61590bb55153a5235795b8e1
parent8000befea5b8e5a9b4af66befb84e4c7c8ef6926 (diff)
Stuff to make dns work protocol-independent
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6506 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--include/inspircd.h4
-rw-r--r--include/socket.h2
-rw-r--r--src/dns.cpp46
-rw-r--r--src/inspsocket.cpp2
-rw-r--r--src/socket.cpp28
5 files changed, 31 insertions, 51 deletions
diff --git a/include/inspircd.h b/include/inspircd.h
index 60a29d5f4..ee02a32b5 100644
--- a/include/inspircd.h
+++ b/include/inspircd.h
@@ -589,13 +589,11 @@ class InspIRCd : public classbase
/** Binds a socket on an already open file descriptor
* @param sockfd A valid file descriptor of an open socket
- * @param client A sockaddr to use as temporary storage
- * @param server A sockaddr to use as temporary storage
* @param port The port number to bind to
* @param addr The address to bind to (IP only)
* @return True if the port was bound successfully
*/
- bool BindSocket(int sockfd, insp_sockaddr client, insp_sockaddr server, int port, char* addr);
+ bool BindSocket(int sockfd, int port, char* addr, bool dolisten = true);
/** Adds a server name to the list of servers we've seen
* @param The servername to add
diff --git a/include/socket.h b/include/socket.h
index 63546f887..4e7d89192 100644
--- a/include/socket.h
+++ b/include/socket.h
@@ -136,7 +136,7 @@ namespace irc
* or a negative value upon failure (negative values are invalid file
* descriptors)
*/
- int OpenTCPSocket(char* addr);
+ int OpenTCPSocket(char* addr, int socktype = SOCK_STREAM);
};
};
diff --git a/src/dns.cpp b/src/dns.cpp
index 3f8cde523..ac6097cd2 100644
--- a/src/dns.cpp
+++ b/src/dns.cpp
@@ -311,50 +311,23 @@ void DNS::Rehash()
this->cache = new dnscache();
}
- if (insp_aton(ServerInstance->Config->DNSServer,&addr) > 0)
+ if ((strstr(ServerInstance->Config->DNSServer,"::ffff:") == (char*)&ServerInstance->Config->DNSServer) || (strstr(ServerInstance->Config->DNSServer,"::FFFF:") == (char*)&ServerInstance->Config->DNSServer))
{
- memcpy(&myserver,&addr,sizeof(insp_inaddr));
- if ((strstr(ServerInstance->Config->DNSServer,"::ffff:") == (char*)&ServerInstance->Config->DNSServer) || (strstr(ServerInstance->Config->DNSServer,"::FFFF:") == (char*)&ServerInstance->Config->DNSServer))
- {
- ServerInstance->Log(DEFAULT,"WARNING: Using IPv4 addresses over IPv6 forces some DNS checks to be disabled.");
- ServerInstance->Log(DEFAULT," This should not cause a problem, however it is recommended you migrate");
- ServerInstance->Log(DEFAULT," to a true IPv6 environment.");
- this->ip6munge = true;
- }
+ ServerInstance->Log(DEFAULT,"WARNING: Using IPv4 addresses over IPv6 forces some DNS checks to be disabled.");
+ ServerInstance->Log(DEFAULT," This should not cause a problem, however it is recommended you migrate");
+ ServerInstance->Log(DEFAULT," to a true IPv6 environment.");
+ this->ip6munge = true;
}
/* Initialize mastersocket */
- this->SetFd(socket(PF_PROTOCOL, SOCK_DGRAM, 0));
- if (this->GetFd() != -1)
- {
- /* Did it succeed? */
- if (fcntl(this->GetFd(), F_SETFL, O_NONBLOCK) != 0)
- {
- /* Couldn't make the socket nonblocking */
- shutdown(this->GetFd(),2);
- close(this->GetFd());
- this->SetFd(-1);
- }
- }
+ int s = OpenTCPSocket(ServerInstance->Config->DNSServer, SOCK_DGRAM);
+ this->SetFd(s);
/* Have we got a socket and is it nonblocking? */
if (this->GetFd() != -1)
{
-#ifdef IPV6
- insp_sockaddr addr;
- memset(&addr,0,sizeof(addr));
- addr.sin6_family = AF_FAMILY;
- addr.sin6_port = 0;
- addr.sin6_addr = in6addr_any;
-#else
- insp_sockaddr addr;
- memset(&addr,0,sizeof(addr));
- addr.sin_family = AF_FAMILY;
- addr.sin_port = 0;
- addr.sin_addr.s_addr = INADDR_ANY;
-#endif
/* Bind the port */
- if (bind(this->GetFd(),(sockaddr *)&addr,sizeof(addr)) != 0)
+ if (!BindSocket(this->GetFd(), 0, ServerInstance->Config->DNSServer, false))
{
/* Failed to bind */
shutdown(this->GetFd(),2);
@@ -536,6 +509,7 @@ int DNS::GetName(const insp_inaddr *ip)
/** Start lookup of an IP address to a hostname */
int DNS::GetNameForce(const char *ip, ForceProtocol fp)
{
+ ServerInstance->Log(DEBUG,"GetNameForce: %s", ip);
char query[128];
DNSHeader h;
int id;
@@ -546,6 +520,7 @@ int DNS::GetNameForce(const char *ip, ForceProtocol fp)
in6_addr i;
if (inet_pton(AF_INET6, ip, &i) > 0)
{
+ ServerInstance->Log(DEBUG,"Resolve to ipv6");
DNS::MakeIP6Int(query, &i);
}
else
@@ -558,6 +533,7 @@ int DNS::GetNameForce(const char *ip, ForceProtocol fp)
in_addr i;
if (inet_aton(ip, &i))
{
+ ServerInstance->Log(DEBUG,"Resolve to ipv4");
unsigned char* c = (unsigned char*)&i.s_addr;
sprintf(query,"%d.%d.%d.%d.in-addr.arpa",c[3],c[2],c[1],c[0]);
}
diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp
index ea2220686..08b8f4cd6 100644
--- a/src/inspsocket.cpp
+++ b/src/inspsocket.cpp
@@ -65,7 +65,7 @@ InspSocket::InspSocket(InspIRCd* SI, const std::string &ipaddr, int aport, bool
}
else
{
- if (!SI->BindSocket(this->fd,this->client,this->server,aport,(char*)ipaddr.c_str()))
+ if (!SI->BindSocket(this->fd,aport,(char*)ipaddr.c_str()))
{
this->Close();
this->fd = -1;
diff --git a/src/socket.cpp b/src/socket.cpp
index 111299b09..a32a7f98e 100644
--- a/src/socket.cpp
+++ b/src/socket.cpp
@@ -40,7 +40,7 @@ ListenSocket::ListenSocket(InspIRCd* Instance, int sockfd, insp_sockaddr client,
{
this->SetFd(sockfd);
Instance->Log(DEBUG,"CRAP");
- if (!Instance->BindSocket(this->fd,client,server,port,addr))
+ if (!Instance->BindSocket(this->fd,port,addr))
this->fd = -1;
#ifdef IPV6
if ((!*addr) || (strchr(addr,':')))
@@ -312,7 +312,7 @@ void irc::sockets::NonBlocking(int s)
* It can only bind to IP addresses, if you wish to bind to hostnames
* you should first resolve them using class 'Resolver'.
*/
-bool InspIRCd::BindSocket(int sockfd, insp_sockaddr clientn, insp_sockaddr servern, int port, char* addr)
+bool InspIRCd::BindSocket(int sockfd, int port, char* addr, bool dolisten)
{
/* We allocate 2 of these, because sockaddr_in6 is larger than sockaddr (ugh, hax) */
sockaddr* server = new sockaddr[2];
@@ -404,22 +404,28 @@ bool InspIRCd::BindSocket(int sockfd, insp_sockaddr clientn, insp_sockaddr serve
}
else
{
- if (listen(sockfd, Config->MaxConn) == -1)
+ if (dolisten)
{
- this->Log(DEFAULT,"ERROR in listen(): %s",strerror(errno));
- return false;
+ if (listen(sockfd, Config->MaxConn) == -1)
+ {
+ this->Log(DEFAULT,"ERROR in listen(): %s",strerror(errno));
+ return false;
+ }
+ else
+ {
+ NonBlocking(sockfd);
+ return true;
+ }
}
else
{
- NonBlocking(sockfd);
return true;
}
}
}
-
// Open a TCP Socket
-int irc::sockets::OpenTCPSocket(char* addr)
+int irc::sockets::OpenTCPSocket(char* addr, int socktype)
{
int sockfd;
int on = 1;
@@ -429,16 +435,16 @@ int irc::sockets::OpenTCPSocket(char* addr)
if (strchr(addr,':') || (!*addr))
{
printf("IPV6 OPENTCPSOCKET DO\n");
- sockfd = socket (PF_INET6, SOCK_STREAM, 0);
+ sockfd = socket (PF_INET6, socktype, 0);
}
else
{
printf("IPV6->IPV4 OPENTCPSOCKET DO\n");
- sockfd = socket (PF_INET, SOCK_STREAM, 0);
+ sockfd = socket (PF_INET, socktype, 0);
}
if (sockfd < 0)
#else
- if ((sockfd = socket (PF_INET, SOCK_STREAM, 0)) < 0)
+ if ((sockfd = socket (PF_INET, socktype, 0)) < 0)
#endif
{
printf("SOCKET FAIL: %s\n", strerror(errno));