GSList *rdeps;
gchar *error;
gboolean unloaded_hidden;
+ gboolean in_prefix_dir;
};
const gchar *plugin_feature_names[] =
return strcmp(filename, plugin->filename);
}
+static gboolean plugin_filename_is_standard_dir(const gchar *filename) {
+ return strncmp(filename, get_plugin_dir(), strlen(get_plugin_dir())) == 0;
+}
+
+static gchar * plugin_canonical_name(const Plugin *plugin)
+{
+ if (plugin->in_prefix_dir == TRUE) {
+ if (plugin_filename_is_standard_dir(plugin->filename) == TRUE) {
+ gchar *plugin_name = g_path_get_basename(plugin->filename);
+ return plugin_name;
+ }
+ }
+ return g_strdup(plugin->filename);
+}
+
void plugin_save_list(void)
{
gchar *rcpath, *block;
if (plugin->unloaded_hidden)
continue;
- if (!strcmp(plugin->type(), type_cur->data))
- if (fprintf(pfile->fp, "%s\n", plugin->filename) < 0)
+ if (!strcmp(plugin->type(), type_cur->data)) {
+ gchar * name = plugin_canonical_name(plugin);
+ int err = fprintf(pfile->fp, "%s\n", name);
+ g_free(name);
+ if (err < 0)
goto revert;
+ }
}
for (plugin_cur = unloaded_plugins; plugin_cur != NULL; plugin_cur = g_slist_next(plugin_cur)) {
plugin = (Plugin *) plugin_cur->data;
if (plugin->unloaded_hidden)
continue;
- if (!strcmp(plugin->type(), type_cur->data))
- if (fprintf(pfile->fp, "%s\n", plugin->filename) < 0)
+ if (!strcmp(plugin->type(), type_cur->data)) {
+ gchar * name = plugin_canonical_name(plugin);
+ int err = fprintf(pfile->fp, "%s\n", name);
+ g_free(name);
+ if (err < 0)
goto revert;
+ }
}
if (fprintf(pfile->fp, "\n") < 0)
goto revert;
fclose(fp);
return -1;
}
+ dep_plugin->in_prefix_dir = TRUE;
}
g_free(path);
if (!g_slist_find_custom(dep_plugin->rdeps,
return FALSE;
}
-static gboolean plugin_filename_is_standard_dir(const gchar *filename) {
- return strncmp(filename, get_plugin_dir(), strlen(get_plugin_dir())) == 0;
-}
-
static Plugin *plugin_load_in_default_dir(const gchar *filename, gchar **error)
{
Plugin *plugin = NULL;
if (plugin) {
g_free(*error);
*error = NULL;
+ plugin->in_prefix_dir = TRUE;
+
} else {
g_free(default_error);
}
return plugin_load_in_default_dir(filename, error);
else
return NULL;
- }
+ } else {
+ plugin->in_prefix_dir = FALSE;
+ }
init_plugin:
if (!g_module_symbol(plugin->module, "plugin_name", &plugin_name) ||
}
+static void replace_old_plugin_name(gchar *plugin_name)
+{
+ gchar *old_name_end = g_strconcat("_plugin.", G_MODULE_SUFFIX, NULL);
+ gchar *matches = strstr(plugin_name, old_name_end);
+
+ if (!matches) {
+ g_free(old_name_end);
+ return;
+ } else if (plugin_name + strlen(plugin_name) != matches + strlen(matches)) {
+ g_free(old_name_end);
+ return;
+ } else {
+ gchar *new_name_end = g_strconcat(".", G_MODULE_SUFFIX, NULL);
+ int offset = strlen(plugin_name) - strlen(old_name_end);
+
+ debug_print("Replacing old plugin name %s\n", plugin_name);
+
+ strncpy(plugin_name + offset, new_name_end, strlen(old_name_end) - 1);
+ debug_print(" to %s\n", plugin_name);
+ }
+}
+
void plugin_load_all(const gchar *type)
{
gchar *rcpath;
break;
g_strstrip(buf);
+ replace_old_plugin_name(buf);
+
if ((buf[0] != '\0') && (plugin_load(buf, &error) == NULL)) {
g_warning("plugin loading error: %s\n", error);
g_free(error);