diff --git a/src/adapter.c b/src/adapter.c
index 44d79ba..f9427ee 100644
--- a/src/adapter.c
+++ b/src/adapter.c
#define OFF_TIMER 3
+#define REMOVE_TEMP_TIMEOUT (3 * 60)
#define PENDING_FOUND_MAX 5
static GSList *adapter_drivers = NULL;
GQueue *auths; /* Ongoing and pending auths */
GSList *connections; /* Connected devices */
GSList *devices; /* Devices structure pointers */
+ guint remove_temp; /* Remove devices timer */
GSList *mode_sessions; /* Request Mode sessions */
GSList *disc_sessions; /* Discovery sessions */
struct session_req *scanning_session;
sdp_list_free(adapter->services, NULL);
- discovery_cleanup(adapter);
-
g_slist_free(adapter->connections);
g_free(adapter->path);
DBG("Removing adapter %s", adapter->path);
+ if (adapter->remove_temp > 0) {
+ g_source_remove(adapter->remove_temp);
+ adapter->remove_temp = 0;
+ }
+
+ discovery_cleanup(adapter);
+
for (l = adapter->devices; l; l = l->next)
device_remove(l->data, FALSE);
g_slist_free(adapter->devices);
return FALSE;
}
+static gboolean adapter_remove_temp(gpointer data)
+{
+ struct btd_adapter *adapter = data;
+ GSList *l, *next;
+
+ DBG("%s", adapter->path);
+
+ adapter->remove_temp = 0;
+
+ for (l = adapter->devices; l != NULL; l = next) {
+ struct btd_device *dev = l->data;
+
+ next = g_slist_next(l);
+
+ if (device_is_temporary(dev))
+ adapter_remove_device(adapter, dev, TRUE);
+ }
+
+ return FALSE;
+}
+
void adapter_set_discovering(struct btd_adapter *adapter,
gboolean discovering)
{
ADAPTER_INTERFACE, "Discovering");
if (discovering) {
+ if (adapter->remove_temp > 0) {
+ g_source_remove(adapter->remove_temp);
+ adapter->remove_temp = 0;
+ }
discovery->id = g_timeout_add_seconds(1, send_found, adapter);
return;
}
discovery_cleanup(adapter);
+ adapter->remove_temp = g_timeout_add_seconds(REMOVE_TEMP_TIMEOUT,
+ adapter_remove_temp,
+ adapter);
+
if (adapter->discov_suspended)
return;
diff --git a/src/device.c b/src/device.c
index 349ae20..7e940a1 100644
--- a/src/device.c
+++ b/src/device.c
if (dev->pending || dev->connect || dev->browse)
return btd_error_in_progress(msg);
+ device_set_temporary(dev, FALSE);
+
if (!dev->svc_resolved) {
err = device_resolve_svc(dev, msg);
if (err < 0)
const char *agent_path, *capability;
uint8_t io_cap;
+ device_set_temporary(device, FALSE);
+
if (!dbus_message_get_args(msg, NULL,
DBUS_TYPE_OBJECT_PATH, &agent_path,
DBUS_TYPE_STRING, &capability,
return;
}
+ device_set_temporary(device, FALSE);
+
device->connected = TRUE;
g_dbus_emit_property_changed(btd_get_dbus_connection(), device->path,
if (!device)
return;
+ if (device->temporary == temporary)
+ return;
+
DBG("temporary %d", temporary);
if (temporary)