summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/modules/m_spanningtree/utils.cpp2
-rw-r--r--src/socket.cpp90
2 files changed, 67 insertions, 25 deletions
diff --git a/src/modules/m_spanningtree/utils.cpp b/src/modules/m_spanningtree/utils.cpp
index 6b83a17a3..02a014425 100644
--- a/src/modules/m_spanningtree/utils.cpp
+++ b/src/modules/m_spanningtree/utils.cpp
@@ -366,7 +366,7 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
}
else
{
- ServerInstance->Log(DEFAULT,"m_spanningtree: Warning: Failed to bind server port %s:%d: %s",IP.c_str(), portno, strerror(errno));
+ ServerInstance->Log(DEFAULT,"m_spanningtree: Warning: Failed to bind server port: %s:%d: %s",IP.c_str(), portno, strerror(errno));
listener->Close();
DELETE(listener);
}
diff --git a/src/socket.cpp b/src/socket.cpp
index ce8fbaf6d..6d7abf46c 100644
--- a/src/socket.cpp
+++ b/src/socket.cpp
@@ -39,6 +39,7 @@ const char inverted_bits[8] = { 0x00, /* 00000000 - 0 bits - never actually used
ListenSocket::ListenSocket(InspIRCd* Instance, int sockfd, insp_sockaddr client, insp_sockaddr server, int port, char* addr) : ServerInstance(Instance), desc("plaintext")
{
this->SetFd(sockfd);
+ Instance->Log(DEBUG,"CRAP");
if (!Instance->BindSocket(this->fd,client,server,port,addr))
this->fd = -1;
}
@@ -285,44 +286,78 @@ 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 client, insp_sockaddr server, int port, char* addr)
+bool InspIRCd::BindSocket(int sockfd, insp_sockaddr clientn, insp_sockaddr servern, int port, char* addr)
{
- memset(&server,0,sizeof(server));
- insp_inaddr addy;
+ sockaddr* server = new sockaddr();
+ memset(server,0,sizeof(server));
if (*addr == '*')
*addr = 0;
- if ((*addr) && (insp_aton(addr,&addy) < 1))
- return false;
+ Log(DEBUG,"NEW CRAP HERE");
+
+ /*if ((*addr) && (insp_aton(addr,&addy) < 1))
+ return false;*/
#ifdef IPV6
- server.sin6_family = AF_FAMILY;
-#else
- server.sin_family = AF_FAMILY;
-#endif
- if (!*addr)
+ if (*addr)
{
-#ifdef IPV6
- memset(&server.sin6_addr, 0, sizeof(in6_addr));
-#else
- server.sin_addr.s_addr = htonl(INADDR_ANY);
-#endif
+ printf("Address %s not empty\n", addr);
+ /* There is an address here. Is it ipv6? */
+ if (strchr(addr,':'))
+ {
+ printf("Address %s is ipv6\n", addr);
+ /* Yes it is */
+ in6_addr addy;
+ inet_pton(AF_INET6, addr, &addy);
+
+ ((sockaddr_in6*)server)->sin6_family = AF_INET6;
+ memcpy(&((sockaddr_in6*)server)->sin6_addr, &addy, sizeof(in6_addr));
+ ((sockaddr_in6*)server)->sin6_port = htons(port);
+ }
+ else
+ {
+ /* No, its not */
+ printf("Address %s is ipv4\n", addr);
+ in_addr addy;
+ inet_pton(AF_INET, addr, &addy);
+
+ ((sockaddr_in*)server)->sin_family = AF_INET;
+ ((sockaddr_in*)server)->sin_addr = addy;
+ ((sockaddr_in*)server)->sin_port = htons(port);
+ }
}
else
{
-#ifdef IPV6
- memcpy(&server.sin6_addr, &addy, sizeof(in6_addr));
-#else
- server.sin_addr = addy;
-#endif
+ printf("Address empty\n");
+ /* Theres no address here, default to ipv6 bind to all */
+ memset(&((sockaddr_in6*)server)->sin6_addr, 0, sizeof(in6_addr));
+ ((sockaddr_in6*)server)->sin6_port = htons(port);
}
-#ifdef IPV6
- server.sin6_port = htons(port);
#else
- server.sin_port = htons(port);
+ /* If we aren't built with ipv6, the choice becomes simple */
+ (sockaddr_in*)server->sin_family = AF_INET;
+ if (*addr)
+ {
+ /* There is an address here. */
+ in_addr addy;
+ inet_pton(AF_INET, &addy, addr);
+
+ ((sockaddr_in*)server)->sin_addr = addy;
+ }
+ else
+ {
+ /* Bind ipv4 to all */
+ ((sockaddr_in*)server)->sin_addr.s_addr = htonl(INADDR_ANY);
+ }
+ /* Bind ipv4 port number */
+ ((sockaddr_in*)server)->sin_port = htons(port);
#endif
- if (bind(sockfd,(struct sockaddr*)&server,sizeof(server)) < 0)
+ int ret = bind(sockfd, server, sizeof(server));
+
+ delete server;
+
+ if (ret < 0)
{
return false;
}
@@ -351,6 +386,7 @@ int irc::sockets::OpenTCPSocket()
if ((sockfd = socket (AF_FAMILY, SOCK_STREAM, 0)) < 0)
{
+ printf("SOCKET FAIL: %s\n", strerror(errno));
return ERROR;
}
else
@@ -380,6 +416,7 @@ bool InspIRCd::HasPort(int port, char* addr)
/* XXX: Probably belongs in class InspIRCd */
int InspIRCd::BindPorts(bool bail, int &ports_found, FailedPortList &failed_ports)
{
+ Log(DEBUG,"BINDING PORTS");
char configToken[MAXBUF], Addr[MAXBUF], Type[MAXBUF];
insp_sockaddr client, server;
int clientportcount = 0;
@@ -391,6 +428,7 @@ int InspIRCd::BindPorts(bool bail, int &ports_found, FailedPortList &failed_port
for (int count = 0; count < Config->ConfValueEnum(Config->config_data, "bind"); count++)
{
+ Log(DEBUG,"FOUND PORT");
Config->ConfValue(Config->config_data, "bind", "port", count, configToken, MAXBUF);
Config->ConfValue(Config->config_data, "bind", "address", count, Addr, MAXBUF);
Config->ConfValue(Config->config_data, "bind", "type", count, Type, MAXBUF);
@@ -426,9 +464,11 @@ int InspIRCd::BindPorts(bool bail, int &ports_found, FailedPortList &failed_port
if (fd == ERROR)
{
failed_ports.push_back(std::make_pair(Config->addrs[count],Config->ports[count]));
+ Log(DEBUG,"SOCKET FAIL");
}
else
{
+ Log(DEBUG,"BIND");
Config->openSockfd[BoundPortCount] = new ListenSocket(this,fd,client,server,Config->ports[count],Config->addrs[count]);
if (Config->openSockfd[BoundPortCount]->GetFd() > -1)
{
@@ -458,10 +498,12 @@ int InspIRCd::BindPorts(bool bail, int &ports_found, FailedPortList &failed_port
int fd = OpenTCPSocket();
if (fd == ERROR)
{
+ Log(DEBUG,"SOCKET FAIL");
failed_ports.push_back(std::make_pair(Config->addrs[count],Config->ports[count]));
}
else
{
+ Log(DEBUG,"BIND");
Config->openSockfd[BoundPortCount] = new ListenSocket(this,fd,client,server,Config->ports[count],Config->addrs[count]);
if (Config->openSockfd[BoundPortCount]->GetFd() > -1)
{