summaryrefslogtreecommitdiffstats
path: root/src/adapter.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/adapter.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/adapter.c')
-rw-r--r--src/adapter.c16
1 files changed, 15 insertions, 1 deletions
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);