/** 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
* or a negative value upon failure (negative values are invalid file
* descriptors)
*/
- int OpenTCPSocket(char* addr);
+ int OpenTCPSocket(char* addr, int socktype = SOCK_STREAM);
};
};
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);
/** 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;
in6_addr i;
if (inet_pton(AF_INET6, ip, &i) > 0)
{
+ ServerInstance->Log(DEBUG,"Resolve to ipv6");
DNS::MakeIP6Int(query, &i);
}
else
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]);
}
}
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;
{
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,':')))
* 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];
}
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;
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));