comparison src/plugin.c @ 11950:2b9ca8861ca5

[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 <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Wed, 02 Nov 2005 04:41:40 +0000
parents d1d5f27de95d
children d8787960e398
comparison
equal deleted inserted replaced
11949:47e1723a89d7 11950:2b9ca8861ca5
48 48
49 } GaimPluginIpcCommand; 49 } GaimPluginIpcCommand;
50 50
51 static GList *search_paths = NULL; 51 static GList *search_paths = NULL;
52 static GList *plugins = NULL; 52 static GList *plugins = NULL;
53 static GList *loaded_plugins = NULL;
54 static GList *protocol_plugins = NULL;
55 #ifdef GAIM_PLUGINS
53 static GList *load_queue = NULL; 56 static GList *load_queue = NULL;
54 static GList *loaded_plugins = NULL;
55 static GList *plugin_loaders = NULL; 57 static GList *plugin_loaders = NULL;
56 static GList *protocol_plugins = NULL; 58 #endif
57 59
58 static void (*probe_cb)(void *) = NULL; 60 static void (*probe_cb)(void *) = NULL;
59 static void *probe_cb_data = NULL; 61 static void *probe_cb_data = NULL;
60 static void (*load_cb)(GaimPlugin *, void *) = NULL; 62 static void (*load_cb)(GaimPlugin *, void *) = NULL;
61 static void *load_cb_data = NULL; 63 static void *load_cb_data = NULL;
62 static void (*unload_cb)(GaimPlugin *, void *) = NULL; 64 static void (*unload_cb)(GaimPlugin *, void *) = NULL;
63 static void *unload_cb_data = NULL; 65 static void *unload_cb_data = NULL;
64 66
65 #ifdef GAIM_PLUGINS 67 #ifdef GAIM_PLUGINS
68
66 static gboolean 69 static gboolean
67 has_file_extension(const char *filename, const char *ext) 70 has_file_extension(const char *filename, const char *ext)
68 { 71 {
69 int len, extlen; 72 int len, extlen;
70 73
212 /* 215 /*
213 * We pass G_MODULE_BIND_LOCAL here to prevent symbols from 216 * We pass G_MODULE_BIND_LOCAL here to prevent symbols from
214 * plugins being added to the global name space. 217 * plugins being added to the global name space.
215 * 218 *
216 * G_MODULE_BIND_LOCAL was added in glib 2.3.3. 219 * G_MODULE_BIND_LOCAL was added in glib 2.3.3.
217 * TODO: What are we going to do about that? 220 * TODO: I guess there's nothing we can do about that?
218 */ 221 */
219 #if GLIB_CHECK_VERSION(2,3,3) 222 #if GLIB_CHECK_VERSION(2,3,3)
220 plugin->handle = g_module_open(filename, G_MODULE_BIND_LOCAL); 223 plugin->handle = g_module_open(filename, G_MODULE_BIND_LOCAL);
221 #else 224 #else
222 plugin->handle = g_module_open(filename, 0); 225 plugin->handle = g_module_open(filename, 0);
234 } 237 }
235 238
236 if (!g_module_symbol(plugin->handle, "gaim_init_plugin", 239 if (!g_module_symbol(plugin->handle, "gaim_init_plugin",
237 &unpunned)) 240 &unpunned))
238 { 241 {
242 gaim_debug_error("plugins", "%s is not usable because the "
243 "'gaim_init_plugin' symbol could not be "
244 "found. Does the plugin call the "
245 "GAIM_INIT_PLUGIN() macro?\n", plugin->path);
246
239 g_module_close(plugin->handle); 247 g_module_close(plugin->handle);
248 error = g_module_error();
249 if (error != NULL)
250 gaim_debug_error("plugins", "Error closing module %s: %s\n",
251 plugin->path, error);
240 plugin->handle = NULL; 252 plugin->handle = NULL;
241
242 error = g_module_error();
243 gaim_debug_error("plugins", "%s is unloadable: %s\n",
244 plugin->path, error ? error : "Unknown error.");
245 253
246 gaim_plugin_destroy(plugin); 254 gaim_plugin_destroy(plugin);
247 255
248 return NULL; 256 return NULL;
249 } 257 }
423 { 431 {
424 #ifdef GAIM_PLUGINS 432 #ifdef GAIM_PLUGINS
425 g_return_val_if_fail(plugin != NULL, FALSE); 433 g_return_val_if_fail(plugin != NULL, FALSE);
426 434
427 loaded_plugins = g_list_remove(loaded_plugins, plugin); 435 loaded_plugins = g_list_remove(loaded_plugins, plugin);
436 if ((plugin->info != NULL) && GAIM_IS_PROTOCOL_PLUGIN(plugin))
437 protocol_plugins = g_list_remove(protocol_plugins, plugin);
428 438
429 g_return_val_if_fail(gaim_plugin_is_loaded(plugin), FALSE); 439 g_return_val_if_fail(gaim_plugin_is_loaded(plugin), FALSE);
430 440
431 gaim_debug_info("plugins", "Unloading plugin %s\n", plugin->info->name); 441 gaim_debug_info("plugins", "Unloading plugin %s\n", plugin->info->name);
432 442
1063 gaim_plugin_destroy(plugin); 1073 gaim_plugin_destroy(plugin);
1064 1074
1065 continue; 1075 continue;
1066 } 1076 }
1067 1077
1078 /* Make sure we don't load two PRPLs with the same name? */
1068 if (gaim_find_prpl(plugin->info->id)) 1079 if (gaim_find_prpl(plugin->info->id))
1069 { 1080 {
1070 /* Nothing to see here--move along, move along */ 1081 /* Nothing to see here--move along, move along */
1071 gaim_plugin_destroy(plugin); 1082 gaim_plugin_destroy(plugin);
1072 1083
1078 } 1089 }
1079 } 1090 }
1080 1091
1081 if (probe_cb != NULL) 1092 if (probe_cb != NULL)
1082 probe_cb(probe_cb_data); 1093 probe_cb(probe_cb_data);
1083
1084 #else /* GAIM_PLUGINS */
1085 /* We just need to populate the protocol_plugins list with all the PRPLs */
1086 GList *cur;
1087 GaimPlugin *plugin;
1088
1089 for (cur = plugins; cur != NULL; cur = cur->next)
1090 {
1091 plugin = cur->data;
1092 if (plugin->info->type == GAIM_PLUGIN_PROTOCOL)
1093 protocol_plugins = g_list_insert_sorted(protocol_plugins, plugin,
1094 (GCompareFunc)compare_prpl);
1095 }
1096
1097 #endif /* GAIM_PLUGINS */ 1094 #endif /* GAIM_PLUGINS */
1098 } 1095 }
1099 1096
1100 gboolean 1097 gboolean
1101 gaim_plugin_register(GaimPlugin *plugin) 1098 gaim_plugin_register(GaimPlugin *plugin)
1132 plugin->path); 1129 plugin->path);
1133 return FALSE; 1130 return FALSE;
1134 } 1131 }
1135 } 1132 }
1136 1133
1134 #ifdef GAIM_PLUGINS
1137 /* This plugin should be probed and maybe loaded--add it to the queue */ 1135 /* This plugin should be probed and maybe loaded--add it to the queue */
1138 load_queue = g_list_append(load_queue, plugin); 1136 load_queue = g_list_append(load_queue, plugin);
1137 #else
1138 if (plugin->info->type == GAIM_PLUGIN_PROTOCOL)
1139 protocol_plugins = g_list_insert_sorted(protocol_plugins, plugin,
1140 (GCompareFunc)compare_prpl);
1141 #endif
1139 1142
1140 plugins = g_list_append(plugins, plugin); 1143 plugins = g_list_append(plugins, plugin);
1141 1144
1142 return TRUE; 1145 return TRUE;
1143 } 1146 }
1235 } 1238 }
1236 1239
1237 GaimPlugin * 1240 GaimPlugin *
1238 gaim_plugins_find_with_basename(const char *basename) 1241 gaim_plugins_find_with_basename(const char *basename)
1239 { 1242 {
1243 #ifdef GAIM_PLUGINS
1240 GaimPlugin *plugin; 1244 GaimPlugin *plugin;
1241 GList *l; 1245 GList *l;
1242 char *basename_no_ext; 1246 char *basename_no_ext;
1243 char *tmp; 1247 char *tmp;
1244 1248
1261 g_free(tmp); 1265 g_free(tmp);
1262 } 1266 }
1263 } 1267 }
1264 1268
1265 g_free(basename_no_ext); 1269 g_free(basename_no_ext);
1270 #endif /* GAIM_PLUGINS */
1266 1271
1267 return NULL; 1272 return NULL;
1268 } 1273 }
1269 1274
1270 GaimPlugin * 1275 GaimPlugin *