g_key_file_free(key_file);
}
-void adapter_store_cached_name(const bdaddr_t *local, const bdaddr_t *peer,
- const char *name)
-{
- char filename[PATH_MAX + 1];
- char s_addr[18], d_addr[18];
- GKeyFile *key_file;
- char *data;
- gsize length = 0;
-
- ba2str(local, s_addr);
- ba2str(peer, d_addr);
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", s_addr, d_addr);
- filename[PATH_MAX] = '\0';
- create_file(filename, S_IRUSR | S_IWUSR);
-
- key_file = g_key_file_new();
- g_key_file_load_from_file(key_file, filename, 0, NULL);
- g_key_file_set_string(key_file, "General", "Name", name);
-
- data = g_key_file_to_data(key_file, &length, NULL);
- g_file_set_contents(filename, data, length, NULL);
- g_free(data);
-
- g_key_file_free(key_file);
-}
-
static void trigger_pairable_timeout(struct btd_adapter *adapter);
static void adapter_start(struct btd_adapter *adapter);
static void adapter_stop(struct btd_adapter *adapter);
{
char *address = user_data;
char *str = key;
- bdaddr_t local, peer;
+ char filename[PATH_MAX + 1];
+ GKeyFile *key_file;
+ char *data;
+ gsize length = 0;
if (strchr(key, '#'))
str[17] = '\0';
if (bachk(str) != 0)
return;
- str2ba(address, &local);
- str2ba(str, &peer);
- adapter_store_cached_name(&local, &peer, value);
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", address, str);
+ filename[PATH_MAX] = '\0';
+ create_file(filename, S_IRUSR | S_IWUSR);
+
+ key_file = g_key_file_new();
+ g_key_file_load_from_file(key_file, filename, 0, NULL);
+ g_key_file_set_string(key_file, "General", "Name", value);
+
+ data = g_key_file_to_data(key_file, &length, NULL);
+ g_file_set_contents(filename, data, length, NULL);
+ g_free(data);
+
+ g_key_file_free(key_file);
}
struct device_converter {
return;
}
- if (eir_data.name != NULL && eir_data.name_complete)
- adapter_store_cached_name(&adapter->bdaddr, bdaddr,
- eir_data.name);
-
/* Avoid creating LE device if it's not discoverable */
if (bdaddr_type != BDADDR_BREDR &&
!(eir_data.flags & (EIR_LIM_DISC | EIR_GEN_DISC))) {
return;
}
+ if (eir_data.name != NULL && eir_data.name_complete)
+ device_store_cached_name(dev, eir_data.name);
+
/*
* If no client has requested discovery, then only update
* already paired devices (skip temporary ones).
adapter_add_connection(adapter, device);
if (eir_data.name != NULL) {
- const bdaddr_t *bdaddr = adapter_get_address(adapter);
- adapter_store_cached_name(bdaddr, &ev->addr.bdaddr,
- eir_data.name);
+ device_store_cached_name(device, eir_data.name);
device_set_name(device, eir_data.name);
}
return FALSE;
}
+static bool device_address_is_private(struct btd_device *dev)
+{
+ if (dev->bdaddr_type != BDADDR_LE_RANDOM)
+ return false;
+
+ switch (dev->bdaddr.b[5] >> 6) {
+ case 0x00: /* Private non-resolvable */
+ case 0x01: /* Private resolvable */
+ return true;
+ default:
+ return false;
+ }
+}
+
static void store_device_info(struct btd_device *device)
{
if (device->temporary || device->store_id > 0)
return;
+ if (device_address_is_private(device)) {
+ warn("Can't store info for private addressed device %s",
+ device->path);
+ return;
+ }
+
device->store_id = g_idle_add(store_device_info_cb, device);
}
+void device_store_cached_name(struct btd_device *dev, const char *name)
+{
+ char filename[PATH_MAX + 1];
+ char s_addr[18], d_addr[18];
+ GKeyFile *key_file;
+ char *data;
+ gsize length = 0;
+
+ if (device_address_is_private(dev)) {
+ warn("Can't store name for private addressed device %s",
+ dev->path);
+ return;
+ }
+
+ ba2str(adapter_get_address(dev->adapter), s_addr);
+ ba2str(&dev->bdaddr, d_addr);
+ snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", s_addr, d_addr);
+ filename[PATH_MAX] = '\0';
+ create_file(filename, S_IRUSR | S_IWUSR);
+
+ key_file = g_key_file_new();
+ g_key_file_load_from_file(key_file, filename, 0, NULL);
+ g_key_file_set_string(key_file, "General", "Name", name);
+
+ data = g_key_file_to_data(key_file, &length, NULL);
+ g_file_set_contents(filename, data, length, NULL);
+ g_free(data);
+
+ g_key_file_free(key_file);
+}
+
static void browse_request_free(struct browse_req *req)
{
if (req->listener_id)
char *data;
gsize length = 0;
+ if (device_address_is_private(device)) {
+ warn("Can't store services for private addressed device %s",
+ device->path);
+ return;
+ }
+
sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
prim_uuid = bt_uuid2string(&uuid);
if (prim_uuid == NULL)