* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2008 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ * InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ * See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
- * the file COPYING for details.
+ * the file COPYING for details.
*
* ---------------------------------------------------
*/
#include "exitcodes.h"
#include <port.h>
#include "socketengines/socketengine_ports.h"
+#include <ulimit.h>
PortsEngine::PortsEngine(InspIRCd* Instance) : SocketEngine(Instance)
{
+ MAX_DESCRIPTORS = 0;
EngineHandle = port_create();
if (EngineHandle == -1)
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)
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);
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 <ulimit.h>
}
int PortsEngine::GetRemainingFds()
{
- return MAX_DESCRIPTORS - CurrentSetSize;
+ return GetMaxFds() - CurrentSetSize;
}
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)