diff --git a/src/adapter.c b/src/adapter.c
index 8d18f40..1c6e57b 100644
--- a/src/adapter.c
+++ b/src/adapter.c
static void create_stored_device_from_linkkeys(char *key, char *value,
void *user_data)
{
+ char address[18];
+ uint8_t bdaddr_type;
struct adapter_keys *keys = user_data;
struct btd_adapter *adapter = keys->adapter;
struct btd_device *device;
struct link_key_info *info;
+ if (sscanf(key, "%17s#%hhu", address, &bdaddr_type) < 2)
+ bdaddr_type = BDADDR_BREDR;
+
info = get_key_info(key, value);
if (info)
keys->keys = g_slist_append(keys->keys, info);
- if (g_slist_find_custom(adapter->devices, key,
+ if (g_slist_find_custom(adapter->devices, address,
(GCompareFunc) device_address_cmp))
return;
- device = device_create(connection, adapter, key, BDADDR_BREDR);
+ device = device_create(connection, adapter, address, bdaddr_type);
if (device) {
device_set_temporary(device, FALSE);
adapter->devices = g_slist_append(adapter->devices, device);
diff --git a/src/device.c b/src/device.c
index ac6eb0b..88bd239 100644
--- a/src/device.c
+++ b/src/device.c
if (read_blocked(&src, &device->bdaddr, device->bdaddr_type))
device_block(conn, device, FALSE);
- if (read_link_key(&src, &device->bdaddr, NULL, NULL) == 0) {
+ if (read_link_key(&src, &device->bdaddr, device->bdaddr_type, NULL,
+ NULL) == 0) {
device_set_paired(device, TRUE);
device_set_bonded(device, TRUE);
}
diff --git a/src/event.c b/src/event.c
index 9168013..002639f 100644
--- a/src/event.c
+++ b/src/event.c
{
struct btd_adapter *adapter;
struct btd_device *device;
+ uint8_t peer_type;
int ret;
if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE))
DBG("storing link key of type 0x%02x", key_type);
- ret = write_link_key(local, peer, key, key_type, pin_length);
+ peer_type = device_get_addr_type(device);
+
+ ret = write_link_key(local, peer, peer_type, key, key_type,
+ pin_length);
if (ret == 0) {
device_set_bonded(device, TRUE);
diff --git a/src/storage.c b/src/storage.c
index 864f2fd..adaa26f 100644
--- a/src/storage.c
+++ b/src/storage.c
return textfile_put(filename, key, str);
}
-int write_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, uint8_t type, int length)
+int write_link_key(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
+ unsigned char *key, uint8_t type, int length)
{
- char filename[PATH_MAX + 1], addr[18], str[38];
+ char filename[PATH_MAX + 1], addr[20], str[38];
int i;
memset(str, 0, sizeof(str));
create_file(filename, S_IRUSR | S_IWUSR);
ba2str(peer, addr);
+ sprintf(&addr[17], "#%hhu", peer_type);
if (length < 0) {
char *tmp = textfile_get(filename, addr);
return textfile_put(filename, addr, str);
}
-int read_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, uint8_t *type)
+int read_link_key(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
+ unsigned char *key, uint8_t *type)
{
- char filename[PATH_MAX + 1], addr[18], tmp[3], *str;
+ char filename[PATH_MAX + 1], addr[20], tmp[3], *str;
int i;
create_filename(filename, PATH_MAX, local, "linkkeys");
ba2str(peer, addr);
+ sprintf(&addr[17], "#%hhu", peer_type);
+
+ str = textfile_get(filename, addr);
+ if (str != NULL)
+ goto done;
+
+ /* Try old format (address only) */
+ addr[17] = '\0';
+
str = textfile_get(filename, addr);
if (!str)
return -ENOENT;
+done:
if (!key) {
free(str);
return 0;
diff --git a/src/storage.h b/src/storage.h
index f766193..44fd87f 100644
--- a/src/storage.h
+++ b/src/storage.h
struct tm *tm);
int write_lastused_info(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
struct tm *tm);
-int write_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, uint8_t type, int length);
-int read_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, uint8_t *type);
+int write_link_key(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
+ unsigned char *key, uint8_t type, int length);
+int read_link_key(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
+ unsigned char *key, uint8_t *type);
ssize_t read_pin_code(bdaddr_t *local, bdaddr_t *peer, char *pin);
gboolean read_trust(const bdaddr_t *local, const char *addr, const char *service);
int write_trust(const char *src, const char *addr, const char *service, gboolean trust);