diff --git a/src/adapter.c b/src/adapter.c
index 4d20acb..7ac3d20 100644
--- a/src/adapter.c
+++ b/src/adapter.c
static void discovery_cleanup(struct btd_adapter *adapter)
{
+ GSList *l, *next;
+
adapter->discovery_type = 0x00;
if (adapter->discovery_idle_timeout > 0) {
if (!adapter->devices)
return;
+ for (l = adapter->devices; l != NULL; l = next) {
+ struct btd_device *dev = l->data;
+
+ next = g_slist_next(l);
+
+ if (device_is_temporary(dev) && !device_is_connectable(dev))
+ btd_adapter_remove_device(adapter, dev);
+ }
+
adapter->temp_devices_timeout = g_timeout_add_seconds(TEMP_DEV_TIMEOUT,
remove_temp_devices, adapter);
}
diff --git a/src/device.c b/src/device.c
index 7701987..9f9c478 100644
--- a/src/device.c
+++ b/src/device.c
GSList *pending; /* Pending services */
GSList *watches; /* List of disconnect_data */
bool temporary;
+ bool connectable;
guint disconn_timer;
guint discov_timer;
struct browse_req *browse; /* service discover request */
DEVICE_INTERFACE, "AdvertisingFlags");
}
+bool device_is_connectable(struct btd_device *device)
+{
+ if (!device)
+ return false;
+
+ if (device->bredr)
+ return true;
+
+ /* Check if either Limited or General discoverable are set */
+ return (device->ad_flags[0] & 0x03);
+}
+
static gboolean start_discovery(gpointer user_data)
{
struct btd_device *device = user_data;
diff --git a/src/device.h b/src/device.h
index 32f8edc..bc046f7 100644
--- a/src/device.h
+++ b/src/device.h
const bdaddr_t *device_get_address(struct btd_device *device);
const char *device_get_path(const struct btd_device *device);
gboolean device_is_temporary(struct btd_device *device);
+bool device_is_connectable(struct btd_device *device);
bool device_is_paired(struct btd_device *device, uint8_t bdaddr_type);
bool device_is_bonded(struct btd_device *device, uint8_t bdaddr_type);
gboolean device_is_trusted(struct btd_device *device);