LI_API gboolean mod_accesslog_free(liModules *mods, liModule *mod) { UNUSED(mods); UNUSED(mod); if (mod->config) li_plugin_free(mods->main, mod->config); return TRUE; }
static void _server_module_release(gpointer d) { server_module *sm = d; guint i; g_assert(sm->refcount > 0); if (0 != --sm->refcount) return; for (i = sm->plugins->len; i-- > 0; ) { liPlugin *p = g_ptr_array_index(sm->plugins, i); li_plugin_free(sm->srv, p); } g_ptr_array_free(sm->plugins, TRUE); if (sm->mod) li_module_release(sm->srv->plugins.modules, sm->mod); g_free(sm->name); g_slice_free(server_module, sm); }
liPlugin *li_angel_plugin_register(liServer *srv, liModule *mod, const gchar *name, liPluginInitCB init) { liPlugins *ps = &srv->plugins; server_module *sm; liPlugin *p; const gchar* modname = mod ? mod->name->str : "core"; sm = g_hash_table_lookup(ps->load_module_refs, modname); if (!sm) { ERROR(srv, "Module '%s' not loaded; cannot load plugin '%s'", modname, name); return NULL; } p = plugin_new(name); if (!init(srv, p)) { ERROR(srv, "Couldn't load plugin '%s' for module '%s': init failed", name, modname); li_plugin_free(srv, p); return NULL; } g_ptr_array_add(sm->plugins, p); return p; }
gboolean mod_expire_free(liModules *mods, liModule *mod) { if (mod->config) li_plugin_free(mods->main, mod->config); return TRUE; }
liPlugin *li_plugin_register(liServer *srv, const gchar *name, liPluginInitCB init, gpointer userdata) { liPlugin *p; liServerState s; if (!init) { ERROR(srv, "Plugin '%s' needs an init function", name); return NULL; } s = g_atomic_int_get(&srv->state); if (LI_SERVER_INIT != s) { ERROR(srv, "Cannot register plugin '%s' after server was started", name); return NULL; } if (g_hash_table_lookup(srv->plugins, name)) { ERROR(srv, "Plugin '%s' already registered", name); return NULL; } p = plugin_new(name); p->id = g_hash_table_size(srv->plugins); g_hash_table_insert(srv->plugins, (gchar*) p->name, p); init(srv, p, userdata); p->opt_base_index = g_hash_table_size(srv->options); p->optptr_base_index = g_hash_table_size(srv->optionptrs); if (p->options) { size_t i; liServerOption *so; const liPluginOption *po; for (i = 0; (po = &p->options[i])->name; i++) { if (!check_name_free(srv, p, po->name, TRUE, TRUE)) goto fail; so = g_slice_new0(liServerOption); so->type = po->type; so->parse_option = po->parse_option; so->index = g_hash_table_size(srv->options); so->module_index = i; so->p = p; so->default_value = po->default_value; g_hash_table_insert(srv->options, (gchar*) po->name, so); plugin_load_default_option(srv, so, po->name); } } if (p->optionptrs) { size_t i; liServerOptionPtr *so; const liPluginOptionPtr *po; for (i = 0; (po = &p->optionptrs[i])->name; i++) { if (!check_name_free(srv, p, po->name, TRUE, TRUE)) goto fail; so = g_slice_new0(liServerOptionPtr); so->type = po->type; so->parse_option = po->parse_option; so->free_option = po->free_option; so->index = g_hash_table_size(srv->optionptrs); so->module_index = i; so->p = p; so->default_value = po->default_value; g_hash_table_insert(srv->optionptrs, (gchar*) po->name, so); plugin_load_default_optionptr(srv, so, po->name); } } if (p->actions) { size_t i; liServerAction *sa; const liPluginAction *pa; for (i = 0; (pa = &p->actions[i])->name; i++) { if (!check_name_free(srv, p, pa->name, FALSE, TRUE)) goto fail; sa = g_slice_new0(liServerAction); sa->create_action = pa->create_action; sa->p = p; sa->userdata = pa->userdata; g_hash_table_insert(srv->actions, (gchar*) pa->name, sa); } } if (p->setups) { size_t i; liServerSetup *ss; const liPluginSetup *ps; for (i = 0; (ps = &p->setups[i])->name; i++) { if (!check_name_free(srv, p, ps->name, TRUE, FALSE)) goto fail; ss = g_slice_new0(liServerSetup); ss->setup = ps->setup; ss->p = p; ss->userdata = ps->userdata; g_hash_table_insert(srv->setups, (gchar*) ps->name, ss); } } return p; fail: li_plugin_free(srv, p); return NULL; }
gboolean mod_cache_disk_etag_free(liModules *mods, liModule *mod) { if (mod->config) li_plugin_free(mods->main, mod->config); return TRUE; }