GList *list;
} *pls;
-struct plugin *
-plugin_new(char *plugin)
+static struct plugin *
+plugin_new_from_path(char *plugin)
{
#ifdef USE_PLUGINS
struct plugin *ret;
if (! g_module_supported()) {
- return NULL;
+ return NULL;
}
ret=g_new0(struct plugin, 1);
ret->name=g_strdup(plugin);
return ret;
}
-void
-plugins_add_path(struct plugins *pls, struct attr **attrs) {
-#ifdef USE_PLUGINS
+struct plugin *
+plugin_new(struct attr *parent, struct attr **attrs) {
+#ifdef USE_PLUGINS
struct attr *path_attr, *attr;
struct file_wordexp *we;
int active=1; // default active
int i, count;
char **array;
char *name;
- struct plugin *pl;
+ struct plugin *pl=NULL;
+ struct plugins *pls=NULL;
+
+ if (parent)
+ pls=parent->u.plugins;
if (! (path_attr=attr_search(attrs, NULL, attr_path))) {
dbg(0,"missing path\n");
- return;
+ return NULL;
}
if ( (attr=attr_search(attrs, NULL, attr_active))) {
active=attr->u.num;
we=file_wordexp_new(path_attr->u.str);
count=file_wordexp_get_count(we);
array=file_wordexp_get_array(we);
- for (i = 0 ; i < count ; i++) {
- name=array[i];
- if (! (pl=g_hash_table_lookup(pls->hash, name))) {
- pl=plugin_new(name);
- if (! pl) {
- dbg(0,"failed to create plugin '%s'\n", name);
- continue;
+ dbg(2,"expanded to %d words\n",count);
+ if (count != 1 || file_exists(array[0])) {
+ for (i = 0 ; i < count ; i++) {
+ name=array[i];
+ dbg(2,"name[%d]='%s'\n", i, name);
+ if (! (pls && (pl=g_hash_table_lookup(pls->hash, name)))) {
+ pl=plugin_new_from_path(name);
+ if (! pl) {
+ dbg(0,"failed to create plugin '%s'\n", name);
+ continue;
+ }
+ if (pls) {
+ g_hash_table_insert(pls->hash, plugin_get_name(pl), pl);
+ pls->list=g_list_append(pls->list, pl);
+ }
+ } else {
+ if (pls) {
+ pls->list=g_list_remove(pls->list, pl);
+ pls->list=g_list_append(pls->list, pl);
+ }
+ }
+ plugin_set_active(pl, active);
+ plugin_set_lazy(pl, lazy);
+ plugin_set_ondemand(pl, ondemand);
+ if (!pls && active) {
+ if (!plugin_load(pl))
+ plugin_set_active(pl, 0);
+ else
+ plugin_call_init(pl);
}
- g_hash_table_insert(pls->hash, plugin_get_name(pl), pl);
- pls->list=g_list_append(pls->list, pl);
- } else {
- pls->list=g_list_remove(pls->list, pl);
- pls->list=g_list_append(pls->list, pl);
}
- plugin_set_active(pl, active);
- plugin_set_lazy(pl, lazy);
- plugin_set_ondemand(pl, ondemand);
+ file_wordexp_destroy(we);
}
- file_wordexp_destroy(we);
+ return pl;
#endif
}
if (!pls)
return NULL;
lpls=pls->list;
- if(!g_ascii_strcasecmp(type_name, "map"))
- type_name="data";
filename=g_strjoin("", "lib", type_name, "_", name, NULL);
corename=g_strjoin("", "lib", type_name, "_", "core", NULL);
while (lpls) {
mod_name++;
else
mod_name=pl->name;
- if (!g_ascii_strncasecmp(mod_name, filename, strlen(filename)) || !g_ascii_strncasecmp(mod_name, corename, strlen(filename))) {
+ dbg(2,"compare '%s' with '%s'\n", mod_name, filename);
+ if (!g_ascii_strncasecmp(mod_name, filename, strlen(filename)) || !g_ascii_strncasecmp(mod_name, corename, strlen(corename))) {
dbg(1, "Loading module \"%s\"\n",pl->name) ;
if (plugin_get_active(pl))
if (!plugin_load(pl))