]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/socketengine.h
Add protocol api functions: PI->WriteChannelPrivmsg() and PI->WriteChannelNotice...
[user/henk/code/inspircd.git] / include / socketengine.h
index 0ff6e89eda5dd20c96d51ed96df600ad81097bea..f647f4df3add6d6c6b440ed64848ff7070054833 100644 (file)
@@ -2,7 +2,7 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
  * See: http://www.inspircd.org/wiki/index.php/Credits
  *
  * This program is free but copyrighted software; see
  */
 enum EventType
 {
+       /** Read event */
        EVENT_READ      =       0,
+       /** Write event */
        EVENT_WRITE     =       1,
+       /** Error event */
        EVENT_ERROR     =       2
 };
 
@@ -66,6 +69,7 @@ class CoreExport EventHandler : public Extensible
         */
        int fd;
  public:
+
        /** Get the current file descriptor
         * @return The file descriptor of this handler
         */
@@ -111,7 +115,7 @@ class CoreExport EventHandler : public Extensible
         * If this function is unimplemented, the base class
         * will return false.
         *
-         * NOTE: You cannot set both Readable() and
+        * NOTE: You cannot set both Readable() and
         * Writeable() to true. If you wish to receive
         * a write event for your object, you must call
         * SocketEngine::WantWrite() instead. This will
@@ -129,21 +133,6 @@ class CoreExport EventHandler : public Extensible
         * and EVENT_WRITE for write events.
         */
        virtual void HandleEvent(EventType et, int errornum = 0) = 0;
-
-#ifdef WINDOWS
-
-       /** "Fake" file descriptor. This is windows-specific.
-        */
-       int m_internalFd;
-
-       /** Pointer to read event. We delete this so the buffer can't be used
-        * after the socket is deleted, and so it doesn't leak memory
-        */
-       void * m_readEvent;
-       void * m_writeEvent;
-       void * m_acceptEvent;
-
-#endif
 };
 
 /** Provides basic file-descriptor-based I/O support.
@@ -178,9 +167,16 @@ protected:
        int CurrentSetSize;
        /** Reference table, contains all current handlers
         */
-       EventHandler* ref[MAX_DESCRIPTORS];
+       EventHandler** ref;
+
+       int MAX_DESCRIPTORS;
 public:
 
+       double TotalEvents;
+       double ReadEvents;
+       double WriteEvents;
+       double ErrorEvents;
+
        /** Constructor.
         * The constructor transparently initializes
         * the socket engine which the ircd is using.
@@ -283,6 +279,124 @@ public:
         * @return The socket engine name
         */
        virtual std::string GetName();
+
+       /** Returns true if the file descriptors in the
+        * given event handler are within sensible ranges
+        * which can be handled by the socket engine.
+        */
+       virtual bool BoundsCheckFd(EventHandler* eh);
+
+       /** 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.
+        * @return This method should return exactly the same values as the system call it emulates.
+        */
+       virtual int Accept(EventHandler* fd, sockaddr *addr, socklen_t *addrlen);
+
+       /** Abstraction for BSD sockets close(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.
+        * @return This method should return exactly the same values as the system call it emulates.
+        */
+       virtual int Close(EventHandler* fd);
+
+       /** Abstraction for BSD sockets close(2).
+        * This function should emulate its namesake system call exactly.
+        * This function should emulate its namesake system call exactly.
+        * @return This method should return exactly the same values as the system call it emulates.
+        */
+       virtual int Close(int fd);
+
+       /** 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.
+        * @return This method should return exactly the same values as the system call it emulates.
+        */
+       virtual int Send(EventHandler* fd, const void *buf, size_t len, int flags);
+
+       /** 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.
+        * @return This method should return exactly the same values as the system call it emulates.
+        */
+       virtual int Recv(EventHandler* fd, void *buf, size_t len, int flags);
+
+       /** 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.
+        * @return This method should return exactly the same values as the system call it emulates.
+        */
+       virtual int RecvFrom(EventHandler* fd, void *buf, size_t len, int flags, sockaddr *from, socklen_t *fromlen);
+
+       /** 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.
+        * @return This method should return exactly the same values as the system call it emulates.
+        */
+       virtual int SendTo(EventHandler* fd, const void *buf, size_t len, int flags, const sockaddr *to, socklen_t tolen);
+
+       /** 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.
+        * @return This method should return exactly the same values as the system call it emulates.
+        */
+       virtual int Connect(EventHandler* fd, const sockaddr *serv_addr, socklen_t addrlen);
+
+       /** Make a file descriptor blocking.
+        * @param fd a file descriptor to set to blocking mode
+        * @return 0 on success, -1 on failure, errno is set appropriately.
+        */
+       virtual int Blocking(int fd);
+
+       /** Make a file descriptor nonblocking.
+        * @param fd A file descriptor to set to nonblocking mode
+        * @return 0 on success, -1 on failure, errno is set appropriately.
+        */
+       virtual int NonBlocking(int fd);
+
+       /** 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.
+        * @return This method should return exactly the same values as the system call it emulates.
+        */
+       virtual int Shutdown(EventHandler* fd, int how);
+
+       /** Abstraction for BSD sockets shutdown(2).
+        * This function should emulate its namesake system call exactly.
+        * @return This method should return exactly the same values as the system call it emulates.
+        */
+       virtual int Shutdown(int fd, int how);
+
+       /** Abstraction for BSD sockets bind(2).
+        * This function should emulate its namesake system call exactly.
+        * @return This method should return exactly the same values as the system call it emulates.
+        */
+       virtual int Bind(int fd, const sockaddr *my_addr, socklen_t addrlen);
+
+       /** Abstraction for BSD sockets listen(2).
+        * This function should emulate its namesake system call exactly.
+        * @return This method should return exactly the same values as the system call it emulates.
+        */
+       virtual int Listen(int sockfd, int backlog);
+
+       /** Abstraction for BSD sockets getsockname(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.
+        * @return This method should return exactly the same values as the system call it emulates.
+        */
+       virtual int GetSockName(EventHandler* fd, sockaddr *name, socklen_t* namelen);
+
+       /** This function is called immediately after fork().
+        * Some socket engines (notably kqueue) cannot have their
+        * handles inherited by forked processes. This method
+        * allows for the socket engine to re-create its handle
+        * after the daemon forks as the socket engine is created
+        * long BEFORE the daemon forks.
+        * @return void, but it is acceptable for this function to bail back to
+        * the shell or operating system on fatal error.
+        */
+       virtual void RecoverFromFork();
 };
 
 #endif
+