]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/socketengine_ports.cpp
'svn propset -R svn:eol-style CR *' Set to UNIX-style always. Binaries are auto skipp...
[user/henk/code/inspircd.git] / src / socketengine_ports.cpp
index 869e0a6fb3876b8f406c170f4e4d21f1df2ce517..d3704f0a461babee6535f307d1218cefb4251cdd 100644 (file)
@@ -1,129 +1 @@
-/*       +------------------------------------+
- *       | Inspire Internet Relay Chat Daemon |
- *       +------------------------------------+
- *
- *  InspIRCd: (C) 2002-2007 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.
- *
- * ---------------------------------------------------
- */
-
-#include "inspircd.h"
-#include "exitcodes.h"
-#include <port.h>
-#include "socketengine_ports.h"
-
-PortsEngine::PortsEngine(InspIRCd* Instance) : SocketEngine(Instance)
-{
-       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.");
-               printf("ERROR: Could not initialize socket engine: %s\n", strerror(errno));
-               printf("ERROR: This is a fatal error, exiting now.\n");
-               InspIRCd::Exit(EXIT_STATUS_SOCKETENGINE);
-       }
-       CurrentSetSize = 0;
-}
-
-PortsEngine::~PortsEngine()
-{
-       close(EngineHandle);
-}
-
-bool PortsEngine::AddFd(EventHandler* eh)
-{
-       int fd = eh->GetFd();
-       if ((fd < 0) || (fd > MAX_DESCRIPTORS))
-               return false;
-
-       if (GetRemainingFds() <= 1)
-               return false;
-
-       if (ref[fd])
-               return false;
-
-       ref[fd] = eh;
-       port_associate(EngineHandle, PORT_SOURCE_FD, fd, eh->Readable() ? POLLRDNORM : POLLWRNORM, eh);
-
-       ServerInstance->Log(DEBUG,"New file descriptor: %d", fd);
-       CurrentSetSize++;
-       return true;
-}
-
-void PortsEngine::WantWrite(EventHandler* eh)
-{
-       port_associate(EngineHandle, PORT_SOURCE_FD, eh->GetFd(), POLLWRNORM, eh);
-}
-
-bool PortsEngine::DelFd(EventHandler* eh, bool force)
-{
-       int fd = eh->GetFd();
-       if ((fd < 0) || (fd > MAX_DESCRIPTORS))
-               return false;
-
-       port_dissociate(EngineHandle, PORT_SOURCE_FD, fd);
-
-       CurrentSetSize--;
-       ref[fd] = NULL;
-
-       ServerInstance->Log(DEBUG,"Remove file descriptor: %d", fd);
-       return true;
-}
-
-int PortsEngine::GetMaxFds()
-{
-       return MAX_DESCRIPTORS;
-}
-
-int PortsEngine::GetRemainingFds()
-{
-       return MAX_DESCRIPTORS - CurrentSetSize;
-}
-
-int PortsEngine::DispatchEvents()
-{
-       struct timespec poll_time;
-
-       poll_time.tv_sec = 1;
-       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);
-
-       // first handle an error condition
-       if (i == -1)
-               return i;
-
-       for (i = 0; i < nget; i++)
-       {
-               switch (this->events[i].portev_source)
-               {
-                       case PORT_SOURCE_FD:
-                       {
-                               int fd = this->events[i].portev_object;
-                               if (ref[fd])
-                               {
-                                       // reinsert port for next time around
-                                       port_associate(EngineHandle, PORT_SOURCE_FD, fd, POLLRDNORM, ref[fd]);
-                                       ref[fd]->HandleEvent((this->events[i].portev_events & POLLRDNORM) ? EVENT_READ : EVENT_WRITE);
-                               }
-                       }
-                       default:
-                       break;
-               }
-       }
-
-       return i;
-}
-
-std::string PortsEngine::GetName()
-{
-       return "ports";
-}
-
+/*       +------------------------------------+\r *       | Inspire Internet Relay Chat Daemon |\r *       +------------------------------------+\r *\r *  InspIRCd: (C) 2002-2007 InspIRCd Development Team\r * See: http://www.inspircd.org/wiki/index.php/Credits\r *\r * This program is free but copyrighted software; see\r *            the file COPYING for details.\r *\r * ---------------------------------------------------\r */\r\r#include "inspircd.h"\r#include "exitcodes.h"\r#include <port.h>\r#include "socketengine_ports.h"\r\rPortsEngine::PortsEngine(InspIRCd* Instance) : SocketEngine(Instance)\r{\r   EngineHandle = port_create();\r\r if (EngineHandle == -1)\r        {\r              ServerInstance->Log(SPARSE,"ERROR: Could not initialize socket engine: %s", strerror(errno));\r          ServerInstance->Log(SPARSE,"ERROR: This is a fatal error, exiting now.");\r              printf("ERROR: Could not initialize socket engine: %s\n", strerror(errno));\r            printf("ERROR: This is a fatal error, exiting now.\n");\r                InspIRCd::Exit(EXIT_STATUS_SOCKETENGINE);\r      }\r      CurrentSetSize = 0;\r}\r\rPortsEngine::~PortsEngine()\r{\r   close(EngineHandle);\r}\r\rbool PortsEngine::AddFd(EventHandler* eh)\r{\r    int fd = eh->GetFd();\r  if ((fd < 0) || (fd > MAX_DESCRIPTORS))\r                return false;\r\r if (GetRemainingFds() <= 1)\r            return false;\r\r if (ref[fd])\r           return false;\r\r ref[fd] = eh;\r  port_associate(EngineHandle, PORT_SOURCE_FD, fd, eh->Readable() ? POLLRDNORM : POLLWRNORM, eh);\r\r       ServerInstance->Log(DEBUG,"New file descriptor: %d", fd);\r      CurrentSetSize++;\r      return true;\r}\r\rvoid PortsEngine::WantWrite(EventHandler* eh)\r{\r        port_associate(EngineHandle, PORT_SOURCE_FD, eh->GetFd(), POLLWRNORM, eh);\r}\r\rbool PortsEngine::DelFd(EventHandler* eh, bool force)\r{\r  int fd = eh->GetFd();\r  if ((fd < 0) || (fd > MAX_DESCRIPTORS))\r                return false;\r\r port_dissociate(EngineHandle, PORT_SOURCE_FD, fd);\r\r    CurrentSetSize--;\r      ref[fd] = NULL;\r\r       ServerInstance->Log(DEBUG,"Remove file descriptor: %d", fd);\r   return true;\r}\r\rint PortsEngine::GetMaxFds()\r{\r return MAX_DESCRIPTORS;\r}\r\rint PortsEngine::GetRemainingFds()\r{\r        return MAX_DESCRIPTORS - CurrentSetSize;\r}\r\rint PortsEngine::DispatchEvents()\r{\r        struct timespec poll_time;\r\r    poll_time.tv_sec = 1;\r  poll_time.tv_nsec = 0;\r\r        unsigned int nget = 1; // used to denote a retrieve request.\r   int i = port_getn(EngineHandle, this->events, MAX_DESCRIPTORS, &nget, &poll_time);\r\r    // first handle an error condition\r     if (i == -1)\r           return i;\r\r     for (i = 0; i < nget; i++)\r     {\r              switch (this->events[i].portev_source)\r         {\r                      case PORT_SOURCE_FD:\r                   {\r                              int fd = this->events[i].portev_object;\r                                if (ref[fd])\r                           {\r                                      // reinsert port for next time around\r                                  port_associate(EngineHandle, PORT_SOURCE_FD, fd, POLLRDNORM, ref[fd]);\r                                 ref[fd]->HandleEvent((this->events[i].portev_events & POLLRDNORM) ? EVENT_READ : EVENT_WRITE);\r                         }\r                      }\r                      default:\r                       break;\r         }\r      }\r\r     return i;\r}\r\rstd::string PortsEngine::GetName()\r{\r      return "ports";\r}\r\r
\ No newline at end of file