diff options
author | Robin Burchell w00t@inspircd.org <Robin Burchell w00t@inspircd.org@5417fbe8-f217-4b02-8779-1006273d7864> | 2008-11-06 21:45:10 +0000 |
---|---|---|
committer | Robin Burchell w00t@inspircd.org <Robin Burchell w00t@inspircd.org@5417fbe8-f217-4b02-8779-1006273d7864> | 2008-11-06 21:45:10 +0000 |
commit | 2644f79301d3d66b0fcf6d5399520148a9860c27 (patch) | |
tree | c3dd77f5561f40fb66ca5da33ba2507a385910f9 /src | |
parent | 32aa19dc87b5d2982a1f3c9a3f4926cb6fd2c5ae (diff) |
Remove queueing on module load/unload, NOTE: don't try unload os_modunload, otherwise things probably won't go too well right now.
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@1564 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src')
-rw-r--r-- | src/core/os_modload.c | 32 | ||||
-rw-r--r-- | src/core/os_modunload.c | 38 | ||||
-rw-r--r-- | src/modules.c | 104 | ||||
-rw-r--r-- | src/process.c | 3 |
4 files changed, 51 insertions, 126 deletions
diff --git a/src/core/os_modload.c b/src/core/os_modload.c index 5e7aaebb1..4d876272f 100644 --- a/src/core/os_modload.c +++ b/src/core/os_modload.c @@ -55,15 +55,31 @@ void myOperServHelp(User * u) **/ int do_modload(User * u) { - char *name; + char *name; - name = strtok(NULL, ""); - if (!name) { - syntax_error(s_OperServ, u, "MODLOAD", OPER_MODULE_LOAD_SYNTAX); - return MOD_CONT; - } - if (!queueModuleLoad(name, u)) - notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, name); + name = strtok(NULL, ""); + if (!name) + { + syntax_error(s_OperServ, u, "MODLOAD", OPER_MODULE_LOAD_SYNTAX); + return MOD_CONT; + } + + Module *m = findModule(name); + if (m) + { + notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, name); + return MOD_CONT; + } + + m = createModule(name); + 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 (%s)", status, ModuleGetErrStr(status)); + if (status != MOD_ERR_OK) + { + notice_lang(s_OperServ, user, OPER_MODULE_LOAD_FAIL, m->name); + destroyModule(m); + } return MOD_CONT; } diff --git a/src/core/os_modunload.c b/src/core/os_modunload.c index 786e5914b..9adfbfd8d 100644 --- a/src/core/os_modunload.c +++ b/src/core/os_modunload.c @@ -54,20 +54,36 @@ void myOperServHelp(User * u) * @param u The user who issued the command * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing. **/ -int do_modunload(User * u) +int do_modunload(User *u) { - char *name; + char *name; + int status; - name = strtok(NULL, ""); - if (!name) { - syntax_error(s_OperServ, u, "MODUNLOAD", - OPER_MODULE_UNLOAD_SYNTAX); - return MOD_CONT; - } - if (!queueModuleUnload(name, u)) - notice_lang(s_OperServ, u, OPER_MODULE_REMOVE_FAIL, name); + name = strtok(NULL, ""); + if (!name) + { + syntax_error(s_OperServ, u, "MODUNLOAD", OPER_MODULE_UNLOAD_SYNTAX); + return MOD_CONT; + } + + Module *m = findModule(name); + if (!m) + { + syntax_error(s_OperServ, u, "MODUNLOAD", OPER_MODULE_UNLOAD_SYNTAX); + return MOD_CONT; + } + + alog("Trying to unload module [%s]", m->name); + + status = unloadModule(m, u); + + if (!status) + { + alog("Module unloading status: %d (%s)", status, ModuleGetErrStr(status)); + notice_lang(s_OperServ, u, OPER_MODULE_REMOVE_FAIL, name); + } - return MOD_CONT; + return MOD_CONT; } MODULE_INIT(OSModUnLoad) diff --git a/src/modules.c b/src/modules.c index e574e7f68..4d295212d 100644 --- a/src/modules.c +++ b/src/modules.c @@ -53,7 +53,6 @@ char *mod_current_module_name = NULL; char *mod_current_buffer = NULL; User *mod_current_user; ModuleCallBack *moduleCallBackHead = NULL; -ModuleQueue *mod_operation_queue = NULL; int displayCommand(Command * c); int displayCommandFromHash(CommandHash * cmdTable[], char *name); @@ -2661,109 +2660,6 @@ void moduleDeleteLanguage(int langNumber) mod_current_module->lang[langNumber].argc = 0; } -/** - * Enqueue a module operation (load/unload/reload) - * @param m Module to perform the operation on - * @param op Operation to perform on the module - * @param u User who requested the operation - **/ -void queueModuleOperation(Module *m, ModuleOperation op, User *u) -{ - ModuleQueue *qm; - - qm = (ModuleQueue *)scalloc(1, sizeof(ModuleQueue)); - qm->m = m; - qm->op = op; - qm->u = u; - qm->next = mod_operation_queue; - mod_operation_queue = qm; -} - -/** - * Enqueue a module to load - * @param name Name of the module to load - * @param u User who requested the load - * @return 1 on success, 0 on error - **/ -int queueModuleLoad(char *name, User *u) -{ - Module *m; - - if (!name || !u) - return 0; - - if (findModule(name)) - return 0; - m = createModule(name); - queueModuleOperation(m, MOD_OP_LOAD, u); - - return 1; -} - -/** - * Enqueue a module to unload - * @param name Name of the module to unload - * @param u User who requested the unload - * @return 1 on success, 0 on error - **/ -int queueModuleUnload(char *name, User *u) -{ - Module *m; - - if (!name || !u) - return 0; - - m = findModule(name); - if (!m) - return 0; - queueModuleOperation(m, MOD_OP_UNLOAD, u); - - return 1; -} - -/** - * Execute all queued module operations - **/ -void handleModuleOperationQueue(void) -{ - ModuleQueue *next; - int status; - - if (!mod_operation_queue) - return; - - while (mod_operation_queue) { - next = mod_operation_queue->next; - - mod_current_module = mod_operation_queue->m; - mod_current_user = mod_operation_queue->u; - - if (mod_operation_queue->op == MOD_OP_LOAD) { - 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 (%s)", status, ModuleGetErrStr(status)); - 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); - alog("Module unloading status: %d (%s)", status, ModuleGetErrStr(status)); - } - - /* Remove the ModuleQueue from memory */ - free(mod_operation_queue); - - mod_operation_queue = next; - } - - mod_current_module = NULL; - mod_current_user = NULL; -} - void ModuleRunTimeDirCleanUp(void) { #ifndef _WIN32 diff --git a/src/process.c b/src/process.c index e75b444bc..3f2348097 100644 --- a/src/process.c +++ b/src/process.c @@ -427,9 +427,6 @@ void process() alog("debug: unknown message from server (%s)", inbuf); } - /* Load/unload modules if needed */ - handleModuleOperationQueue(); - /* Free argument list we created */ free(av); } |