summaryrefslogtreecommitdiffstats
path: root/src/manager.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2008-12-22 19:33:41 -0300
committerJohan Hedberg <johan.hedberg@nokia.com>2008-12-22 11:36:21 +0200
commitad37d886cc54a9a975f0f5322165bbb2855dac7f (patch)
tree7958db7c3960c9ab35a4a886cc3fc92335ec9d1b /src/manager.c
parent2310cdaf70c36422a95c0b1832decf86deb894bf (diff)
Cleanup adapters on exit.
When bluetoothd is terminated any remaining registered adapters should be unregistered (including proper D-Bus signal emition) and have their drivers removed. The adapters should also be brought down unless they were already up upon initialization.
Diffstat (limited to 'src/manager.c')
-rw-r--r--src/manager.c90
1 files changed, 46 insertions, 44 deletions
diff --git a/src/manager.c b/src/manager.c
index f9263ae8..b0ba429c 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -326,8 +326,52 @@ dbus_bool_t manager_init(DBusConnection *conn, const char *path)
NULL, NULL, NULL);
}
+static void manager_update_adapters(void)
+{
+ GSList *list;
+ char **array;
+ int i;
+
+ array = g_new0(char *, g_slist_length(adapters) + 1);
+ for (i = 0, list = adapters; list; list = list->next, i++) {
+ struct btd_adapter *adapter = list->data;
+ array[i] = (char *) adapter_get_path(adapter);
+ }
+
+ emit_array_property_changed(connection, "/",
+ MANAGER_INTERFACE, "Adapters",
+ DBUS_TYPE_OBJECT_PATH, &array);
+
+ g_free(array);
+}
+
+static void manager_remove_adapter(struct btd_adapter *adapter)
+{
+ uint16_t dev_id = adapter_get_dev_id(adapter);
+ const gchar *path = adapter_get_path(adapter);
+
+ manager_update_adapters();
+
+ g_dbus_emit_signal(connection, "/",
+ MANAGER_INTERFACE, "AdapterRemoved",
+ DBUS_TYPE_OBJECT_PATH, &path,
+ DBUS_TYPE_INVALID);
+
+ if (default_adapter_id == dev_id || default_adapter_id < 0) {
+ int new_default = hci_get_route(NULL);
+
+ manager_set_default_adapter(new_default);
+ }
+
+ adapters = g_slist_remove(adapters, adapter);
+ adapter_remove(adapter);
+}
+
void manager_cleanup(DBusConnection *conn, const char *path)
{
+ g_slist_foreach(adapters, (GFunc) manager_remove_adapter, NULL);
+ g_slist_free(adapters);
+
g_dbus_unregister_interface(conn, "/", MANAGER_INTERFACE);
}
@@ -403,25 +447,6 @@ GSList *manager_get_adapters(void)
return adapters;
}
-static void manager_update_adapters(void)
-{
- GSList *list;
- char **array;
- int i;
-
- array = g_new0(char *, g_slist_length(adapters) + 1);
- for (i = 0, list = adapters; list; list = list->next, i++) {
- struct btd_adapter *adapter = list->data;
- array[i] = (char *) adapter_get_path(adapter);
- }
-
- emit_array_property_changed(connection, "/",
- MANAGER_INTERFACE, "Adapters",
- DBUS_TYPE_OBJECT_PATH, &array);
-
- g_free(array);
-}
-
static void manager_add_adapter(struct btd_adapter *adapter)
{
const gchar *path = adapter_get_path(adapter);
@@ -442,30 +467,9 @@ static void manager_add_adapter(struct btd_adapter *adapter)
manager_update_adapters();
}
-static void manager_remove_adapter(struct btd_adapter *adapter)
-{
- uint16_t dev_id = adapter_get_dev_id(adapter);
- const gchar *path = adapter_get_path(adapter);
-
- manager_update_adapters();
-
- g_dbus_emit_signal(connection, "/",
- MANAGER_INTERFACE, "AdapterRemoved",
- DBUS_TYPE_OBJECT_PATH, &path,
- DBUS_TYPE_INVALID);
-
- if (default_adapter_id == dev_id || default_adapter_id < 0) {
- int new_default = hci_get_route(NULL);
-
- manager_set_default_adapter(new_default);
- }
-
- adapters = g_slist_remove(adapters, adapter);
-}
-
-int manager_register_adapter(int id)
+int manager_register_adapter(int id, gboolean devup)
{
- struct btd_adapter *adapter = adapter_create(connection, id);
+ struct btd_adapter *adapter = adapter_create(connection, id, devup);
if (!adapter)
return -1;
@@ -490,8 +494,6 @@ int manager_unregister_adapter(int id)
manager_remove_adapter(adapter);
- adapter_remove(adapter);
-
return 0;
}