diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/socket.cpp | 96 |
1 files changed, 42 insertions, 54 deletions
diff --git a/src/socket.cpp b/src/socket.cpp index 68b93a4b4..411465ad6 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -47,8 +47,10 @@ ListenSocket::ListenSocket(InspIRCd* Instance, int port, char* addr) : ServerIns if ((!*addr) || (strchr(addr,':'))) this->family = AF_INET6; else -#endif + this->family = AF_INET; +#else this->family = AF_INET; +#endif Instance->SE->AddFd(this); } } @@ -67,9 +69,10 @@ ListenSocket::~ListenSocket() void ListenSocket::HandleEvent(EventType et, int errornum) { + sockaddr* sock_us = new sockaddr[2]; // our port number + sockaddr* client = new sockaddr[2]; socklen_t uslen, length; // length of our port number int incomingSockfd, in_port; - int clients; #ifdef IPV6 if (this->family == AF_INET6) @@ -78,72 +81,57 @@ void ListenSocket::HandleEvent(EventType et, int errornum) length = sizeof(sockaddr_in6); } else -#endif { uslen = sizeof(sockaddr_in); length = sizeof(sockaddr_in); } +#else + uslen = sizeof(sockaddr_in); + length = sizeof(sockaddr_in); +#endif + incomingSockfd = _accept (this->GetFd(), (sockaddr*)client, &length); - /* - * This loop may make you wonder 'why' - simple reason. If we just sit here accept()ing until the - * metaphorical cows come home, then we could very well end up with unresponsiveness in a ddos style - * situation, which is not desirable (to put it mildly!). This will mean we'll stop accepting and get - * on with our lives after accepting enough clients to sink a metaphorical battleship. :) -- w00t - */ - for (clients = 0; clients < ServerInstance->Config->MaxConn; clients++) + if ((incomingSockfd > -1) && (!_getsockname(incomingSockfd, sock_us, &uslen))) { - sockaddr* sock_us = new sockaddr[2]; // our port number - sockaddr* client = new sockaddr[2]; - - incomingSockfd = _accept (this->GetFd(), (sockaddr*)client, &length); - - if ((incomingSockfd > -1) && (!_getsockname(incomingSockfd, sock_us, &uslen))) - { - char buf[MAXBUF]; + char buf[MAXBUF]; #ifdef IPV6 - if (this->family == AF_INET6) - { - inet_ntop(AF_INET6, &((const sockaddr_in6*)client)->sin6_addr, buf, sizeof(buf)); - in_port = ntohs(((sockaddr_in6*)sock_us)->sin6_port); - } - else + if (this->family == AF_INET6) + { + inet_ntop(AF_INET6, &((const sockaddr_in6*)client)->sin6_addr, buf, sizeof(buf)); + in_port = ntohs(((sockaddr_in6*)sock_us)->sin6_port); + } + else + { + inet_ntop(AF_INET, &((const sockaddr_in*)client)->sin_addr, buf, sizeof(buf)); + in_port = ntohs(((sockaddr_in*)sock_us)->sin_port); + } +#else + inet_ntop(AF_INET, &((const sockaddr_in*)client)->sin_addr, buf, sizeof(buf)); + in_port = ntohs(((sockaddr_in*)sock_us)->sin_port); #endif + NonBlocking(incomingSockfd); + if (ServerInstance->Config->GetIOHook(in_port)) + { + try { - inet_ntop(AF_INET, &((const sockaddr_in*)client)->sin_addr, buf, sizeof(buf)); - in_port = ntohs(((sockaddr_in*)sock_us)->sin_port); + ServerInstance->Config->GetIOHook(in_port)->OnRawSocketAccept(incomingSockfd, buf, in_port); } - - NonBlocking(incomingSockfd); - if (ServerInstance->Config->GetIOHook(in_port)) + catch (CoreException& modexcept) { - try - { - ServerInstance->Config->GetIOHook(in_port)->OnRawSocketAccept(incomingSockfd, buf, in_port); - } - catch (CoreException& modexcept) - { - ServerInstance->Log(DEBUG,"%s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason()); - } + ServerInstance->Log(DEBUG,"%s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason()); } - ServerInstance->stats->statsAccept++; - userrec::AddClient(ServerInstance, incomingSockfd, in_port, false, this->family, client); } - else - { - /* - * bail, bail, bail! if we get here, accept failed, meaning something is hardcore wrong. - * cut our losses and don't try soak up any more clients during this loop iteration. -- w00t - */ - shutdown(incomingSockfd,2); - close(incomingSockfd); - ServerInstance->stats->statsRefused++; - return; - } - - /* Woots metaphorical comments confuse the metaphor out of me. */ - delete[] client; - delete[] sock_us; + ServerInstance->stats->statsAccept++; + userrec::AddClient(ServerInstance, incomingSockfd, in_port, false, this->family, client); + } + else + { + shutdown(incomingSockfd,2); + close(incomingSockfd); + ServerInstance->stats->statsRefused++; } + delete[] client; + delete[] sock_us; } /* Match raw bytes using CIDR bit matching, used by higher level MatchCIDR() */ |