/* * plugin_load() * * ³aduje wtyczkê o podanej nazwie. * * 0/-1 */ int plugin_load(const char *name, int prio, int quiet) { #ifdef SHARED_LIBS const gchar *env_ekg_plugins_path = NULL; char *init = NULL; gchar *lib; gchar *libname; GModule *plugin = NULL; #endif plugin_t *pl; int (*plugin_init)() = NULL; g_assert(name); if (plugin_find(name)) { printq("plugin_already_loaded", name); return -1; } #ifdef SHARED_LIBS libname = g_strdup_printf("%s.la", name); if ((env_ekg_plugins_path = g_getenv("EKG_PLUGINS_PATH"))) { lib = g_build_filename(env_ekg_plugins_path, libname, NULL); plugin = ekg2_dlopen(lib); g_free(lib); if (!plugin) { lib = g_build_filename(env_ekg_plugins_path, name, libname, NULL); plugin = ekg2_dlopen(lib); g_free(lib); } } /* The following lets ekg2 load plugins when it is run directly from * the source tree, without installation. This can be beneficial when * developing the program, or for less knowlegeable users, who don't * know how to or cannot for some other reason use installation prefix * to install in their home directory. It might be also useful * for win32-style installs. */ if (!plugin && rel_plugin_dir) { lib = g_build_filename(rel_plugin_dir, "plugins", name, libname, NULL); plugin = ekg2_dlopen(lib); g_free(lib); } if (!plugin) { lib = g_build_filename(PLUGINDIR, libname, NULL); plugin = ekg2_dlopen(lib); g_free(lib); } g_free(libname); /* prefer shared plugins */ if (plugin) { init = g_strdup_printf("%s_plugin_init", name); plugin_init = ekg2_dlsym(plugin, init); g_free(init); } #endif /* SHARED_LIBS */ #ifdef STATIC_LIBS /* if no shared plugin, fallback to the static one */ if (!plugin_init) { STATIC_PLUGIN_DECLS STATIC_PLUGIN_CALLS if (plugin_init) debug_ok("[plugin] statically compiled in: %s\n", name); }
/* * plugin_load() * * ³aduje wtyczkê o podanej nazwie. * * 0/-1 */ int plugin_load(const char *name, int prio, int quiet) { #ifdef SHARED_LIBS char lib[PATH_MAX]; char *env_ekg_plugins_path = NULL; char *init = NULL; #endif plugin_t *pl; void *plugin = NULL; int (*plugin_init)() = NULL; if (!name) return -1; if (plugin_find(name)) { printq("plugin_already_loaded", name); return -1; } #ifdef SHARED_LIBS #ifndef NO_POSIX_SYSTEM #ifdef SCONS # define DOTLIBS "" #else # define DOTLIBS ".libs/" #endif if ((env_ekg_plugins_path = getenv("EKG_PLUGINS_PATH"))) { if (snprintf(lib, sizeof(lib), "%s/%s.so", env_ekg_plugins_path, name) < sizeof(lib)) plugin = ekg2_dlopen(lib); if (!plugin && (snprintf(lib, sizeof(lib), "%s/%s/" DOTLIBS "%s.so", env_ekg_plugins_path, name, name) < sizeof(lib))) plugin = ekg2_dlopen(lib); } #ifndef SKIP_RELATIVE_PLUGINS_DIR /* The following lets ekg2 load plugins when it is run directly from * the source tree, without installation. This can be beneficial when * developing the program, or for less knowlegeable users, who don't * know how to or cannot for some other reason use installation prefix * to install in their home directory. However this impses a security * risk if the program installed in the system directory is run in * untrusted $CWD or when $CWD/../plugins is untrusted. * * TODO(porridge,darkjames): This can be fixed by having a wrapper * script in the source tree to run ekg/.libs/ekg2 with * EKG_PLUGINS_PATH set appropriately. */ if (!plugin) { if (snprintf(lib, sizeof(lib), "plugins/%s/" DOTLIBS "%s.so", name, name) < sizeof(lib)) plugin = ekg2_dlopen(lib); } if (!plugin) { if (snprintf(lib, sizeof(lib), "../plugins/%s/" DOTLIBS "%s.so", name, name) < sizeof(lib)) plugin = ekg2_dlopen(lib); } #endif if (!plugin) { if (snprintf(lib, sizeof(lib), "%s/%s.so", PLUGINDIR, name) < sizeof(lib)) plugin = ekg2_dlopen(lib); } #else /* NO_POSIX_SYSTEM */ if (!plugin) { if (snprintf(lib, sizeof(lib), "c:\\ekg2\\plugins\\%s.dll", name) < sizeof(lib)) plugin = ekg2_dlopen(lib); } #endif /* SHARED_LIBS */ if (!plugin) { printq("plugin_doesnt_exist", name); return -1; } #endif #ifdef STATIC_LIBS #ifndef SCONS /* first let's try to load static plugin... */ extern int jabber_plugin_init(int prio); extern int irc_plugin_init(int prio); extern int gtk_plugin_init(int prio); debug("searching for name: %s in STATICLIBS: %s\n", name, STATIC_LIBS); if (!xstrcmp(name, "jabber")) plugin_init = &jabber_plugin_init; if (!xstrcmp(name, "irc")) plugin_init = &irc_plugin_init; if (!xstrcmp(name, "gtk")) plugin_init = >k_plugin_init; // if (!xstrcmp(name, "miranda")) plugin_init = &miranda_plugin_init; #else debug_function("plugin_load(), trying to find static plugin '%s'\n", name); void *plugin_load_static(const char *name); /* autogenerated by scons */ plugin_init = plugin_load_static(name); #endif #endif #ifdef SHARED_LIBS if (!plugin_init) { # ifdef EKG2_WIN32_HELPERS void (*plugin_preinit)(void *); char *preinit = saprintf("win32_plugin_init"); if (!(plugin_preinit = ekg2_dlsym(plugin, preinit))) { debug("NO_POSIX_SYSTEM, PLUGIN:%s NOT COMPILATED WITH EKG2_WIN32_SHARED_LIB?!\n", name); printq("plugin_incorrect", name); xfree(preinit); return -1; } xfree(preinit); plugin_preinit(&win32_helper); # endif /* than if we don't have static plugin... let's try to load it dynamicly */ init = saprintf("%s_plugin_init", name); if (!(plugin_init = ekg2_dlsym(plugin, init))) { printq("plugin_incorrect", name); ekg2_dlclose(plugin); xfree(init); return -1; } xfree(init); } #endif if (!plugin_init) { printq("plugin_doesnt_exist", name); return -1; } if (plugin_init(prio) == -1) { printq("plugin_not_initialized", name); ekg2_dlclose(plugin); return -1; } if ((pl = plugin_find(name))) { pl->dl = plugin; } else { debug_error("plugin_load() plugin_find(%s) not found.\n", name); /* It's FATAL */ } query_emit_id(pl, SET_VARS_DEFAULT); printq("plugin_loaded", name); if (!in_autoexec) { const char *tmp; in_autoexec = 1; if ((tmp = prepare_pathf("config-%s", name))) config_read(tmp); if ((pl->pclass == PLUGIN_PROTOCOL) && (tmp = prepare_pathf("sessions-%s", name))) session_read(tmp); if (pl) query_emit_id(pl, CONFIG_POSTINIT); in_autoexec = 0; config_changed = 1; } return 0; }