comparison src/plugin.c @ 9943:f8e395a054e2

[gaim-migrate @ 10835] this all seemed to work last night...hopefully no stray cosmic rays did anything to break it since then committer: Tailor Script <tailor@pidgin.im>
author Nathan Walp <nwalp@pidgin.im>
date Fri, 03 Sep 2004 21:21:25 +0000
parents f568b6655331
children 9fdbfe832fac
comparison
equal deleted inserted replaced
9942:3941c39ccff5 9943:f8e395a054e2
26 #include "notify.h" 26 #include "notify.h"
27 #include "prefs.h" 27 #include "prefs.h"
28 #include "prpl.h" 28 #include "prpl.h"
29 #include "request.h" 29 #include "request.h"
30 #include "signals.h" 30 #include "signals.h"
31 #include "version.h"
31 32
32 #ifdef _WIN32 33 #ifdef _WIN32
33 # define PLUGIN_EXT ".dll" 34 # define PLUGIN_EXT ".dll"
34 #else 35 #else
35 #ifdef __hpux 36 #ifdef __hpux
237 gaim_plugin_destroy(plugin); 238 gaim_plugin_destroy(plugin);
238 239
239 return NULL; 240 return NULL;
240 } 241 }
241 242
242 if (plugin->info->api_version != GAIM_PLUGIN_API_VERSION) 243 if (plugin->info->magic != GAIM_PLUGIN_MAGIC ||
243 { 244 plugin->info->major_version != GAIM_MAJOR_VERSION ||
244 gaim_debug(GAIM_DEBUG_ERROR, "plugins", "%s is unloadable: API version mismatch %d (need %d)\n", 245 plugin->info->minor_version > GAIM_MINOR_VERSION)
245 plugin->path, plugin->info->api_version, GAIM_PLUGIN_API_VERSION); 246 {
247 gaim_debug(GAIM_DEBUG_ERROR, "plugins", "%s is unloadable: API version mismatch %d.%d.x (need %d.%d.x)\n",
248 plugin->path, plugin->info->major_version, plugin->info->minor_version, GAIM_MAJOR_VERSION, GAIM_MINOR_VERSION);
246 gaim_plugin_destroy(plugin); 249 gaim_plugin_destroy(plugin);
247 return NULL; 250 return NULL;
248 } 251 }
249 252
250 return plugin; 253 return plugin;
477 plugins = g_list_remove(plugins, plugin); 480 plugins = g_list_remove(plugins, plugin);
478 481
479 if (load_queue != NULL) 482 if (load_queue != NULL)
480 load_queue = g_list_remove(load_queue, plugin); 483 load_queue = g_list_remove(load_queue, plugin);
481 484
485 /* true, this may leak a little memory if there is a major version
486 * mismatch, but it's a lot better than trying to free something
487 * we shouldn't, and crashing while trying to load an old plugin */
488 if(plugin->info == NULL || plugin->info->magic != GAIM_PLUGIN_MAGIC ||
489 plugin->info->major_version != GAIM_MAJOR_VERSION) {
490 if(plugin->handle)
491 g_module_close(plugin->handle);
492 g_free(plugin);
493 return;
494 }
495
482 if (plugin->info != NULL && plugin->info->dependencies != NULL) 496 if (plugin->info != NULL && plugin->info->dependencies != NULL)
483 g_list_free(plugin->info->dependencies); 497 g_list_free(plugin->info->dependencies);
484 498
485 if (plugin->native_plugin) 499 if (plugin->native_plugin)
486 { 500 {
490 GList *exts, *l, *next_l; 504 GList *exts, *l, *next_l;
491 GaimPlugin *p2; 505 GaimPlugin *p2;
492 506
493 loader_info = GAIM_PLUGIN_LOADER_INFO(plugin); 507 loader_info = GAIM_PLUGIN_LOADER_INFO(plugin);
494 508
495 if (loader_info != NULL && plugin->info->api_version >= 3 && 509 if (loader_info != NULL && loader_info->exts != NULL)
496 loader_info->exts != NULL)
497 { 510 {
498 for (exts = GAIM_PLUGIN_LOADER_INFO(plugin)->exts; 511 for (exts = GAIM_PLUGIN_LOADER_INFO(plugin)->exts;
499 exts != NULL; 512 exts != NULL;
500 exts = exts->next) { 513 exts = exts->next) {
501 514
969 { 982 {
970 GaimPluginLoaderInfo *loader_info; 983 GaimPluginLoaderInfo *loader_info;
971 984
972 loader_info = GAIM_PLUGIN_LOADER_INFO(plugin); 985 loader_info = GAIM_PLUGIN_LOADER_INFO(plugin);
973 986
974 if (loader_info == NULL || 987 if (loader_info == NULL)
975 loader_info->api_version != GAIM_LOADER_API_VERSION)
976 { 988 {
977 gaim_debug(GAIM_DEBUG_ERROR, "plugins", "%s is unloadable: API version mismatch %d (need %d)\n", 989 gaim_debug(GAIM_DEBUG_ERROR, "plugins", "%s is unloadable\n",
978 plugin->path, loader_info->api_version, GAIM_LOADER_API_VERSION); 990 plugin->path);
979 return FALSE; 991 return FALSE;
980 } 992 }
981 993
982 load_queue = g_list_append(load_queue, plugin); 994 load_queue = g_list_append(load_queue, plugin);
983 } 995 }
985 { 997 {
986 GaimPluginProtocolInfo *prpl_info; 998 GaimPluginProtocolInfo *prpl_info;
987 999
988 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(plugin); 1000 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(plugin);
989 1001
990 if (prpl_info == NULL || 1002 if (prpl_info == NULL)
991 prpl_info->api_version != GAIM_PRPL_API_VERSION)
992 { 1003 {
993 gaim_debug(GAIM_DEBUG_ERROR, "plugins", "%s is unloadable: API version mismatch %d (need %d)\n", 1004 gaim_debug(GAIM_DEBUG_ERROR, "plugins", "%s is unloadable\n",
994 plugin->path, prpl_info->api_version, GAIM_PRPL_API_VERSION); 1005 plugin->path);
995 return FALSE; 1006 return FALSE;
996 } 1007 }
997 1008
998 load_queue = g_list_append(load_queue, plugin); 1009 load_queue = g_list_append(load_queue, plugin);
999 } 1010 }