summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile6
-rw-r--r--src/makefile.win326
-rw-r--r--src/module.cpp182
-rw-r--r--src/modulemanager.cpp13
-rw-r--r--src/modules.c166
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