diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile | 5 | ||||
-rw-r--r-- | src/core/Makefile | 2 | ||||
-rw-r--r-- | src/mod_version.c | 36 | ||||
-rw-r--r-- | src/modules.c | 33 | ||||
-rw-r--r-- | src/modules/Makefile | 2 | ||||
-rw-r--r-- | src/protocol/Makefile | 2 |
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: |