diff --git a/Changes b/Changes index 7bc61f382..1f981281e 100644 --- a/Changes +++ b/Changes @@ -1690,3 +1690,4 @@ seen. gmtime warning still there - Small typo in config validation found by ins4ne - Changed the way return values work in conf3 to better report the number of errors that occurred. +- Cleaned up some module code, also removed /module load|unload (just use /rehash) diff --git a/include/modules.h b/include/modules.h index a629d6f9a..f0e7c186b 100644 --- a/include/modules.h +++ b/include/modules.h @@ -267,6 +267,7 @@ void CommandDel(Command *command); #define MODFLAG_LOADED 0x0001 /* Fully loaded */ #define MODFLAG_TESTING 0x0002 /* Not yet initialized */ #define MODFLAG_INIT 0x0004 /* Initialized */ +#define MODFLAG_DELAYED 0x0008 /* Delayed unload */ /* Module function return values */ #define MOD_SUCCESS 0 diff --git a/src/modules.c b/src/modules.c index 1f737fb97..b10ca109a 100644 --- a/src/modules.c +++ b/src/modules.c @@ -88,7 +88,7 @@ Module *Module_Find(char *name) for (p = Modules; p; p = p->next) { - if (!(p->flags & MODFLAG_TESTING)) + if (!(p->flags & MODFLAG_TESTING) || (p->flags & MODFLAG_DELAYED)) continue; if (!strcmp(p->header->name, name)) { @@ -462,6 +462,7 @@ int Module_Unload(char *name, int unload) ret = (*Mod_Unload)(unload); if (ret == MOD_DELAY) { + m->flags |= MODFLAG_DELAYED; return 2; } if (ret == MOD_FAILED) @@ -484,18 +485,11 @@ vFP Module_SymEx( { #ifndef STATIC_LINKING vFP fp; - char buf[512]; if (!name) return NULL; - ircsprintf(buf, "_%s", name); - - /* Run through all modules and check for symbols */ irc_dlsym(mod, name, fp); - if (fp) - return (fp); - irc_dlsym(mod, buf, fp); if (fp) return (fp); return NULL; @@ -507,25 +501,19 @@ vFP Module_Sym(char *name) { #ifndef STATIC_LINKING vFP fp; - char buf[512]; Module *mi; if (!name) return NULL; - - ircsprintf(buf, "_%s", name); /* Run through all modules and check for symbols */ for (mi = Modules; mi; mi = mi->next) { - if (!(mi->flags & MODFLAG_TESTING)) + if (!(mi->flags & MODFLAG_TESTING) || (mi->flags & MODFLAG_DELAYED)) continue; irc_dlsym(mi->dll, name, fp); if (fp) return (fp); - irc_dlsym(mi->dll, buf, fp); - if (fp) - return (fp); } return NULL; #endif @@ -535,18 +523,15 @@ vFP Module_SymX(char *name, Module **mptr) { #ifndef STATIC_LINKING vFP fp; - char buf[512]; Module *mi; if (!name) return NULL; - ircsprintf(buf, "_%s", name); - /* Run through all modules and check for symbols */ for (mi = Modules; mi; mi = mi->next) { - if (!(mi->flags & MODFLAG_TESTING)) + if (!(mi->flags & MODFLAG_TESTING) || (mi->flags & MODFLAG_DELAYED)) continue; irc_dlsym(mi->dll, name, fp); if (fp) @@ -554,12 +539,6 @@ vFP Module_SymX(char *name, Module **mptr) *mptr = mi; return (fp); } - irc_dlsym(mi->dll, buf, fp); - if (fp) - { - *mptr = mi; - return (fp); - } } *mptr = NULL; return NULL; @@ -685,71 +664,19 @@ int m_module(aClient *cptr, aClient *sptr, int parc, char *parv[]) sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; } - if (parc < 2) + if (!Modules) { - sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), - me.name, parv[0], "MODULE"); - return 0; + sendto_one(sptr, ":%s NOTICE %s :*** No modules loaded", me.name, sptr->name); + return 1; } - if (!match(parv[1], "load")) + for (mi = Modules; mi; mi = mi->next) { - if (parc < 3) - { - sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), - me.name, parv[0], "MODULE LOAD"); - return 0; - } - if (!(ret = Module_Create(parv[2]))) - { - sendto_realops("Loaded module %s", parv[2]); - return 0; - } - else - { - sendto_realops("Module load of %s failed: %s", - parv[2], ret); - } - } - else - if (!match(parv[1], "unload")) - { - if (parc < 3) - { - sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), - me.name, parv[0], "MODULE UNLOAD"); - return 0; - } - sendto_realops("Trying to unload module %s", parv[2]); - i = Module_Unload(parv[2], 0); - { - if (i == 1) - sendto_realops("Unloaded module %s", parv[2]); - else if (i == 2) - sendto_realops("Delaying module unload of %s", - parv[2]); - else if (i == -1) - sendto_realops("Couldn't unload module %s", - parv[2]); - } - } - else - if (!match(parv[1], "status")) - { - if (!Modules) - { - sendto_one(sptr, ":%s NOTICE %s :*** No modules loaded", me.name, sptr->name); - return 1; - } - for (mi = Modules; mi; mi = mi->next) - { - sendto_one(sptr, ":%s NOTICE %s :*** %s - %s (%s)", me.name, sptr->name, - mi->header->name, mi->header->version, mi->header->description); - } - } - else - { - sendto_one(sptr, ":%s NOTICE %s :*** Syntax: /module load|unload|status", - me.name, sptr->name); + char delayed[32]; + if (mi->flags & MODFLAG_DELAYED) + strcpy(delayed, "[Unloading]"); + sendto_one(sptr, ":%s NOTICE %s :*** %s - %s (%s) %s", me.name, sptr->name, + mi->header->name, mi->header->version, mi->header->description, + (mi->flags & MODFLAG_DELAYED) ? delayed : ""); } return 1; }