};
-ListenSocket::ListenSocket(InspIRCd* Instance, int sockfd, insp_sockaddr client, insp_sockaddr server, int port, char* addr) : ServerInstance(Instance), desc("plaintext")
+ListenSocket::ListenSocket(InspIRCd* Instance, int port, char* addr) : ServerInstance(Instance), desc("plaintext"), bind_addr(addr), bind_port(port)
{
- this->SetFd(sockfd);
- Instance->Log(DEBUG,"CRAP");
- if (!Instance->BindSocket(this->fd,port,addr))
- this->fd = -1;
+ this->SetFd(OpenTCPSocket(addr));
+ if (this->GetFd() > -1)
+ {
+ if (!Instance->BindSocket(this->fd,port,addr))
+ this->fd = -1;
#ifdef IPV6
- if ((!*addr) || (strchr(addr,':')))
- this->family = AF_INET6;
- else
- this->family = AF_INET;
+ if ((!*addr) || (strchr(addr,':')))
+ this->family = AF_INET6;
+ else
+ this->family = AF_INET;
#else
- this->family = AF_INET;
+ this->family = AF_INET;
#endif
+ Instance->SE->AddFd(this);
+ }
}
ListenSocket::~ListenSocket()
{
if (this->GetFd() > -1)
{
- shutdown(this->fd, 2);
- close(this->fd);
+ ServerInstance->SE->DelFd(this);
+ ServerInstance->Log(DEBUG,"Shut down listener on fd %d", this->fd);
+ if (shutdown(this->fd, 2) || close(this->fd))
+ ServerInstance->Log(DEBUG,"Failed to cancel listener: %s", strerror(errno));
this->fd = -1;
}
}
#ifdef IPV6
if (*addr)
{
- 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;
if (inet_pton(AF_INET6, addr, &addy) < 1)
{
- printf("Failed to interpret address %s", addr);
delete[] server;
return false;
}
else
{
/* No, its not */
- printf("Address %s is ipv4\n", addr);
in_addr addy;
if (inet_pton(AF_INET, addr, &addy) < 1)
{
}
else
{
- printf("Address empty port=%d\n", port);
if (port == -1)
{
/* Port -1: Means UDP IPV4 port binding - Special case
* used by DNS engine.
*/
- printf("Special case AF_INET udp bind to all\n");
((sockaddr_in*)server)->sin_family = AF_INET;
((sockaddr_in*)server)->sin_addr.s_addr = htonl(INADDR_ANY);
((sockaddr_in*)server)->sin_port = 0;
if (ret < 0)
{
- Log(DEBUG,"Bind fails it! %s", strerror(errno));
return false;
}
else
}
else
{
+ this->Log(DEBUG,"New socket binding for %d with listen: %s:%d", sockfd, addr, port);
NonBlocking(sockfd);
return true;
}
}
else
{
+ this->Log(DEBUG,"New socket binding for %d without listen: %s:%d", sockfd, addr, port);
return true;
}
}
int on = 1;
struct linger linger = { 0 };
#ifdef IPV6
- printf("IPV6 ENABLED OPENTCPSOCKET\n");
if (strchr(addr,':') || (!*addr))
- {
- printf("IPV6 OPENTCPSOCKET DO\n");
sockfd = socket (PF_INET6, socktype, 0);
- }
else
- {
- printf("IPV6->IPV4 OPENTCPSOCKET DO\n");
sockfd = socket (PF_INET, socktype, 0);
- }
if (sockfd < 0)
#else
if ((sockfd = socket (PF_INET, socktype, 0)) < 0)
#endif
{
- printf("SOCKET FAIL: %s\n", strerror(errno));
return ERROR;
}
else
}
}
-/* XXX: Probably belongs in class InspIRCd */
-bool InspIRCd::HasPort(int port, char* addr)
-{
- for (unsigned long count = 0; count < stats->BoundPortCount; count++)
- {
- if ((port == Config->ports[count]) && (!strcasecmp(Config->addrs[count],addr)))
- {
- return true;
- }
- }
- return false;
-}
-
/* 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;
- int BoundPortCount = 0;
-
- ports_found = 0;
-
- int InitialPortCount = stats->BoundPortCount;
+ int bound = 0;
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);
if ((!*Type) || (!strcmp(Type,"clients")))
{
irc::portparser portrange(configToken, false);
- long portno = -1;
+ int portno = -1;
while ((portno = portrange.GetToken()))
{
- if (!HasPort(portno, Addr))
+ if (*Addr == '*')
+ *Addr = 0;
+
+ bool skip = false;
+ for (std::vector<ListenSocket*>::iterator n = Config->ports.begin(); n != Config->ports.end(); ++n)
+ if (((*n)->GetIP() == Addr) && ((*n)->GetPort() == portno))
+ skip = true;
+ if (!skip)
{
- ports_found++;
- Config->ports[clientportcount+InitialPortCount] = portno;
- if (*Addr == '*')
- *Addr = 0;
-
- strlcpy(Config->addrs[clientportcount+InitialPortCount],Addr,256);
- clientportcount++;
- }
- }
- }
-
- if (!bail)
- {
- int PortCount = clientportcount;
- if (PortCount)
- {
- BoundPortCount = stats->BoundPortCount;
- for (int count = InitialPortCount; count < InitialPortCount + PortCount; count++)
- {
- int fd = OpenTCPSocket(Config->addrs[count]);
- if (fd == ERROR)
+ ListenSocket* ll = new ListenSocket(this, portno, Addr);
+ if (ll->GetFd() > -1)
{
- failed_ports.push_back(std::make_pair(Config->addrs[count],Config->ports[count]));
- Log(DEBUG,"SOCKET FAIL");
+ bound++;
+ Config->ports.push_back(ll);
}
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)
- {
- if (!SE->AddFd(Config->openSockfd[BoundPortCount]))
- {
- this->Log(DEFAULT,"ERK! Failed to add listening port to socket engine!");
- shutdown(Config->openSockfd[BoundPortCount]->GetFd(),2);
- close(Config->openSockfd[BoundPortCount]->GetFd());
- delete Config->openSockfd[BoundPortCount];
- failed_ports.push_back(std::make_pair(Config->addrs[count],Config->ports[count]));
- }
- else
- BoundPortCount++;
- }
+ failed_ports.push_back(std::make_pair(Addr, portno));
}
+ ports_found++;
}
- return InitialPortCount + BoundPortCount;
- }
- return InitialPortCount;
- }
- }
-
- int PortCount = clientportcount;
-
- for (int count = 0; count < PortCount; count++)
- {
- int fd = OpenTCPSocket(Config->addrs[count]);
- 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)
- {
- BoundPortCount++;
}
- else
- failed_ports.push_back(std::make_pair(Config->addrs[count],Config->ports[count]));
}
}
- return BoundPortCount;
+ return bound;
}
const char* irc::sockets::insp_ntoa(insp_inaddr n)