# HG changeset patch # User Mark Doliner # Date 1130906500 0 # Node ID 2b9ca8861ca5007798d63f8d1bf0d0ec8b1f79cd # Parent 47e1723a89d7b8705974fb6c5963a013f8c8a8e1 [gaim-migrate @ 14241] sf patch #1343759, from Evan Schoenberg Compilation error: A function depending on GAIM_PLUGINS-only functions wasn't properly guarded with #ifdef GAIM_PLUGINS / #endif And some other changes to make things better when using static PRPLs committer: Tailor Script diff -r 47e1723a89d7 -r 2b9ca8861ca5 src/plugin.c --- a/src/plugin.c Wed Nov 02 04:32:28 2005 +0000 +++ b/src/plugin.c Wed Nov 02 04:41:40 2005 +0000 @@ -50,10 +50,12 @@ static GList *search_paths = NULL; static GList *plugins = NULL; +static GList *loaded_plugins = NULL; +static GList *protocol_plugins = NULL; +#ifdef GAIM_PLUGINS static GList *load_queue = NULL; -static GList *loaded_plugins = NULL; static GList *plugin_loaders = NULL; -static GList *protocol_plugins = NULL; +#endif static void (*probe_cb)(void *) = NULL; static void *probe_cb_data = NULL; @@ -63,6 +65,7 @@ static void *unload_cb_data = NULL; #ifdef GAIM_PLUGINS + static gboolean has_file_extension(const char *filename, const char *ext) { @@ -214,7 +217,7 @@ * plugins being added to the global name space. * * G_MODULE_BIND_LOCAL was added in glib 2.3.3. - * TODO: What are we going to do about that? + * TODO: I guess there's nothing we can do about that? */ #if GLIB_CHECK_VERSION(2,3,3) plugin->handle = g_module_open(filename, G_MODULE_BIND_LOCAL); @@ -236,12 +239,17 @@ if (!g_module_symbol(plugin->handle, "gaim_init_plugin", &unpunned)) { - g_module_close(plugin->handle); - plugin->handle = NULL; + gaim_debug_error("plugins", "%s is not usable because the " + "'gaim_init_plugin' symbol could not be " + "found. Does the plugin call the " + "GAIM_INIT_PLUGIN() macro?\n", plugin->path); + g_module_close(plugin->handle); error = g_module_error(); - gaim_debug_error("plugins", "%s is unloadable: %s\n", - plugin->path, error ? error : "Unknown error."); + if (error != NULL) + gaim_debug_error("plugins", "Error closing module %s: %s\n", + plugin->path, error); + plugin->handle = NULL; gaim_plugin_destroy(plugin); @@ -425,6 +433,8 @@ g_return_val_if_fail(plugin != NULL, FALSE); loaded_plugins = g_list_remove(loaded_plugins, plugin); + if ((plugin->info != NULL) && GAIM_IS_PROTOCOL_PLUGIN(plugin)) + protocol_plugins = g_list_remove(protocol_plugins, plugin); g_return_val_if_fail(gaim_plugin_is_loaded(plugin), FALSE); @@ -1065,6 +1075,7 @@ continue; } + /* Make sure we don't load two PRPLs with the same name? */ if (gaim_find_prpl(plugin->info->id)) { /* Nothing to see here--move along, move along */ @@ -1080,20 +1091,6 @@ if (probe_cb != NULL) probe_cb(probe_cb_data); - -#else /* GAIM_PLUGINS */ - /* We just need to populate the protocol_plugins list with all the PRPLs */ - GList *cur; - GaimPlugin *plugin; - - for (cur = plugins; cur != NULL; cur = cur->next) - { - plugin = cur->data; - if (plugin->info->type == GAIM_PLUGIN_PROTOCOL) - protocol_plugins = g_list_insert_sorted(protocol_plugins, plugin, - (GCompareFunc)compare_prpl); - } - #endif /* GAIM_PLUGINS */ } @@ -1134,8 +1131,14 @@ } } +#ifdef GAIM_PLUGINS /* This plugin should be probed and maybe loaded--add it to the queue */ load_queue = g_list_append(load_queue, plugin); +#else + if (plugin->info->type == GAIM_PLUGIN_PROTOCOL) + protocol_plugins = g_list_insert_sorted(protocol_plugins, plugin, + (GCompareFunc)compare_prpl); +#endif plugins = g_list_append(plugins, plugin); @@ -1237,6 +1240,7 @@ GaimPlugin * gaim_plugins_find_with_basename(const char *basename) { +#ifdef GAIM_PLUGINS GaimPlugin *plugin; GList *l; char *basename_no_ext; @@ -1263,6 +1267,7 @@ } g_free(basename_no_ext); +#endif /* GAIM_PLUGINS */ return NULL; } diff -r 47e1723a89d7 -r 2b9ca8861ca5 src/plugin.h --- a/src/plugin.h Wed Nov 02 04:32:28 2005 +0000 +++ b/src/plugin.h Wed Nov 02 04:41:40 2005 +0000 @@ -573,7 +573,10 @@ GList *gaim_plugins_get_loaded(void); /** - * Returns a list of all protocol plugins. + * Returns a list of all valid protocol plugins. A protocol + * plugin is considered invalid if it does not contain the call + * to the GAIM_INIT_PLUGIN() macro, or if it was compiled + * against an incompatable API version. * * @return A list of all protocol plugins. */