/*
* 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"
* 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.
* 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
{
**/
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.
static void ResizeDouble(std::vector<T>& vect)
{
if (SocketEngine::CurrentSetSize > vect.size())
- vect.resize(vect.size() * 2);
+ vect.resize(SocketEngine::CurrentSetSize * 2);
}
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
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
*/
* 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();
* @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