X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/28e12fad3cdee40beee91c288a8b2134fa06ad69..2ef034d1111fe65fc4e5175896624c30b8aee9dd:/ircd/modules.c diff --git a/ircd/modules.c b/ircd/modules.c index 7a246cbe..bf010cb2 100644 --- a/ircd/modules.c +++ b/ircd/modules.c @@ -41,7 +41,7 @@ #include #ifndef LT_MODULE_EXT -# error "Charybdis requires loadable module support." +# error "Solanum requires loadable module support." #endif rb_dlink_list module_list; @@ -51,6 +51,7 @@ static const char *core_module_table[] = { "m_ban", "m_die", "m_error", + "m_identified", "m_join", "m_kick", "m_kill", @@ -224,8 +225,8 @@ load_all_modules(bool warn) if(len > module_ext_len && rb_strncasecmp(ldirent->d_name + (len - module_ext_len), LT_MODULE_EXT, module_ext_len) == 0) { - (void) snprintf(module_fq_name, sizeof(module_fq_name), "%s%c%s", - ircd_paths[IRCD_PATH_AUTOLOAD_MODULES], RB_PATH_SEPARATOR, ldirent->d_name); + (void) snprintf(module_fq_name, sizeof(module_fq_name), "%s/%s", + ircd_paths[IRCD_PATH_AUTOLOAD_MODULES], ldirent->d_name); (void) load_a_module(module_fq_name, warn, MAPI_ORIGIN_CORE, false); } @@ -248,8 +249,7 @@ load_core_modules(bool warn) for (i = 0; core_module_table[i]; i++) { - snprintf(module_name, sizeof(module_name), "%s%c%s", ircd_paths[IRCD_PATH_MODULES], RB_PATH_SEPARATOR, - core_module_table[i]); + snprintf(module_name, sizeof(module_name), "%s/%s", ircd_paths[IRCD_PATH_MODULES], core_module_table[i]); if(load_a_module(module_name, warn, MAPI_ORIGIN_CORE, true) == false) { @@ -284,7 +284,7 @@ load_one_module(const char *path, int origin, bool coremodule) struct stat statbuf; const char *mpath = pathst->data; - snprintf(modpath, sizeof(modpath), "%s%c%s%s", mpath, RB_PATH_SEPARATOR, path, LT_MODULE_EXT); + snprintf(modpath, sizeof(modpath), "%s/%s%s", mpath, path, LT_MODULE_EXT); if((strstr(modpath, "../") == NULL) && (strstr(modpath, "/..") == NULL)) { if(stat(modpath, &statbuf) == 0 && S_ISREG(statbuf.st_mode)) @@ -296,7 +296,11 @@ load_one_module(const char *path, int origin, bool coremodule) } } - sendto_realops_snomask(SNO_GENERAL, L_ALL, "Cannot locate module %s", path); + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Cannot locate module %s", path); + + if (server_state_foreground) + ierror("cannot locate module %s", path); + return false; } @@ -396,7 +400,7 @@ unload_one_module(const char *name, bool warn) idx = serv_capindex; break; default: - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Unknown/unsupported CAP index found of type %d on capability %s when unloading %s", m->cap_index, m->cap_name, mod->name); ilog(L_MAIN, @@ -405,14 +409,13 @@ unload_one_module(const char *name, bool warn) continue; } - if (m->cap_id != NULL) - capability_orphan(idx, m->cap_name); + capability_orphan(idx, m->cap_name); } } break; } default: - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Unknown/unsupported MAPI version %d when unloading %s!", mod->mapi_version, mod->name); ilog(L_MAIN, "Unknown/unsupported MAPI version %d when unloading %s!", @@ -424,12 +427,13 @@ unload_one_module(const char *name, bool warn) rb_dlinkDelete(&mod->node, &module_list); rb_free(mod->name); + rb_free(mod->path); rb_free(mod); if(warn) { ilog(L_MAIN, "Module %s unloaded", name); - sendto_realops_snomask(SNO_GENERAL, L_ALL, "Module %s unloaded", name); + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Module %s unloaded", name); } return true; @@ -464,7 +468,7 @@ load_a_module(const char *path, bool warn, int origin, bool core) { const char *err = lt_dlerror(); - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Error loading module %s: %s", mod_displayname, err); ilog(L_MAIN, "Error loading module %s: %s", mod_displayname, err); rb_free(mod_displayname); @@ -482,7 +486,7 @@ load_a_module(const char *path, bool warn, int origin, bool core) && (mapi_version = (int *) (uintptr_t) lt_dlsym(tmpptr, "__mheader")) == NULL) || MAPI_MAGIC(*mapi_version) != MAPI_MAGIC_HDR) { - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Data format error: module %s has no MAPI header.", mod_displayname); ilog(L_MAIN, "Data format error: module %s has no MAPI header.", mod_displayname); @@ -500,7 +504,7 @@ load_a_module(const char *path, bool warn, int origin, bool core) { ilog(L_MAIN, "Module %s indicated failure during load.", mod_displayname); - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Module %s indicated failure during load.", mod_displayname); lt_dlclose(tmpptr); @@ -535,14 +539,66 @@ load_a_module(const char *path, bool warn, int origin, bool core) { struct mapi_mheader_av2 *mheader = (struct mapi_mheader_av2 *)(void *)mapi_version; /* see above */ + if(mheader->mapi_cap_list) + { + mapi_cap_list_av2 *m; + for (m = mheader->mapi_cap_list; m->cap_name; ++m) + { + struct CapabilityIndex *idx; + int result; + + switch (m->cap_index) + { + case MAPI_CAP_CLIENT: + idx = cli_capindex; + break; + case MAPI_CAP_SERVER: + idx = serv_capindex; + break; + default: + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, + "Unknown/unsupported CAP index found of type %d on capability %s when loading %s", + m->cap_index, m->cap_name, mod_displayname); + ilog(L_MAIN, + "Unknown/unsupported CAP index found of type %d on capability %s when loading %s", + m->cap_index, m->cap_name, mod_displayname); + continue; + } + + result = capability_put(idx, m->cap_name, m->cap_ownerdata); + if (m->cap_id != NULL) + *(m->cap_id) = result; + } + } + /* XXX duplicated code :( */ if(mheader->mapi_register && (mheader->mapi_register() == -1)) { ilog(L_MAIN, "Module %s indicated failure during load.", mod_displayname); - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Module %s indicated failure during load.", mod_displayname); + if(mheader->mapi_cap_list) + { + mapi_cap_list_av2 *m; + for (m = mheader->mapi_cap_list; m->cap_name; ++m) + { + struct CapabilityIndex *idx; + switch (m->cap_index) + { + case MAPI_CAP_CLIENT: + idx = cli_capindex; + break; + case MAPI_CAP_SERVER: + idx = serv_capindex; + break; + default: + continue; + } + capability_orphan(idx, m->cap_name); + } + } lt_dlclose(tmpptr); rb_free(mod_displayname); return false; @@ -562,7 +618,7 @@ load_a_module(const char *path, bool warn, int origin, bool core) delta /= 86400; iwarn("Module %s build date is out of sync with ircd build date by %ld days, expect problems", mod_displayname, delta); - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Module %s build date is out of sync with ircd build date by %ld days, expect problems", mod_displayname, delta); } @@ -586,51 +642,24 @@ load_a_module(const char *path, bool warn, int origin, bool core) { mapi_hfn_list_av1 *m; for (m = mheader->mapi_hfn_list; m->hapi_name; ++m) - add_hook(m->hapi_name, m->fn); + { + int priority = m->priority; + if (priority == 0) + priority = HOOK_NORMAL; + add_hook_prio(m->hapi_name, m->fn, priority); + } } /* New in MAPI v2 - version replacement */ ver = mheader->mapi_module_version ? mheader->mapi_module_version : ircd_version; description = mheader->mapi_module_description; - - if(mheader->mapi_cap_list) - { - mapi_cap_list_av2 *m; - for (m = mheader->mapi_cap_list; m->cap_name; ++m) - { - struct CapabilityIndex *idx; - int result; - - switch (m->cap_index) - { - case MAPI_CAP_CLIENT: - idx = cli_capindex; - break; - case MAPI_CAP_SERVER: - idx = serv_capindex; - break; - default: - sendto_realops_snomask(SNO_GENERAL, L_ALL, - "Unknown/unsupported CAP index found of type %d on capability %s when loading %s", - m->cap_index, m->cap_name, mod_displayname); - ilog(L_MAIN, - "Unknown/unsupported CAP index found of type %d on capability %s when loading %s", - m->cap_index, m->cap_name, mod_displayname); - continue; - } - - result = capability_put(idx, m->cap_name, m->cap_ownerdata); - if (m->cap_id != NULL) - *(m->cap_id) = result; - } - } } break; default: ilog(L_MAIN, "Module %s has unknown/unsupported MAPI version %d.", mod_displayname, MAPI_VERSION(*mapi_version)); - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Module %s has unknown/unsupported MAPI version %d.", mod_displayname, *mapi_version); lt_dlclose(tmpptr); @@ -653,6 +682,7 @@ load_a_module(const char *path, bool warn, int origin, bool core) mod->mapi_header = mapi_version; mod->mapi_version = MAPI_VERSION(*mapi_version); mod->origin = origin; + mod->path = rb_strdup(path); rb_dlinkAdd(mod, &mod->node, &module_list); if(warn) @@ -672,7 +702,7 @@ load_a_module(const char *path, bool warn, int origin, bool core) break; } - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Module %s [version: %s; MAPI version: %d; origin: %s; description: \"%s\"] loaded at %p", mod_displayname, ver, MAPI_VERSION(*mapi_version), o, description, (void *) tmpptr); @@ -691,6 +721,7 @@ modules_do_reload(void *info_) int check_core; int origin; char *m_bn = rb_basename(info->module); + char *path; struct Client *source_p = find_id(info->id); if((mod = findmodule_byname(m_bn)) == NULL) @@ -703,6 +734,7 @@ modules_do_reload(void *info_) origin = mod->origin; check_core = mod->core; + path = rb_strdup(mod->path); mod_remember_clicaps(); @@ -711,10 +743,11 @@ modules_do_reload(void *info_) if (source_p) sendto_one_notice(source_p, ":Module %s is not loaded", m_bn); rb_free(info); rb_free(m_bn); + rb_free(path); return; } - if((load_one_module(m_bn, origin, check_core) == false) && check_core) + if((load_a_module(path, true, origin, check_core) == false) && check_core) { sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Error reloading core module: %s: terminating ircd", m_bn); @@ -726,6 +759,7 @@ modules_do_reload(void *info_) rb_free(info); rb_free(m_bn); + rb_free(path); } void