summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile5
-rw-r--r--src/core/Makefile2
-rw-r--r--src/mod_version.c36
-rw-r--r--src/modules.c33
-rw-r--r--src/modules/Makefile2
-rw-r--r--src/protocol/Makefile2
6 files changed, 58 insertions, 22 deletions
diff --git a/src/Makefile b/src/Makefile
index e20728d96..0da9c0192 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2,12 +2,12 @@ MYSQL_OBJ = $(MYSQL:.c=.o)
RDB_OBJ = $(RDB:.c=.o)
OBJS = actions.o base64.o botserv.o channels.o chanserv.o commands.o compat.o \
config.o datafiles.o encrypt.o events.o helpserv.o hostserv.o init.o ircd.o language.o list.o log.o mail.o main.o \
- memory.o memoserv.o messages.o misc.o modules.o news.o nickserv.o operserv.o \
+ memory.o memoserv.o messages.o misc.o mod_version.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 \
$(RDB_OBJ) $(MYSQL_OBJ)
SRCS = actions.c base64.c botserv.c 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 news.c nickserv.c operserv.c \
+ memory.c memoserv.c messages.c misc.c mod_version.c modules.c news.c nickserv.c operserv.c \
process.c send.c servers.c sessions.c slist.c sockutil.c timeout.c users.c \
$(RDB) $(MYSQL)
@@ -60,6 +60,7 @@ memory.o: memory.c $(INCLUDES)
memoserv.o: memoserv.c $(INCLUDES)
messages.o: messages.c $(INCLUDES)
modules.o: modules.c $(INCLUDES)
+mod_version.o: mod_version.c $(INCLUDES)
misc.o: misc.c $(INCLUDES)
news.o: news.c $(INCLUDES)
nickserv.o: nickserv.c $(INCLUDES)
diff --git a/src/core/Makefile b/src/core/Makefile
index 7b63b330d..4ec275430 100644
--- a/src/core/Makefile
+++ b/src/core/Makefile
@@ -24,7 +24,7 @@ distclean: spotless
$(CC) ${CFLAGS} ${CDEFS} ${MODULEFLAGS} -I../${INCLUDEDIR} -c $<
.o.s:
- $(CC) ${SHARED} $< -o $*.so ${PROFILE}
+ $(CC) ${SHARED} ../mod_version.o $< -o $*.so ${PROFILE}
@$(TOUCH) $*.s
subs:
diff --git a/src/mod_version.c b/src/mod_version.c
new file mode 100644
index 000000000..e314b8b42
--- /dev/null
+++ b/src/mod_version.c
@@ -0,0 +1,36 @@
+#include "version.h"
+
+#ifndef _WIN32
+#define E extern
+#define I extern
+#else
+#ifndef MODULE_COMPILE
+#define E extern __declspec(dllexport)
+#define I extern __declspec(dllimport)
+#else
+#define E extern __declspec(dllimport)
+#define I extern __declspec(dllexport)
+#endif
+#endif
+
+E int getAnopeBuildVersion();
+E int getAnopeMajorVersion();
+E int getAnopeMinorVersion();
+E int getAnopePatchVersion();
+
+int getAnopeBuildVersion() {
+ return VERSION_BUILD;
+}
+
+int getAnopeMajorVersion() {
+ return VERSION_MAJOR;
+}
+
+int getAnopeMinorVersion() {
+ return VERSION_MINOR;
+}
+
+int getAnopePatchVersion() {
+ return VERSION_PATCH;
+}
+
diff --git a/src/modules.c b/src/modules.c
index f366ff23e..8e8882afa 100644
--- a/src/modules.c
+++ b/src/modules.c
@@ -523,6 +523,7 @@ int loadModule(Module * m, User * u)
int len;
const char *err;
int (*func) (int, char **);
+ int (*version)();
int ret = 0;
char *argv[1];
int argc = 0;
@@ -557,8 +558,6 @@ int loadModule(Module * m, User * u)
buf[4095] = '\0';
/* Don't skip return value checking! -GD */
if ((ret = moduleCopyFile(m->name, buf)) != MOD_ERR_OK) {
- if (u)
- notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, m->name);
m->filename = sstrdup(buf);
return ret;
}
@@ -568,22 +567,25 @@ int loadModule(Module * m, User * u)
m->handle = ano_modopen(m->filename);
if ((err = ano_moderr()) != NULL) {
alog(err);
- if (u) {
- notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, m->name);
- }
return MOD_ERR_NOLOAD;
}
ano_modclearerr();
func = (int (*)(int, char **))ano_modsym(m->handle, "AnopeInit");
if ((err = ano_moderr()) != NULL) {
ano_modclose(m->handle); /* If no AnopeInit - it isnt an Anope Module, close it */
- if (u) {
- notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, m->name);
- }
-
return MOD_ERR_NOLOAD;
}
if (func) {
+ version = (int (*)())ano_modsym(m->handle,"getAnopeBuildVersion");
+ if(version && version() >= VERSION_BUILD ) {
+ alog("Module %s compiled against anope revision %d, this is %d",m->name,version(),VERSION_BUILD);
+ } else {
+ ano_modclose(m->handle);
+ ano_modclearerr();
+ alog("Module %s is compiled against an old version of anope!",m->name);
+ return MOD_ERR_NOLOAD;
+ }
+ /* TODO */
mod_current_module_name = m->name;
/* argv[0] is the user if there was one, or NULL if not */
if (u) {
@@ -602,9 +604,6 @@ int loadModule(Module * m, User * u)
ret = MOD_STOP;
}
if (ret == MOD_STOP) {
- if (u) {
- notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, m->name);
- }
alog("%s requested unload...", m->name);
unloadModule(m, NULL);
mod_current_module_name = NULL;
@@ -623,10 +622,6 @@ int loadModule(Module * m, User * u)
return MOD_ERR_OK;
#else
- if (u) {
- notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, m->name);
- }
-
return MOD_ERR_NOLOAD;
#endif
}
@@ -2706,8 +2701,12 @@ void handleModuleOperationQueue(void)
alog("Trying to load module [%s]", mod_operation_queue->m->name);
status = loadModule(mod_operation_queue->m, mod_operation_queue->u);
alog("Module loading status: %d", status);
- if (status != MOD_ERR_OK)
+ if (status != MOD_ERR_OK) {
+ if(mod_current_user) {
+ notice_lang(s_OperServ, mod_current_user, OPER_MODULE_LOAD_FAIL,mod_operation_queue->m->name);
+ }
destroyModule(mod_operation_queue->m);
+ }
} else if (mod_operation_queue->op == MOD_OP_UNLOAD) {
alog("Trying to unload module [%s]", mod_operation_queue->m->name);
status = unloadModule(mod_operation_queue->m, mod_operation_queue->u);
diff --git a/src/modules/Makefile b/src/modules/Makefile
index ee891c216..346e32ffb 100644
--- a/src/modules/Makefile
+++ b/src/modules/Makefile
@@ -24,7 +24,7 @@ distclean: spotless
$(CC) ${CFLAGS} ${CDEFS} ${MODULEFLAGS} -I../${INCLUDEDIR} -c $<
.o.s:
- $(CC) ${SHARED} $< -o $*.so ${PROFILE}
+ $(CC) ${SHARED} ../mod_version.o $< -o $*.so ${PROFILE}
@$(TOUCH) $*.s
subs:
diff --git a/src/protocol/Makefile b/src/protocol/Makefile
index 53294906f..ab837e459 100644
--- a/src/protocol/Makefile
+++ b/src/protocol/Makefile
@@ -24,7 +24,7 @@ distclean: clean spotless
$(CC) ${CFLAGS} ${CDEFS} ${MODULEFLAGS} -I../${INCLUDEDIR} -c $<
.o.s:
- $(CC) ${SHARED} $< -o $*.so ${PROFILE}
+ $(CC) ${SHARED} ../mod_version.o $< -o $*.so ${PROFILE}
@$(TOUCH) $*.s
subs: