X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fsocketengine.h;h=e54dfca976fa30f45814274a1f4c9dfbba0b0237;hb=8df3d792bc99d9dd73db7a601ebe8d4a397c3522;hp=b006439520eb514a26ac833d0108ff72ed2c9d0f;hpb=8e8b0719bf58e2d875c06698f86377189da87e16;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/socketengine.h b/include/socketengine.h index b00643952..e54dfca97 100644 --- a/include/socketengine.h +++ b/include/socketengine.h @@ -1,9 +1,15 @@ /* * InspIRCd -- Internet Relay Chat Daemon * + * Copyright (C) 2013-2016 Attila Molnar + * Copyright (C) 2013-2014 Adam + * Copyright (C) 2012-2013, 2017-2019 Sadie Powell + * Copyright (C) 2012 Robby + * Copyright (C) 2009 Uli Schlachter * Copyright (C) 2009 Daniel De Graaf - * Copyright (C) 2007-2008 Robin Burchell - * Copyright (C) 2005-2007 Craig Edwards + * Copyright (C) 2007-2008, 2017 Robin Burchell + * Copyright (C) 2007-2008, 2010 Craig Edwards + * Copyright (C) 2007 burlex * Copyright (C) 2007 Dennis Friis * * This file is part of InspIRCd. InspIRCd is free software: you can @@ -164,6 +170,12 @@ 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 @@ -211,17 +223,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 { @@ -259,9 +261,9 @@ class CoreExport SocketEngine void UpdateWriteCounters(int len_out); /** Get data transfer statistics. - * @param kbitspersec_in Filled with incoming traffic in this second in kbit/s. - * @param kbitspersec_out Filled with outgoing traffic in this second in kbit/s. - * @param kbitspersec_total Filled with total traffic in this second in kbit/s. + * @param kbitpersec_in Filled with incoming traffic in this second in kbit/s. + * @param kbitpersec_out Filled with outgoing traffic in this second in kbit/s. + * @param kbitpersec_total Filled with total traffic in this second in kbit/s. */ void CoreExport GetBandwidth(float& kbitpersec_in, float& kbitpersec_out, float& kbitpersec_total) const; @@ -276,20 +278,26 @@ class CoreExport SocketEngine **/ static std::vector 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 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 +310,7 @@ class CoreExport SocketEngine static void ResizeDouble(std::vector& vect) { if (SocketEngine::CurrentSetSize > vect.size()) - vect.resize(vect.size() * 2); + vect.resize(SocketEngine::CurrentSetSize * 2); } public: @@ -354,10 +362,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 @@ -488,20 +496,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