X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=include%2Fsocketengine.h;h=f647f4df3add6d6c6b440ed64848ff7070054833;hb=001861f5d2aca21531b0a20a46e44654a45a5522;hp=729f5e0909a8fb66275857bb28cd5bd1c8f8fb57;hpb=76ef4a17de34b7e8a9b6b3687f8a12a65fe28105;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/socketengine.h b/include/socketengine.h index 729f5e090..f647f4df3 100644 --- a/include/socketengine.h +++ b/include/socketengine.h @@ -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 @@ -29,8 +29,11 @@ */ enum EventType { + /** Read event */ EVENT_READ = 0, + /** Write event */ EVENT_WRITE = 1, + /** Error event */ EVENT_ERROR = 2 }; @@ -54,7 +57,7 @@ class InspIRCd; * must have a file descriptor. What this file descriptor * is actually attached to is completely up to you. */ -class EventHandler : public Extensible +class CoreExport EventHandler : public Extensible { protected: /** File descriptor. @@ -66,6 +69,7 @@ class EventHandler : public Extensible */ int fd; public: + /** Get the current file descriptor * @return The file descriptor of this handler */ @@ -111,7 +115,7 @@ class 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 @@ -149,7 +153,7 @@ class EventHandler : public Extensible * have to be aware of which SocketEngine derived * class they are using. */ -class SocketEngine : public Extensible +class CoreExport SocketEngine : public Extensible { protected: /** Owner/Creator @@ -163,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. @@ -242,14 +253,14 @@ public: * @param fd The event handler to look for * @return True if this fd has an event handler */ - bool HasFd(int fd); + virtual bool HasFd(int fd); /** Returns the EventHandler attached to a specific fd. * If the fd isnt in the socketengine, returns NULL. * @param fd The event handler to look for * @return A pointer to the event handler, or NULL */ - EventHandler* GetRef(int fd); + virtual EventHandler* GetRef(int fd); /** Waits for events and dispatches them to handlers. * Please note that this doesnt wait long, only @@ -268,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 +