summaryrefslogtreecommitdiffstats
path: root/src/adapter.c
diff options
context:
space:
mode:
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);