1 /* +------------------------------------+
2 * | Inspire Internet Relay Chat Daemon |
3 * +------------------------------------+
5 * InspIRCd: (C) 2002-2007 InspIRCd Development Team
6 * See: http://www.inspircd.org/wiki/index.php/Credits
8 * This program is free but copyrighted software; see
9 * the file COPYING for details.
11 * ---------------------------------------------------
15 #include "exitcodes.h"
17 #include "socketengine_ports.h"
19 PortsEngine::PortsEngine(InspIRCd* Instance) : SocketEngine(Instance)
21 EngineHandle = port_create();
23 if (EngineHandle == -1)
25 ServerInstance->Log(SPARSE,"ERROR: Could not initialize socket engine: %s", strerror(errno));
26 ServerInstance->Log(SPARSE,"ERROR: This is a fatal error, exiting now.");
27 printf("ERROR: Could not initialize socket engine: %s\n", strerror(errno));
28 printf("ERROR: This is a fatal error, exiting now.\n");
29 ServerInstance->Exit(EXIT_STATUS_SOCKETENGINE);
34 PortsEngine::~PortsEngine()
39 bool PortsEngine::AddFd(EventHandler* eh)
42 if ((fd < 0) || (fd > MAX_DESCRIPTORS))
45 if (GetRemainingFds() <= 1)
52 port_associate(EngineHandle, PORT_SOURCE_FD, fd, eh->Readable() ? POLLRDNORM : POLLWRNORM, eh);
54 ServerInstance->Log(DEBUG,"New file descriptor: %d", fd);
59 void PortsEngine::WantWrite(EventHandler* eh)
61 port_associate(EngineHandle, PORT_SOURCE_FD, eh->GetFd(), POLLWRNORM, eh);
64 bool PortsEngine::DelFd(EventHandler* eh, bool force)
67 if ((fd < 0) || (fd > MAX_DESCRIPTORS))
70 port_dissociate(EngineHandle, PORT_SOURCE_FD, fd);
75 ServerInstance->Log(DEBUG,"Remove file descriptor: %d", fd);
79 int PortsEngine::GetMaxFds()
81 return MAX_DESCRIPTORS;
84 int PortsEngine::GetRemainingFds()
86 return MAX_DESCRIPTORS - CurrentSetSize;
89 int PortsEngine::DispatchEvents()
91 struct timespec poll_time;
94 poll_time.tv_nsec = 0;
96 unsigned int nget = 1; // used to denote a retrieve request.
97 int i = port_getn(EngineHandle, this->events, MAX_DESCRIPTORS, &nget, &poll_time);
99 // first handle an error condition
103 for (i = 0; i < nget; i++)
105 switch (this->events[i].portev_source)
109 int fd = this->events[i].portev_object;
112 // reinsert port for next time around
113 port_associate(EngineHandle, PORT_SOURCE_FD, fd, POLLRDNORM, ref[fd]);
114 ref[fd]->HandleEvent((this->events[i].portev_events & POLLRDNORM) ? EVENT_READ : EVENT_WRITE);
125 std::string PortsEngine::GetName()