X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsocket.cpp;h=b28414d4a7960073cc605f3e1d05d12f147ac7c9;hb=b7e299c2e10d915d5e59df4cb3f54951c8daa999;hp=132846b3c50902c2800369b0f8d400a01dc9e82d;hpb=91f1703ce72f0195534439b77b8602918f43723e;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/socket.cpp b/src/socket.cpp index 132846b3c..b28414d4a 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -47,10 +47,8 @@ ListenSocket::ListenSocket(InspIRCd* Instance, int port, char* addr) : ServerIns if ((!*addr) || (strchr(addr,':'))) this->family = AF_INET6; else - this->family = AF_INET; -#else - this->family = AF_INET; #endif + this->family = AF_INET; Instance->SE->AddFd(this); } } @@ -69,9 +67,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) @@ -80,77 +79,55 @@ 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 - /* - * 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++) + void* m_acceptEvent = NULL; + GetExt("windows_acceptevent", m_acceptEvent); + incomingSockfd = _accept (this->GetFd(), (sockaddr*)client, &length); + + 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); + 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 +#endif + { + inet_ntop(AF_INET, &((const sockaddr_in*)client)->sin_addr, buf, sizeof(buf)); + in_port = ntohs(((sockaddr_in*)sock_us)->sin_port); + } - if ((incomingSockfd > -1) && (!_getsockname(incomingSockfd, sock_us, &uslen))) + NonBlocking(incomingSockfd); + if (ServerInstance->Config->GetIOHook(in_port)) { - char buf[MAXBUF]; -#ifdef IPV6 - if (this->family == AF_INET6) + try { - inet_ntop(AF_INET6, &((const sockaddr_in6*)client)->sin6_addr, buf, sizeof(buf)); - in_port = ntohs(((sockaddr_in6*)sock_us)->sin6_port); + ServerInstance->Config->GetIOHook(in_port)->OnRawSocketAccept(incomingSockfd, buf, in_port); } - else + catch (CoreException& modexcept) { - inet_ntop(AF_INET, &((const sockaddr_in*)client)->sin_addr, buf, sizeof(buf)); - in_port = ntohs(((sockaddr_in*)sock_us)->sin_port); + ServerInstance->Log(DEBUG,"%s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason()); } -#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 - { - 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->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() */ @@ -496,7 +473,6 @@ int irc::sockets::OpenTCPSocket(char* addr, int socktype) } } -/* XXX: Probably belongs in class InspIRCd */ int InspIRCd::BindPorts(bool bail, int &ports_found, FailedPortList &failed_ports) { char configToken[MAXBUF], Addr[MAXBUF], Type[MAXBUF];