diff --git a/ircd/modules.c b/ircd/modules.c index 839eb012..1d969af7 100644 --- a/ircd/modules.c +++ b/ircd/modules.c @@ -294,6 +294,9 @@ unload_one_module(const char *name, bool warn) if((mod = findmodule_byname(name)) == NULL) return false; + if(mod->core) + return false; + /* ** XXX - The type system in C does not allow direct conversion between ** data and function pointers, but as it happens, most C compilers will diff --git a/modules/core/m_modules.c b/modules/core/m_modules.c index 7eee253b..813a444b 100644 --- a/modules/core/m_modules.c +++ b/modules/core/m_modules.c @@ -349,7 +349,19 @@ do_modrestart(struct Client *source_p) RB_DLINK_FOREACH_SAFE(ptr, nptr, module_list.head) { struct module *mod = ptr->data; - unload_one_module(mod->name, false); + if(!unload_one_module(mod->name, false)) + { + ilog(L_MAIN, "Module Restart: %s was not unloaded %s", + mod->name, + mod->core? "(core module)" : ""); + + if(!mod->core) + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, + "Module Restart: %s failed to unload", + mod->name); + continue; + } + modnum++; }