- if (Config->module_names[j] == filename_str)
- {
- if (modules[j]->GetVersion().Flags & VF_STATIC)
- {
- this->Log(DEFAULT,"Failed to unload STATIC module %s",filename);
- snprintf(MODERR,MAXBUF,"Module not unloadable (marked static)");
- return false;
- }
- std::pair<int,std::string> intercount = GetInterfaceInstanceCount(modules[j]);
- if (intercount.first > 0)
- {
- this->Log(DEFAULT,"Failed to unload module %s, being used by %d other(s) via interface '%s'",filename, intercount.first, intercount.second.c_str());
- snprintf(MODERR,MAXBUF,"Module not unloadable (Still in use by %d other module%s which %s using its interface '%s') -- unload dependent modules first!",
- intercount.first,
- intercount.first > 1 ? "s" : "",
- intercount.first > 1 ? "are" : "is",
- intercount.second.c_str());
- return false;
- }
- /* Give the module a chance to tidy out all its metadata */
- for (chan_hash::iterator c = this->chanlist->begin(); c != this->chanlist->end(); c++)
- {
- modules[j]->OnCleanup(TYPE_CHANNEL,c->second);
- }
- for (user_hash::iterator u = this->clientlist->begin(); u != this->clientlist->end(); u++)
- {
- modules[j]->OnCleanup(TYPE_USER,u->second);
- }
-
- /* Tidy up any dangling resolvers */
- this->Res->CleanResolvers(modules[j]);
-
- FOREACH_MOD_I(this,I_OnUnloadModule,OnUnloadModule(modules[j],Config->module_names[j]));
-
- for(int t = 0; t < 255; t++)
- {
- Config->global_implementation[t] -= Config->implement_lists[j][t];
- }
-
- /* We have to renumber implement_lists after unload because the module numbers change!
- */
- for(int j2 = j; j2 < 254; j2++)
- {
- for(int t = 0; t < 255; t++)
- {
- Config->implement_lists[j2][t] = Config->implement_lists[j2+1][t];
- }
- }
-
- // found the module
- Parser->RemoveCommands(filename);
- this->EraseModule(j);
- this->EraseFactory(j);
- this->Log(DEFAULT,"Module %s unloaded",filename);
- this->ModCount--;
- BuildISupport();
- return true;
- }
- }
- this->Log(DEFAULT,"Module %s is not loaded, cannot unload it!",filename);
- snprintf(MODERR,MAXBUF,"Module not loaded");
- return false;
-}
-
-bool InspIRCd::LoadModule(const char* filename)
-{
- /* Do we have a glob pattern in the filename?
- * The user wants to load multiple modules which
- * match the pattern.
- */
- if (strchr(filename,'*') || (strchr(filename,'?')))
- {
- int n_match = 0;
- DIR* library = opendir(Config->ModPath);
- if (library)
- {
- /* Try and locate and load all modules matching the pattern */
- dirent* entry = NULL;
- while ((entry = readdir(library)))
- {
- if (this->MatchText(entry->d_name, filename))
- {
- if (!this->LoadModule(entry->d_name))
- n_match++;
- }
- }
- closedir(library);
- }
- /* Loadmodule will now return false if any one of the modules failed
- * to load (but wont abort when it encounters a bad one) and when 1 or
- * more modules were actually loaded.