struct connman_plugin {
void *handle;
+ gboolean active;
struct connman_plugin_desc *desc;
};
return FALSE;
plugin->handle = handle;
+ plugin->active = FALSE;
plugin->desc = desc;
- if (desc->init() < 0) {
- g_free(plugin);
- return FALSE;
- }
-
plugins = g_slist_insert_sorted(plugins, plugin, compare_priority);
return TRUE;
int __connman_plugin_init(const char *pattern, const char *exclude)
{
+ GSList *list;
GDir *dir;
const gchar *file;
gchar *filename;
g_dir_close(dir);
}
+ for (list = plugins; list; list = list->next) {
+ struct connman_plugin *plugin = list->data;
+
+ if (plugin->desc->init() < 0)
+ continue;
+
+ plugin->active = TRUE;
+ }
+
return 0;
}
for (list = plugins; list; list = list->next) {
struct connman_plugin *plugin = list->data;
- if (plugin->desc->exit)
+ if (plugin->active == TRUE && plugin->desc->exit)
plugin->desc->exit();
dlclose(plugin->handle);