diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile | 6 | ||||
-rw-r--r-- | src/makefile.win32 | 6 | ||||
-rw-r--r-- | src/module.cpp | 182 | ||||
-rw-r--r-- | src/modulemanager.cpp | 13 | ||||
-rw-r--r-- | src/modules.c | 166 |
5 files changed, 203 insertions, 170 deletions
diff --git a/src/Makefile b/src/Makefile index ccd6a3be2..b70acb6ca 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,11 +1,11 @@ OBJS = actions.o base64.o bots.o botserv.o channels.o chanserv.o commands.o compat.o \ config.o datafiles.o encrypt.o events.o hashcomp.o helpserv.o hostserv.o init.o ircd.o language.o log.o mail.o main.o \ memory.o memoserv.o messages.o misc.o modules.o news.o nickserv.o operserv.o \ - process.o send.o servers.o sessions.o slist.o sockutil.o timeout.o users.o + process.o send.o servers.o sessions.o slist.o sockutil.o timeout.o users.o module.o modulemanager.o SRCS = actions.c base64.c bots.cpp botserv.c channels.c chanserv.c commands.c compat.c \ config.c datafiles.c encrypt.c events.c hashcomp.cpp helpserv.c hostserv.c init.c ircd.c language.c log.c mail.c main.c \ memory.c memoserv.c messages.c misc.c modules.c news.c nickserv.c operserv.c \ - process.c send.c servers.c sessions.c s sockutil.c timeout.c users.c + process.c send.c servers.c sessions.c s sockutil.c timeout.c users.c module.cpp modulemanager.cpp INCLUDES = ../include/commands.h ../include/defs.h ../include/language.h \ ../include/pseudo.h ../include/sysconf.h ../include/config.h \ @@ -59,6 +59,8 @@ memory.o: memory.c $(INCLUDES) memoserv.o: memoserv.c $(INCLUDES) messages.o: messages.c $(INCLUDES) modules.o: modules.c $(INCLUDES) +module.o: module.cpp $(INCLUDES) +modulemanager.o: modulemanager.cpp $(INCLUDES) misc.o: misc.c $(INCLUDES) news.o: news.c $(INCLUDES) nickserv.o: nickserv.c $(INCLUDES) diff --git a/src/makefile.win32 b/src/makefile.win32 index 39799a25a..718948d88 100644 --- a/src/makefile.win32 +++ b/src/makefile.win32 @@ -22,13 +22,13 @@ OBJS = actions.obj base64.obj bots.obj botserv.obj channels.obj chanserv.obj co init.obj ircd.obj language.obj list.obj log.obj mail.obj main.obj memory.obj \ memoserv.obj messages.obj misc.obj modules.obj mod_version.obj news.obj nickserv.obj operserv.obj \ process.obj send.obj servers.obj sessions.obj slist.obj sockutil.obj \ - timeout.obj users.obj + timeout.obj users.obj module.obj modulemanager.obj SRCS = actions.c base64.c botserv.c bots.cpp channels.c chanserv.c commands.c compat.c \ config.c datafiles.c encrypt.c events.c helpserv.c hostserv.c init.c ircd.c \ language.c list.c log.c mail.c main.c memory.c memoserv.c messages.c misc.c \ modules.c mod_version.c news.c nickserv.c operserv.c process.c send.c servers.obj sessions.c \ - slist.c sockutil.c timeout.c users.c + slist.c sockutil.c timeout.c users.c module.cpp modulemanager.cpp ########################################################################### @@ -86,6 +86,8 @@ memory.obj: memory.c ..\include\services.h memoserv.obj: memoserv.c ..\include\services.h ..\include\pseudo.h messages.obj: messages.c ..\include\services.h ..\include\messages.h ..\include\language.h modules.obj: modules.c ..\include\modules.h ..\include\language.h ..\include\version.h +module.obj: module.cpp ..\include\modules.h ..\include\language.h ..\include\version.h +modulemanager.obj: modulemanager.cpp ..\include\modules.h ..\include\language.h ..\include\version.h mod_version.obj: mod_version.c ..\include\modules.h ..\include\version.h misc.obj: misc.c ..\include\services.h ..\include\language.h news.obj: news.c ..\include\services.h ..\include\pseudo.h diff --git a/src/module.cpp b/src/module.cpp new file mode 100644 index 000000000..422d1a643 --- /dev/null +++ b/src/module.cpp @@ -0,0 +1,182 @@ +/* Modular support + * + * (C) 2008 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for further details. + * + * $Id$ + * + */ +#include "modules.h" +#include "language.h" +#include "version.h" + +#if !defined(_WIN32) + #include <dlfcn.h> +#else + const char *ano_moderr(void); +#endif + +Module::Module(const std::string &mname, const std::string &creator) +{ + this->name = mname; /* Our name */ + this->filename = NULL; + this->nickHelp = NULL; + this->chanHelp = NULL; + this->memoHelp = NULL; + this->botHelp = NULL; + this->operHelp = NULL; + this->hostHelp = NULL; + this->helpHelp = NULL; + this->type = THIRD; + this->handle = NULL; + + for (int i = 0; i < NUM_LANGS; i++) + { + this->lang[i].argc = 0; + } +} + +Module::~Module() +{ + int i = 0; + mod_current_module = this; + + for (i = 0; i < NUM_LANGS; i++) + moduleDeleteLanguage(i); + + if (this->filename) + { + remove(this->filename); + free(this->filename); + } + + if (this->handle) + { + if ((ano_modclose(this->handle)) != 0) + alog("%s", ano_moderr()); + } + + int idx; + CommandHash *current = NULL; + MessageHash *mcurrent = NULL; + EvtMessageHash *ecurrent = NULL; + EvtHookHash *ehcurrent = NULL; + + Command *c; + Message *msg; + EvtMessage *eMsg; + EvtHook *eHook; + int status = 0; + + /* Kill any active callbacks this module has */ + moduleCallBackPrepForUnload(this->name.c_str()); + + /* Remove any stored data this module has */ + moduleDelAllDataMod(this); + + /** + * ok, im going to walk every hash looking for commands we own, now, not exactly elegant or efficiant :) + **/ + for (idx = 0; idx < MAX_CMD_HASH; idx++) { + for (current = HS_cmdTable[idx]; current; current = current->next) { + for (c = current->c; c; c = c->next) { + if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) { + this->DelCommand(HOSTSERV, c->name); + } + } + } + + for (current = BS_cmdTable[idx]; current; current = current->next) { + for (c = current->c; c; c = c->next) { + if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) { + this->DelCommand(BOTSERV, c->name); + } + } + } + + for (current = MS_cmdTable[idx]; current; current = current->next) { + for (c = current->c; c; c = c->next) { + if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) { + this->DelCommand(MEMOSERV, c->name); + } + } + } + + for (current = NS_cmdTable[idx]; current; current = current->next) { + for (c = current->c; c; c = c->next) { + if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) { + this->DelCommand(NICKSERV, c->name); + } + } + } + + for (current = CS_cmdTable[idx]; current; current = current->next) { + for (c = current->c; c; c = c->next) { + if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) { + this->DelCommand(CHANSERV, c->name); + } + } + } + + for (current = HE_cmdTable[idx]; current; current = current->next) { + for (c = current->c; c; c = c->next) { + if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) { + this->DelCommand(HELPSERV, c->name); + } + } + } + + for (current = OS_cmdTable[idx]; current; current = current->next) { + for (c = current->c; c; c = c->next) { + if ((c->mod_name) && (stricmp(c->mod_name, this->name.c_str()) == 0)) { + this->DelCommand(OPERSERV, c->name); + } + } + } + + for (mcurrent = IRCD[idx]; mcurrent; mcurrent = mcurrent->next) { + for (msg = mcurrent->m; msg; msg = msg->next) { + if ((msg->mod_name) + && (stricmp(msg->mod_name, this->name.c_str()) == 0)) { + moduleDelMessage(msg->name); + } + } + } + + for (ecurrent = EVENT[idx]; ecurrent; ecurrent = ecurrent->next) { + for (eMsg = ecurrent->evm; eMsg; eMsg = eMsg->next) { + if ((eMsg->mod_name) + && (stricmp(eMsg->mod_name, this->name.c_str()) == 0)) { + status = delEventHandler(EVENT, eMsg, this->name.c_str()); + } + } + } + for (ehcurrent = EVENTHOOKS[idx]; ehcurrent; + ehcurrent = ehcurrent->next) { + for (eHook = ehcurrent->evh; eHook; eHook = eHook->next) { + if ((eHook->mod_name) + && (stricmp(eHook->mod_name, this->name.c_str()) == 0)) { + status = delEventHook(EVENTHOOKS, eHook, this->name.c_str()); + } + } + } + + } +} + +void Module::SetType(MODType ntype) +{ + this->type = ntype; +} + +void Module::SetVersion(const std::string &nversion) +{ + this->version = nversion; +} + +void Module::SetAuthor(const std::string &nauthor) +{ + this->author = nauthor; +} diff --git a/src/modulemanager.cpp b/src/modulemanager.cpp new file mode 100644 index 000000000..21ccd640d --- /dev/null +++ b/src/modulemanager.cpp @@ -0,0 +1,13 @@ +/* Modular support + * + * (C) 2008 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for further details. + * + * $Id$ + * + */ +#include "modules.h" +#include "language.h" +#include "version.h" diff --git a/src/modules.c b/src/modules.c index 3de81cec0..88e788aa7 100644 --- a/src/modules.c +++ b/src/modules.c @@ -1,4 +1,3 @@ - /* Modular support * * (C) 2003-2008 Anope Team @@ -277,169 +276,6 @@ void modules_unload_all(bool fini, bool unload_proto) } } -Module::Module(const std::string &mname, const std::string &creator) -{ - this->name = mname; /* Our name */ - this->filename = NULL; - this->nickHelp = NULL; - this->chanHelp = NULL; - this->memoHelp = NULL; - this->botHelp = NULL; - this->operHelp = NULL; - this->hostHelp = NULL; - this->helpHelp = NULL; - this->type = THIRD; - this->handle = NULL; - - for (int i = 0; i < NUM_LANGS; i++) - { - this->lang[i].argc = 0; - } -} - -Module::~Module() -{ - int i = 0; - mod_current_module = this; - - for (i = 0; i < NUM_LANGS; i++) - moduleDeleteLanguage(i); - - if (this->filename) - { - remove(this->filename); - free(this->filename); - } - - if (this->handle) - { - if ((ano_modclose(this->handle)) != 0) - alog("%s", ano_moderr()); - } - - int idx; - CommandHash *current = NULL; - MessageHash *mcurrent = NULL; - EvtMessageHash *ecurrent = NULL; - EvtHookHash *ehcurrent = NULL; - - Command *c; - Message *msg; - EvtMessage *eMsg; - EvtHook *eHook; - int status = 0; - - /* Kill any active callbacks this module has */ - moduleCallBackPrepForUnload(this->name.c_str()); - - /* Remove any stored data this module has */ - moduleDelAllDataMod(this); - - /** - * ok, im going to walk every hash looking for commands we own, now, not exactly elegant or efficiant :) - **/ - for (idx = 0; idx < MAX_CMD_HASH; idx++) { - for (current = HS_cmdTable[idx]; current; current = current->next) { - for (c = current->c; c; c = c->next) { - if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) { - this->DelCommand(HOSTSERV, c->name); - } - } - } - - for (current = BS_cmdTable[idx]; current; current = current->next) { - for (c = current->c; c; c = c->next) { - if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) { - this->DelCommand(BOTSERV, c->name); - } - } - } - - for (current = MS_cmdTable[idx]; current; current = current->next) { - for (c = current->c; c; c = c->next) { - if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) { - this->DelCommand(MEMOSERV, c->name); - } - } - } - - for (current = NS_cmdTable[idx]; current; current = current->next) { - for (c = current->c; c; c = c->next) { - if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) { - this->DelCommand(NICKSERV, c->name); - } - } - } - - for (current = CS_cmdTable[idx]; current; current = current->next) { - for (c = current->c; c; c = c->next) { - if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) { - this->DelCommand(CHANSERV, c->name); - } - } - } - - for (current = HE_cmdTable[idx]; current; current = current->next) { - for (c = current->c; c; c = c->next) { - if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) { - this->DelCommand(HELPSERV, c->name); - } - } - } - - for (current = OS_cmdTable[idx]; current; current = current->next) { - for (c = current->c; c; c = c->next) { - if ((c->mod_name) && (stricmp(c->mod_name, this->name.c_str()) == 0)) { - this->DelCommand(OPERSERV, c->name); - } - } - } - - for (mcurrent = IRCD[idx]; mcurrent; mcurrent = mcurrent->next) { - for (msg = mcurrent->m; msg; msg = msg->next) { - if ((msg->mod_name) - && (stricmp(msg->mod_name, this->name.c_str()) == 0)) { - moduleDelMessage(msg->name); - } - } - } - - for (ecurrent = EVENT[idx]; ecurrent; ecurrent = ecurrent->next) { - for (eMsg = ecurrent->evm; eMsg; eMsg = eMsg->next) { - if ((eMsg->mod_name) - && (stricmp(eMsg->mod_name, this->name.c_str()) == 0)) { - status = delEventHandler(EVENT, eMsg, this->name.c_str()); - } - } - } - for (ehcurrent = EVENTHOOKS[idx]; ehcurrent; - ehcurrent = ehcurrent->next) { - for (eHook = ehcurrent->evh; eHook; eHook = eHook->next) { - if ((eHook->mod_name) - && (stricmp(eHook->mod_name, this->name.c_str()) == 0)) { - status = delEventHook(EVENTHOOKS, eHook, this->name.c_str()); - } - } - } - - } -} - -void Module::SetType(MODType type) -{ - this->type = type; -} - -void Module::SetVersion(const std::string &version) -{ - this->version = version; -} - -void Module::SetAuthor(const std::string &author) -{ - this->author = author; -} - void Module::InsertLanguage(int langNumber, int ac, const char **av) { int i; @@ -459,8 +295,6 @@ void Module::InsertLanguage(int langNumber, int ac, const char **av) } } - - /** * Add the module to the list of currently loaded modules. * @param m the currently loaded module |