X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsocketengines%2Fsocketengine_ports.cpp;h=9a8659b3864a9552179f02a241e3aa97e795e6d0;hb=96a4a1d41e42dba806c2e9954e148ed838262511;hp=0d97b91df0bd0b9d31a4f5d223d7737ca4ffa063;hpb=ab4dee91de96555db158db91240ff91520318068;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/socketengines/socketengine_ports.cpp b/src/socketengines/socketengine_ports.cpp index 0d97b91df..9a8659b38 100644 --- a/src/socketengines/socketengine_ports.cpp +++ b/src/socketengines/socketengine_ports.cpp @@ -2,11 +2,11 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team + * InspIRCd: (C) 2002-2009 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see - * the file COPYING for details. + * the file COPYING for details. * * --------------------------------------------------- */ @@ -15,31 +15,39 @@ #include "exitcodes.h" #include #include "socketengines/socketengine_ports.h" +#include PortsEngine::PortsEngine(InspIRCd* Instance) : SocketEngine(Instance) { + MAX_DESCRIPTORS = 0; EngineHandle = port_create(); if (EngineHandle == -1) { - ServerInstance->Log(SPARSE,"ERROR: Could not initialize socket engine: %s", strerror(errno)); - ServerInstance->Log(SPARSE,"ERROR: This is a fatal error, exiting now."); + ServerInstance->Logs->Log("SOCKET",SPARSE,"ERROR: Could not initialize socket engine: %s", strerror(errno)); + ServerInstance->Logs->Log("SOCKET",SPARSE,"ERROR: This is a fatal error, exiting now."); printf("ERROR: Could not initialize socket engine: %s\n", strerror(errno)); printf("ERROR: This is a fatal error, exiting now.\n"); ServerInstance->Exit(EXIT_STATUS_SOCKETENGINE); } CurrentSetSize = 0; + + ref = new EventHandler* [GetMaxFds()]; + events = new port_event_t[GetMaxFds()]; + memset(ref, 0, GetMaxFds() * sizeof(EventHandler*)); } PortsEngine::~PortsEngine() { this->Close(EngineHandle); + delete[] ref; + delete[] events; } bool PortsEngine::AddFd(EventHandler* eh) { int fd = eh->GetFd(); - if ((fd < 0) || (fd > MAX_DESCRIPTORS)) + if ((fd < 0) || (fd > GetMaxFds() - 1)) return false; if (GetRemainingFds() <= 1) @@ -51,20 +59,20 @@ bool PortsEngine::AddFd(EventHandler* eh) ref[fd] = eh; port_associate(EngineHandle, PORT_SOURCE_FD, fd, eh->Readable() ? POLLRDNORM : POLLWRNORM, eh); - ServerInstance->Log(DEBUG,"New file descriptor: %d", fd); + ServerInstance->Logs->Log("SOCKET",DEBUG,"New file descriptor: %d", fd); CurrentSetSize++; return true; } void PortsEngine::WantWrite(EventHandler* eh) { - port_associate(EngineHandle, PORT_SOURCE_FD, eh->GetFd(), POLLWRNORM, eh); + port_associate(EngineHandle, PORT_SOURCE_FD, eh->GetFd(), POLLRDNORM | POLLWRNORM, eh); } bool PortsEngine::DelFd(EventHandler* eh, bool force) { int fd = eh->GetFd(); - if ((fd < 0) || (fd > MAX_DESCRIPTORS)) + if ((fd < 0) || (fd > GetMaxFds() - 1)) return false; port_dissociate(EngineHandle, PORT_SOURCE_FD, fd); @@ -72,18 +80,33 @@ bool PortsEngine::DelFd(EventHandler* eh, bool force) CurrentSetSize--; ref[fd] = NULL; - ServerInstance->Log(DEBUG,"Remove file descriptor: %d", fd); + ServerInstance->Logs->Log("SOCKET",DEBUG,"Remove file descriptor: %d", fd); return true; } int PortsEngine::GetMaxFds() { - return MAX_DESCRIPTORS; + if (MAX_DESCRIPTORS) + return MAX_DESCRIPTORS; + + int max = ulimit(4, 0); + if (max > 0) + { + MAX_DESCRIPTORS = max; + return max; + } + else + { + ServerInstance->Logs->Log("SOCKET", DEFAULT, "ERROR: Can't determine maximum number of open sockets!"); + printf("ERROR: Can't determine maximum number of open sockets!\n"); + ServerInstance->Exit(EXIT_STATUS_SOCKETENGINE); + } +#include } int PortsEngine::GetRemainingFds() { - return MAX_DESCRIPTORS - CurrentSetSize; + return GetMaxFds() - CurrentSetSize; } int PortsEngine::DispatchEvents() @@ -94,7 +117,7 @@ int PortsEngine::DispatchEvents() poll_time.tv_nsec = 0; unsigned int nget = 1; // used to denote a retrieve request. - int i = port_getn(EngineHandle, this->events, MAX_DESCRIPTORS, &nget, &poll_time); + int i = port_getn(EngineHandle, this->events, GetMaxFds() - 1, &nget, &poll_time); // first handle an error condition if (i == -1)