From ad37d886cc54a9a975f0f5322165bbb2855dac7f Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 22 Dec 2008 19:33:41 -0300 Subject: 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. --- src/adapter.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'src/adapter.c') diff --git a/src/adapter.c b/src/adapter.c index 5eaf729a..dc6f8e9c 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -120,6 +120,7 @@ struct btd_adapter { gboolean pairable; /* pairable state */ gboolean initialized; + gboolean already_up; /* adapter was already up on init */ }; static void adapter_set_pairable_timeout(struct btd_adapter *adapter, @@ -2912,7 +2913,8 @@ static void adapter_free(gpointer user_data) return; } -struct btd_adapter *adapter_create(DBusConnection *conn, int id) +struct btd_adapter *adapter_create(DBusConnection *conn, int id, + gboolean devup) { char path[MAX_PATH_LENGTH]; struct btd_adapter *adapter; @@ -2933,6 +2935,7 @@ struct btd_adapter *adapter_create(DBusConnection *conn, int id) adapter->dev_id = id; adapter->state |= RESOLVE_NAME; adapter->path = g_strdup(path); + adapter->already_up = devup; if (!g_dbus_register_interface(conn, path, ADAPTER_INTERFACE, adapter_methods, adapter_signals, NULL, @@ -2958,6 +2961,17 @@ void adapter_remove(struct btd_adapter *adapter) device_remove(connection, l->data); g_slist_free(adapter->devices); + /* Return adapter to down state if it was not up on init */ + if (adapter->up && !adapter->already_up) { + int dd = hci_open_dev(adapter->dev_id); + if (dd < 0) + goto done; + + ioctl(dd, HCIDEVDOWN, adapter->dev_id); + hci_close_dev(dd); + } + +done: g_dbus_unregister_interface(connection, path, ADAPTER_INTERFACE); g_free(path); -- cgit