diff options
author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2008-12-22 19:33:41 -0300 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2008-12-22 11:36:21 +0200 |
commit | ad37d886cc54a9a975f0f5322165bbb2855dac7f (patch) | |
tree | 7958db7c3960c9ab35a4a886cc3fc92335ec9d1b /src/manager.c | |
parent | 2310cdaf70c36422a95c0b1832decf86deb894bf (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.c | 90 |
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; } |