]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/socketengine.h
Merge pull request #1018 from SaberUK/insp20+hidekills
[user/henk/code/inspircd.git] / include / socketengine.h
index bba7bd39910a7d8de26a28fd3c9b4ba4eb5dd4d4..37b7d637350b833e46d38f13d932f253008f36d6 100644 (file)
@@ -1,18 +1,27 @@
-/*       +------------------------------------+
- *       | Inspire Internet Relay Chat Daemon |
- *       +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
  *
- *  InspIRCd: (C) 2002-2010 InspIRCd Development Team
- * See: http://wiki.inspircd.org/Credits
+ *   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) 2007 Dennis Friis <peavey@inspircd.org>
  *
- * This program is free but copyrighted software; see
- *            the file COPYING for details.
+ * 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
+ * License as published by the Free Software Foundation, version 2.
  *
- * ---------------------------------------------------
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef __SOCKETENGINE__
-#define __SOCKETENGINE__
+
+#ifndef SOCKETENGINE_H
+#define SOCKETENGINE_H
 
 #include <vector>
 #include <string>
@@ -193,7 +202,9 @@ class CoreExport EventHandler : public classbase
         * class, and it will be called whenever read or write
         * events are received.
         * @param et either one of EVENT_READ for read events,
-        * and EVENT_WRITE for write events.
+        * EVENT_WRITE for write events and EVENT_ERROR for
+        * error events.
+        * @param errornum The error code which goes with an EVENT_ERROR.
         */
        virtual void HandleEvent(EventType et, int errornum = 0) = 0;
 
@@ -349,6 +360,8 @@ public:
        /** Abstraction for BSD sockets accept(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 addr The client IP address and port
+        * @param addrlen The size of the sockaddr parameter.
         * @return This method should return exactly the same values as the system call it emulates.
         */
        int Accept(EventHandler* fd, sockaddr *addr, socklen_t *addrlen);
@@ -370,6 +383,9 @@ public:
        /** Abstraction for BSD sockets send(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 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.
         * @return This method should return exactly the same values as the system call it emulates.
         */
        int Send(EventHandler* fd, const void *buf, size_t len, int flags);
@@ -377,6 +393,9 @@ public:
        /** Abstraction for BSD sockets recv(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 buf The buffer in which the data that is read is stored.
+        * @param len The size of the buffer.
+        * @param flags A flag value that controls the reception of the data.
         * @return This method should return exactly the same values as the system call it emulates.
         */
        int Recv(EventHandler* fd, void *buf, size_t len, int flags);
@@ -384,6 +403,11 @@ public:
        /** Abstraction for BSD sockets recvfrom(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 buf The buffer in which the data that is read is stored.
+        * @param len The size of the buffer.
+        * @param flags A flag value that controls the reception of the data.
+        * @param from The remote IP address and port.
+        * @param fromlen The size of the from parameter.
         * @return This method should return exactly the same values as the system call it emulates.
         */
        int RecvFrom(EventHandler* fd, void *buf, size_t len, int flags, sockaddr *from, socklen_t *fromlen);
@@ -391,6 +415,11 @@ public:
        /** Abstraction for BSD sockets sendto(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 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.
         * @return This method should return exactly the same values as the system call it emulates.
         */
        int SendTo(EventHandler* fd, const void *buf, size_t len, int flags, const sockaddr *to, socklen_t tolen);
@@ -398,6 +427,8 @@ public:
        /** 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.
         * @return This method should return exactly the same values as the system call it emulates.
         */
        int Connect(EventHandler* fd, const sockaddr *serv_addr, socklen_t addrlen);
@@ -417,6 +448,7 @@ public:
        /** Abstraction for BSD sockets shutdown(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 how What part of the socket to shut down
         * @return This method should return exactly the same values as the system call it emulates.
         */
        int Shutdown(EventHandler* fd, int how);
@@ -457,8 +489,34 @@ public:
        /** Get data transfer statistics, kilobits per second in and out and total.
         */
        void GetStats(float &kbitpersec_in, float &kbitpersec_out, float &kbitpersec_total);
+
+       /** Should we ignore the error in errno?
+        * Checks EAGAIN and WSAEWOULDBLOCK
+        */
+       static bool IgnoreError();
+
+       /** Return the last socket related error. strrerror(errno) on *nix
+        */
+       static std::string LastError();
+
+       /** Returns the error for the given error num, strerror(errnum) on *nix
+        */
+       static std::string GetError(int errnum);
 };
 
+inline bool SocketEngine::IgnoreError()
+{
+       if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
+               return true;
+
+#ifdef _WIN32
+       if (WSAGetLastError() == WSAEWOULDBLOCK)
+               return true;
+#endif
+
+       return false;
+}
+
 SocketEngine* CreateSocketEngine();
 
 #endif