]> jfr.im git - solanum.git/blobdiff - ircd/modules.c
Add general::hidden_caps
[solanum.git] / ircd / modules.c
index 1add7c6b4015d02f26e665356389261eccee350b..e4dc728bdb4a000a448f3146ada82169ecaa39da 100644 (file)
@@ -41,7 +41,7 @@
 #include <ltdl.h>
 
 #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",
@@ -297,6 +298,10 @@ load_one_module(const char *path, int origin, bool coremodule)
        }
 
        sendto_realops_snomask(SNO_GENERAL, L_ALL, "Cannot locate module %s", path);
+
+       if (server_state_foreground)
+               ierror("cannot locate module %s", path);
+
        return false;
 }
 
@@ -405,8 +410,7 @@ 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;
@@ -536,6 +540,38 @@ 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_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;
+                               }
+                       }
+
                        /* XXX duplicated code :( */
                        if(mheader->mapi_register && (mheader->mapi_register() == -1))
                        {
@@ -544,6 +580,26 @@ load_a_module(const char *path, bool warn, int origin, bool core)
                                sendto_realops_snomask(SNO_GENERAL, L_ALL,
                                                     "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;
@@ -587,44 +643,17 @@ 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;