]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/socketengine.h
Remove the Kiwi links from the readme.
[user/henk/code/inspircd.git] / include / socketengine.h
index b74cb065b717c4cb8f42e5d46c6f191e9e0fda92..26d31c168d1c9ff77d9847ddc8f20d7644240e79 100644 (file)
@@ -1,10 +1,15 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
- *   Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
- *   Copyright (C) 2005-2007 Craig Edwards <craigedwards@brainbox.cc>
+ *   Copyright (C) 2013-2016 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2013-2014 Adam <Adam@anope.org>
+ *   Copyright (C) 2012-2013, 2017-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2012 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
+ *   Copyright (C) 2007-2008, 2017 Robin Burchell <robin+git@viroteck.net>
  *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ *   Copyright (C) 2005-2008 Craig Edwards <brain@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
 
 #pragma once
 
-#include <vector>
 #include <string>
-#include <map>
-#include "config.h"
 #include "socket.h"
 #include "base.h"
 
@@ -164,15 +166,24 @@ class CoreExport EventHandler : public classbase
         * registered with the SocketEngine
         */
        int fd;
+
+       /** Swaps the internals of this EventHandler with another one.
+        * @param other A EventHandler to swap internals with.
+        */
+       void SwapInternals(EventHandler& other);
+
  public:
        /** Get the current file descriptor
         * @return The file descriptor of this handler
         */
        inline int GetFd() const { return fd; }
 
+       /** Checks if this event handler has a fd associated with it. */
+       inline bool HasFd() const { return fd >= 0; }
+
        inline int GetEventMask() const { return event_mask; }
 
-       /** Set a new file desciptor
+       /** Set a new file descriptor
         * @param FD The new file descriptor. Do not call this method without
         * first deleting the object from the SocketEngine if you have
         * added it to a SocketEngine instance.
@@ -211,17 +222,7 @@ class CoreExport EventHandler : public classbase
  * its private members and internal behaviour
  * should be treated as blackboxed, and vary
  * from system to system and upon the config
- * settings chosen by the server admin. The current
- * version supports select, epoll and kqueue.
- * The configure script will enable a socket engine
- * based upon what OS is detected, and will derive
- * a class from SocketEngine based upon what it finds.
- * The derived classes file will also implement a
- * classfactory, SocketEngineFactory, which will
- * create a derived instance of SocketEngine using
- * polymorphism so that the core and modules do not
- * have to be aware of which SocketEngine derived
- * class they are using.
+ * settings chosen by the server admin.
  */
 class CoreExport SocketEngine
 {
@@ -276,20 +277,26 @@ class CoreExport SocketEngine
         **/
        static std::vector<EventHandler*> ref;
 
- protected:
-       /** Current number of descriptors in the engine
-        */
+       /** Current number of descriptors in the engine. */
        static size_t CurrentSetSize;
+
+       /** The maximum number of descriptors in the engine. */
+       static size_t MaxSetSize;
+
        /** List of handlers that want a trial read/write
         */
        static std::set<int> trials;
 
-       static int MAX_DESCRIPTORS;
-
        /** Socket engine statistics: count of various events, bandwidth usage
         */
        static Statistics stats;
 
+       /** Look up the fd limit using rlimit. */
+       static void LookupMaxFds();
+
+       /** Terminates the program when the socket engine fails to initialize. */
+       static void InitError();
+
        static void OnSetEvent(EventHandler* eh, int old_mask, int new_mask);
 
        /** Add an event handler to the base socket engine. AddFd(EventHandler*, int) should call this.
@@ -302,7 +309,7 @@ class CoreExport SocketEngine
        static void ResizeDouble(std::vector<T>& vect)
        {
                if (SocketEngine::CurrentSetSize > vect.size())
-                       vect.resize(vect.size() * 2);
+                       vect.resize(SocketEngine::CurrentSetSize * 2);
        }
 
 public:
@@ -354,10 +361,10 @@ public:
 
        /** Returns the number of file descriptors reported by the system this program may use
         * when it was started.
-        * @return If positive, the number of file descriptors that the system reported that we
-        * may use. Otherwise (<= 0) this number could not be determined.
+        * @return If non-zero the number of file descriptors that the system reported that we
+        * may use.
         */
-       static int GetMaxFds() { return MAX_DESCRIPTORS; }
+       static size_t GetMaxFds() { return MaxSetSize; }
 
        /** Returns the number of file descriptors being queried
         * @return The set size
@@ -382,7 +389,7 @@ public:
        static bool HasFd(int fd);
 
        /** Returns the EventHandler attached to a specific fd.
-        * If the fd isnt in the socketengine, returns NULL.
+        * If the fd isn't in the socketengine, returns NULL.
         * @param fd The event handler to look for
         * @return A pointer to the event handler, or NULL
         */
@@ -393,7 +400,7 @@ public:
         * number of events which occurred during this call.  This method will
         * dispatch events to their handlers by calling their
         * EventHandler::OnEventHandler*() methods.
-        * @return The number of events which have occured.
+        * @return The number of events which have occurred.
         */
        static int DispatchEvents();
 
@@ -488,20 +495,18 @@ public:
         * @param buf The buffer in which the data that is sent is stored.
         * @param len The size of the buffer.
         * @param flags A flag value that controls the sending of the data.
-        * @param to The remote IP address and port.
-        * @param tolen The size of the to parameter.
+        * @param address The remote IP address and port.
         * @return This method should return exactly the same values as the system call it emulates.
         */
-       static int SendTo(EventHandler* fd, const void *buf, size_t len, int flags, const sockaddr *to, socklen_t tolen);
+       static int SendTo(EventHandler* fd, const void* buf, size_t len, int flags, const irc::sockets::sockaddrs& address);
 
        /** Abstraction for BSD sockets connect(2).
         * This function should emulate its namesake system call exactly.
         * @param fd This version of the call takes an EventHandler instead of a bare file descriptor.
-        * @param serv_addr The server IP address and port.
-        * @param addrlen The size of the sockaddr parameter.
+        * @param address The server IP address and port.
         * @return This method should return exactly the same values as the system call it emulates.
         */
-       static int Connect(EventHandler* fd, const sockaddr *serv_addr, socklen_t addrlen);
+       static int Connect(EventHandler* fd, const irc::sockets::sockaddrs& address);
 
        /** Make a file descriptor blocking.
         * @param fd a file descriptor to set to blocking mode