Cleanup inserting new device found entry
diff --git a/src/adapter.c b/src/adapter.c
index 161636e..dc051cd 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2914,29 +2914,24 @@
g_free(alias);
}
-static struct remote_dev_info *get_found_dev(struct btd_adapter *adapter,
- const bdaddr_t *bdaddr,
- gboolean *new_dev)
+static struct remote_dev_info *found_device_new(const bdaddr_t *bdaddr,
+ gboolean le, const char *name,
+ const char *alias, uint32_t class,
+ gboolean legacy, name_status_t status,
+ int flags)
{
- struct remote_dev_info *dev, match;
+ struct remote_dev_info *dev;
- memset(&match, 0, sizeof(struct remote_dev_info));
- bacpy(&match.bdaddr, bdaddr);
- match.name_status = NAME_ANY;
-
- dev = adapter_search_found_devices(adapter, &match);
- if (dev) {
- *new_dev = FALSE;
- /* Out of range list update */
- adapter->oor_devices = g_slist_remove(adapter->oor_devices,
- dev);
- } else {
- *new_dev = TRUE;
- dev = g_new0(struct remote_dev_info, 1);
- bacpy(&dev->bdaddr, bdaddr);
- adapter->found_devices = g_slist_prepend(adapter->found_devices,
- dev);
- }
+ dev = g_new0(struct remote_dev_info, 1);
+ bacpy(&dev->bdaddr, bdaddr);
+ dev->le = le;
+ dev->name = g_strdup(name);
+ dev->alias = g_strdup(alias);
+ dev->class = class;
+ dev->legacy = legacy;
+ dev->name_status = status;
+ if (flags >= 0)
+ dev->flags = flags;
return dev;
}
@@ -3002,11 +2997,11 @@
uint32_t class, int8_t rssi,
uint8_t *data, size_t eir_size)
{
- struct remote_dev_info *dev;
+ struct remote_dev_info *dev, match;
struct eir_data eir_data;
- char *name;
- gboolean new_dev, legacy, le;
- name_status_t name_status = NAME_NOT_REQUIRED;
+ char *alias, *name;
+ gboolean legacy, le;
+ name_status_t name_status;
int err;
memset(&eir_data, 0, sizeof(eir_data));
@@ -3019,6 +3014,25 @@
if (eir_data.name != NULL && eir_data.name_complete)
write_device_name(&adapter->bdaddr, bdaddr, eir_data.name);
+ /* Device already seen in the discovery session ? */
+ memset(&match, 0, sizeof(struct remote_dev_info));
+ bacpy(&match.bdaddr, bdaddr);
+ match.name_status = NAME_ANY;
+
+ dev = adapter_search_found_devices(adapter, &match);
+ if (dev) {
+ adapter->oor_devices = g_slist_remove(adapter->oor_devices,
+ dev);
+ if (dev->rssi != rssi)
+ goto done;
+
+ eir_data_free(&eir_data);
+
+ return;
+ }
+
+ /* New device in the discovery session */
+
name = read_stored_data(&adapter->bdaddr, bdaddr, "names");
if (eir_data.flags < 0) {
@@ -3035,34 +3049,19 @@
} else {
le = TRUE;
legacy = FALSE;
+ name_status = NAME_NOT_REQUIRED;
}
- dev = get_found_dev(adapter, bdaddr, &new_dev);
+ alias = read_stored_data(&adapter->bdaddr, bdaddr, "aliases");
- if (new_dev) {
- const char *dev_name = (name ? name : eir_data.name);
- char *alias;
+ dev = found_device_new(bdaddr, le, name, alias, class, legacy,
+ name_status, eir_data.flags);
+ free(name);
+ free(alias);
- if (dev_name)
- dev->name = g_strdup(dev_name);
+ adapter->found_devices = g_slist_prepend(adapter->found_devices, dev);
- alias = read_stored_data(&adapter->bdaddr, bdaddr, "aliases");
- if (alias) {
- dev->alias = g_strdup(alias);
- free(alias);
- }
-
- dev->le = le;
- dev->class = class;
- dev->legacy = legacy;
- dev->name_status = name_status;
-
- if (eir_data.flags >= 0)
- dev->flags = eir_data.flags;
-
- } else if (dev->rssi == rssi)
- goto done;
-
+done:
dev->rssi = rssi;
adapter->found_devices = g_slist_sort(adapter->found_devices,
@@ -3073,8 +3072,6 @@
adapter_emit_device_found(adapter, dev);
-done:
- free(name);
eir_data_free(&eir_data);
}