From 61fed23a3e9a62f19c2f88208585b31356c986ef Mon Sep 17 00:00:00 2001 From: w00t Date: Sun, 7 Sep 2008 18:31:21 +0000 Subject: [PATCH] Start moving IO hooking from being bufferedsocket based to residing in EventHandler, this will pave the way for a generic listener type, and also simplifies a lot of code. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@10447 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/configreader.h | 24 ------------------------ include/socket.h | 2 ++ include/socketengine.h | 20 ++++++++++++++++++++ src/configreader.cpp | 31 ------------------------------- src/socketengine.cpp | 21 +++++++++++++++++++++ 5 files changed, 43 insertions(+), 55 deletions(-) diff --git a/include/configreader.h b/include/configreader.h index 5e437d153..af9c33533 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -607,10 +607,6 @@ class CoreExport ServerConfig : public Extensible */ std::vector ports; - /** socket objects that are attached to by modules - */ - std::map SocketIOHookModule; - /** The 005 tokens of this server (ISUPPORT) * populated/repopulated upon loading or unloading * modules. @@ -823,26 +819,6 @@ class CoreExport ServerConfig : public Extensible void ValidateNoSpaces(const char* p, const std::string &tag, const std::string &val); - /** Get a pointer to the module which has hooked the given BufferedSocket class. - * @parameter port Port number - * @return Returns a pointer to the hooking module, or NULL - */ - Module* GetIOHook(BufferedSocket* is); - - /** Hook a module to an BufferedSocket class, so that it can receive notifications - * of low-level socket activity. - * @param iomod The module to hook to the socket - * @param is The BufferedSocket to attach to - * @return True if the hook was successful. - */ - bool AddIOHook(Module* iomod, BufferedSocket* is); - - /** Delete a module hook from an BufferedSocket. - * @param is The BufferedSocket to detatch from. - * @return True if the unhook was successful - */ - bool DelIOHook(BufferedSocket* is); - /** Returns the fully qualified path to the inspircd directory * @return The full program directory */ diff --git a/include/socket.h b/include/socket.h index a26c1256d..105984f74 100644 --- a/include/socket.h +++ b/include/socket.h @@ -139,6 +139,8 @@ namespace irc } } + + /** This class handles incoming connections on client ports. * It will create a new User for every valid connection * and assign it a file descriptor. diff --git a/include/socketengine.h b/include/socketengine.h index f16ec3fea..127a2fd90 100644 --- a/include/socketengine.h +++ b/include/socketengine.h @@ -68,8 +68,28 @@ class CoreExport EventHandler : public Extensible * other forms of IPC. */ int fd; + + /** Pointer to the module which has hooked the given EventHandler for IO events. + */ + Module *IOHook; public: + /** Return the current hooker of IO events for this socket, or NULL. + * @return Hooker module, if set, or NULL. + */ + Module *GetIOHook(); + + /** Set a module as hooking IO events on this socket. + * @param IOHooker The module hooking IO + * @return True if the hook could be added, false otherwise. + */ + bool AddIOHook(Module *IOHooker); + + /** Remove IO hooking from a module + * @return True if hooking was successfully removed, false otherwise. + */ + bool DelIOHook(); + /** Get the current file descriptor * @return The file descriptor of this handler */ diff --git a/src/configreader.cpp b/src/configreader.cpp index 1e8e0a7e9..cce362ed2 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -65,37 +65,6 @@ void ServerConfig::ClearStack() include_stack.clear(); } -Module* ServerConfig::GetIOHook(BufferedSocket* is) -{ - std::map::iterator x = SocketIOHookModule.find(is); - return (x != SocketIOHookModule.end() ? x->second : NULL); -} - -bool ServerConfig::AddIOHook(Module* iomod, BufferedSocket* is) -{ - if (!GetIOHook(is)) - { - SocketIOHookModule[is] = iomod; - is->IsIOHooked = true; - return true; - } - else - { - throw ModuleException("BufferedSocket derived class already hooked by another module"); - } -} - -bool ServerConfig::DelIOHook(BufferedSocket* is) -{ - std::map::iterator x = SocketIOHookModule.find(is); - if (x != SocketIOHookModule.end()) - { - SocketIOHookModule.erase(x); - return true; - } - return false; -} - void ServerConfig::Update005() { std::stringstream out(data005); diff --git a/src/socketengine.cpp b/src/socketengine.cpp index c7188b55a..74f8c1861 100644 --- a/src/socketengine.cpp +++ b/src/socketengine.cpp @@ -41,6 +41,27 @@ #include "inspircd.h" #include "socketengine.h" +bool EventHandler::AddIOHook(Module *IOHooker) +{ + if (this->IOHook) + return false; + + this->IOHook = IOHooker; +} + +bool EventHandler::DelIOHook() +{ + if (!this->IOHook) + return false + + this->IOHook = false; +} + +Module *EventHandler::GetIOHook() +{ + return this->IOHook; +} + int EventHandler::GetFd() { return this->fd; -- 2.39.2