2012-07-27 19:43:11

by Vinicius Costa Gomes

[permalink] [raw]
Subject: [PATCH v3 BlueZ 00/12] Store address type in BR/EDR and shared files

Hi,

Just an updated version of the storage patches that Paulo Alcantara sent some
time ago.

Changes from last version:
* delete_entry now has address and address type parameters;
* When removing entries, we also remove the entries that have the old format
(without address type);

Cheers,


Claudio Takahasi (1):
storage: Store address type in "blocked" file

Paulo Alcantara (10):
storage: Store address type in "aliases" file
core: Fix reading from "aliases" and "names" file
storage: Store address type in "lastseen" file
storage: Store address type in "lastused" file
storage: Store address type in "profiles" file
storage: Store address type in "did" file
storage: Store address type in "linkkeys" file
storage: Store address type in "trusts" file
storage: Store address type in "eir" file
storage: Store address type in "sdp" file

Vinicius Costa Gomes (1):
storage: Make it clear that delete_entry only works for addresses

profiles/input/device.c | 5 +-
src/adapter.c | 41 +++++--
src/device.c | 70 ++++++------
src/event.c | 20 ++--
src/storage.c | 286 ++++++++++++++++++++++++++++++++++-------------
src/storage.h | 58 ++++++----
6 files changed, 330 insertions(+), 150 deletions(-)

--
1.7.10.4


2012-07-30 08:07:51

by Johan Hedberg

[permalink] [raw]
Subject: Re: [PATCH v3 BlueZ 00/12] Store address type in BR/EDR and shared files

Hi Vinicius,

On Fri, Jul 27, 2012, Vinicius Costa Gomes wrote:
> Just an updated version of the storage patches that Paulo Alcantara sent some
> time ago.
>
> Changes from last version:
> * delete_entry now has address and address type parameters;
> * When removing entries, we also remove the entries that have the old format
> (without address type);
>
> Cheers,
>
>
> Claudio Takahasi (1):
> storage: Store address type in "blocked" file
>
> Paulo Alcantara (10):
> storage: Store address type in "aliases" file
> core: Fix reading from "aliases" and "names" file
> storage: Store address type in "lastseen" file
> storage: Store address type in "lastused" file
> storage: Store address type in "profiles" file
> storage: Store address type in "did" file
> storage: Store address type in "linkkeys" file
> storage: Store address type in "trusts" file
> storage: Store address type in "eir" file
> storage: Store address type in "sdp" file
>
> Vinicius Costa Gomes (1):
> storage: Make it clear that delete_entry only works for addresses
>
> profiles/input/device.c | 5 +-
> src/adapter.c | 41 +++++--
> src/device.c | 70 ++++++------
> src/event.c | 20 ++--
> src/storage.c | 286 ++++++++++++++++++++++++++++++++++-------------
> src/storage.h | 58 ++++++----
> 6 files changed, 330 insertions(+), 150 deletions(-)

All patches in this set have been applied. Thanks.

Johan

2012-07-27 19:43:23

by Vinicius Costa Gomes

[permalink] [raw]
Subject: [PATCH v3 BlueZ 12/12] storage: Store address type in "sdp" file

From: Paulo Alcantara <[email protected]>

---
profiles/input/device.c | 5 ++++-
src/device.c | 12 ++++++++----
src/storage.c | 49 ++++++++++++++++++++++++++++++++++-------------
src/storage.h | 12 ++++++++----
4 files changed, 56 insertions(+), 22 deletions(-)

diff --git a/profiles/input/device.c b/profiles/input/device.c
index 829ca03..ed178b4 100644
--- a/profiles/input/device.c
+++ b/profiles/input/device.c
@@ -599,6 +599,7 @@ static int hidp_add_connection(const struct input_device *idev,
struct hidp_connadd_req *req;
struct fake_hid *fake_hid;
struct fake_input *fake;
+ uint8_t dst_type;
sdp_record_t *rec;
char src_addr[18], dst_addr[18];
GError *gerr = NULL;
@@ -613,7 +614,9 @@ static int hidp_add_connection(const struct input_device *idev,
ba2str(&idev->src, src_addr);
ba2str(&idev->dst, dst_addr);

- rec = fetch_record(src_addr, dst_addr, idev->handle);
+ dst_type = device_get_addr_type(idev->device);
+
+ rec = fetch_record(src_addr, dst_addr, dst_type, idev->handle);
if (!rec) {
error("Rejected connection from unknown device %s", dst_addr);
err = -EPERM;
diff --git a/src/device.c b/src/device.c
index 4ff37e6..1718726 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1176,8 +1176,8 @@ static void device_remove_stored(struct btd_device *device)
btd_adapter_remove_bonding(device->adapter, &dst, dst_type);
}

- delete_all_records(&src, &device->bdaddr);
- delete_device_service(&src, &device->bdaddr, device->bdaddr_type);
+ delete_all_records(&src, &dst, dst_type);
+ delete_device_service(&src, &dst, dst_type);

if (device->blocked)
device_unblock(conn, device, TRUE, FALSE);
@@ -1401,7 +1401,8 @@ static void device_remove_drivers(struct btd_device *device, GSList *uuids)
if (!rec)
continue;

- delete_record(srcaddr, dstaddr, rec->handle);
+ delete_record(srcaddr, dstaddr, device->bdaddr_type,
+ rec->handle);

records = sdp_list_remove(records, rec);
sdp_record_free(rec);
@@ -1443,6 +1444,7 @@ static void update_services(struct browse_req *req, sdp_list_t *recs)
struct btd_adapter *adapter = device_get_adapter(device);
sdp_list_t *seq;
char srcaddr[18], dstaddr[18];
+ uint8_t dst_type;
bdaddr_t src;

adapter_get_address(adapter, &src);
@@ -1509,7 +1511,9 @@ static void update_services(struct browse_req *req, sdp_list_t *recs)
continue;
}

- store_record(srcaddr, dstaddr, rec);
+ dst_type = device_get_addr_type(device);
+
+ store_record(srcaddr, dstaddr, dst_type, rec);

/* Copy record */
req->records = sdp_list_append(req->records,
diff --git a/src/storage.c b/src/storage.c
index 9e0ea12..c50e920 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -894,9 +894,10 @@ int delete_entry(bdaddr_t *src, const char *storage, bdaddr_t *dst,
return err;
}

-int store_record(const gchar *src, const gchar *dst, sdp_record_t *rec)
+int store_record(const gchar *src, const gchar *dst, uint8_t dst_type,
+ sdp_record_t *rec)
{
- char filename[PATH_MAX + 1], key[28];
+ char filename[PATH_MAX + 1], key[30];
sdp_buf_t buf;
int err, size, i;
char *str;
@@ -905,7 +906,8 @@ int store_record(const gchar *src, const gchar *dst, sdp_record_t *rec)

create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

- snprintf(key, sizeof(key), "%17s#%08X", dst, rec->handle);
+ snprintf(key, sizeof(key), "%17s#%hhu#%08X", dst, dst_type,
+ rec->handle);

if (sdp_gen_record_pdu(rec, &buf) < 0)
return -1;
@@ -949,34 +951,54 @@ sdp_record_t *record_from_string(const gchar *str)


sdp_record_t *fetch_record(const gchar *src, const gchar *dst,
- const uint32_t handle)
+ uint8_t dst_type, const uint32_t handle)
{
- char filename[PATH_MAX + 1], key[28], *str;
+ char filename[PATH_MAX + 1], old_key[28], key[30], *str;
sdp_record_t *rec;

create_name(filename, PATH_MAX, STORAGEDIR, src, "sdp");

- snprintf(key, sizeof(key), "%17s#%08X", dst, handle);
+ snprintf(key, sizeof(key), "%17s#%hhu#%08X", dst, dst_type, handle);
+ snprintf(old_key, sizeof(old_key), "%17s#%08X", dst, handle);

str = textfile_get(filename, key);
- if (!str)
+ if (str != NULL)
+ goto done;
+
+ /* Try old format (address#handle) */
+ str = textfile_get(filename, old_key);
+ if (str == NULL)
return NULL;

+done:
rec = record_from_string(str);
free(str);

return rec;
}

-int delete_record(const gchar *src, const gchar *dst, const uint32_t handle)
+int delete_record(const gchar *src, const gchar *dst, uint8_t dst_type,
+ const uint32_t handle)
{
- char filename[PATH_MAX + 1], key[28];
+ char filename[PATH_MAX + 1], old_key[28], key[30];
+ int err, ret;

create_name(filename, PATH_MAX, STORAGEDIR, src, "sdp");

- snprintf(key, sizeof(key), "%17s#%08X", dst, handle);
+ snprintf(key, sizeof(key), "%17s#%hhu#%08X", dst, dst_type, handle);
+ snprintf(old_key, sizeof(old_key), "%17s#%08X", dst, handle);

- return textfile_del(filename, key);
+ err = 0;
+ ret = textfile_del(filename, key);
+ if (ret)
+ err = ret;
+
+ /* Try old format (address#handle) */
+ ret = textfile_del(filename, old_key);
+ if (ret)
+ err = ret;
+
+ return err;
}

struct record_list {
@@ -999,7 +1021,8 @@ static void create_stored_records_from_keys(char *key, char *value,
rec_list->recs = sdp_list_append(rec_list->recs, rec);
}

-void delete_all_records(const bdaddr_t *src, const bdaddr_t *dst)
+void delete_all_records(const bdaddr_t *src, const bdaddr_t *dst,
+ uint8_t dst_type)
{
sdp_list_t *records, *seq;
char srcaddr[18], dstaddr[18];
@@ -1011,7 +1034,7 @@ void delete_all_records(const bdaddr_t *src, const bdaddr_t *dst)

for (seq = records; seq; seq = seq->next) {
sdp_record_t *rec = seq->data;
- delete_record(srcaddr, dstaddr, rec->handle);
+ delete_record(srcaddr, dstaddr, dst_type, rec->handle);
}

if (records)
diff --git a/src/storage.h b/src/storage.h
index b8cdb3c..c4f13dd 100644
--- a/src/storage.h
+++ b/src/storage.h
@@ -72,11 +72,15 @@ int write_device_profiles(bdaddr_t *src, bdaddr_t *dst, uint8_t dst_type,
const char *profiles);
int delete_entry(bdaddr_t *src, const char *storage, bdaddr_t *dst,
uint8_t dst_type);
-int store_record(const gchar *src, const gchar *dst, sdp_record_t *rec);
+int store_record(const gchar *src, const gchar *dst, uint8_t dst_type,
+ sdp_record_t *rec);
sdp_record_t *record_from_string(const gchar *str);
-sdp_record_t *fetch_record(const gchar *src, const gchar *dst, const uint32_t handle);
-int delete_record(const gchar *src, const gchar *dst, const uint32_t handle);
-void delete_all_records(const bdaddr_t *src, const bdaddr_t *dst);
+sdp_record_t *fetch_record(const gchar *src, const gchar *dst,
+ uint8_t dst_type, const uint32_t handle);
+int delete_record(const gchar *src, const gchar *dst, uint8_t dst_type,
+ const uint32_t handle);
+void delete_all_records(const bdaddr_t *src, const bdaddr_t *dst,
+ uint8_t dst_type);
sdp_list_t *read_records(const bdaddr_t *src, const bdaddr_t *dst);
sdp_record_t *find_record_in_list(sdp_list_t *recs, const char *uuid);
int store_device_id(const gchar *src, const gchar *dst, uint8_t dst_type,
--
1.7.10.4


2012-07-27 19:43:22

by Vinicius Costa Gomes

[permalink] [raw]
Subject: [PATCH v3 BlueZ 11/12] storage: Store address type in "eir" file

From: Paulo Alcantara <[email protected]>

---
src/event.c | 2 +-
src/storage.c | 30 +++++++++++++++++++++---------
src/storage.h | 7 ++++---
3 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/src/event.c b/src/event.c
index 002639f..1586293 100644
--- a/src/event.c
+++ b/src/event.c
@@ -270,7 +270,7 @@ void btd_event_device_found(bdaddr_t *local, bdaddr_t *peer, uint8_t bdaddr_type
update_lastseen(local, peer, bdaddr_type);

if (data)
- write_remote_eir(local, peer, data, data_len);
+ write_remote_eir(local, peer, bdaddr_type, data, data_len);

adapter_update_found_devices(adapter, peer, bdaddr_type, rssi,
confirm_name, data, data_len);
diff --git a/src/storage.c b/src/storage.c
index f28ffac..9e0ea12 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -430,10 +430,10 @@ done:
return 0;
}

-int write_remote_eir(bdaddr_t *local, bdaddr_t *peer, uint8_t *data,
- uint8_t data_len)
+int write_remote_eir(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
+ uint8_t *data, uint8_t data_len)
{
- char filename[PATH_MAX + 1], addr[18], str[481];
+ char filename[PATH_MAX + 1], key[20], str[481];
int i;

memset(str, 0, sizeof(str));
@@ -444,23 +444,35 @@ int write_remote_eir(bdaddr_t *local, bdaddr_t *peer, uint8_t *data,

create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

- ba2str(peer, addr);
- return textfile_put(filename, addr, str);
+ ba2str(peer, key);
+ sprintf(&key[17], "#%hhu", peer_type);
+
+ return textfile_put(filename, key, str);
}

-int read_remote_eir(bdaddr_t *local, bdaddr_t *peer, uint8_t *data)
+int read_remote_eir(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
+ uint8_t *data)
{
- char filename[PATH_MAX + 1], addr[18], *str;
+ char filename[PATH_MAX + 1], key[18], *str;
int i;

create_filename(filename, PATH_MAX, local, "eir");

- ba2str(peer, addr);
+ ba2str(peer, key);
+ sprintf(&key[17], "#%hhu", peer_type);

- str = textfile_get(filename, addr);
+ str = textfile_get(filename, key);
+ if (str != NULL)
+ goto done;
+
+ /* Try old format (address only) */
+ key[17] = '\0';
+
+ str = textfile_get(filename, key);
if (!str)
return -ENOENT;

+done:
if (!data) {
free(str);
return 0;
diff --git a/src/storage.h b/src/storage.h
index 56fb14e..b8cdb3c 100644
--- a/src/storage.h
+++ b/src/storage.h
@@ -48,9 +48,10 @@ int write_device_name(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
char *name);
int read_device_name(const char *src, const char *dst, uint8_t dst_type,
char *name);
-int write_remote_eir(bdaddr_t *local, bdaddr_t *peer, uint8_t *data,
- uint8_t data_len);
-int read_remote_eir(bdaddr_t *local, bdaddr_t *peer, uint8_t *data);
+int write_remote_eir(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
+ uint8_t *data, uint8_t data_len);
+int read_remote_eir(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
+ uint8_t *data);
int write_version_info(bdaddr_t *local, bdaddr_t *peer, uint16_t manufacturer, uint8_t lmp_ver, uint16_t lmp_subver);
int write_features_info(bdaddr_t *local, bdaddr_t *peer, unsigned char *page1, unsigned char *page2);
int read_remote_features(bdaddr_t *local, bdaddr_t *peer, unsigned char *page1, unsigned char *page2);
--
1.7.10.4


2012-07-27 19:43:21

by Vinicius Costa Gomes

[permalink] [raw]
Subject: [PATCH v3 BlueZ 10/12] storage: Store address type in "trusts" file

From: Paulo Alcantara <[email protected]>

---
src/device.c | 6 ++++--
src/storage.c | 41 ++++++++++++++++++++++++++++++-----------
src/storage.h | 6 ++++--
3 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/src/device.c b/src/device.c
index 3dd443f..4ff37e6 100644
--- a/src/device.c
+++ b/src/device.c
@@ -488,7 +488,8 @@ static DBusMessage *set_trust(DBusConnection *conn, DBusMessage *msg,
ba2str(&src, srcaddr);
ba2str(&device->bdaddr, dstaddr);

- err = write_trust(srcaddr, dstaddr, GLOBAL_TRUST, value);
+ err = write_trust(srcaddr, dstaddr, device->bdaddr_type, GLOBAL_TRUST,
+ value);
if (err < 0)
return btd_error_failed(msg, strerror(-err));

@@ -1079,7 +1080,8 @@ struct btd_device *device_create(DBusConnection *conn,
if (read_device_alias(srcaddr, address, bdaddr_type, alias,
sizeof(alias)) == 0)
device->alias = g_strdup(alias);
- device->trusted = read_trust(&src, address, GLOBAL_TRUST);
+ device->trusted = read_trust(&src, address, device->bdaddr_type,
+ GLOBAL_TRUST);

if (read_blocked(&src, &device->bdaddr, device->bdaddr_type))
device_block(conn, device, FALSE);
diff --git a/src/storage.c b/src/storage.c
index adaa26f..f28ffac 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -748,10 +748,10 @@ static char *service_list_to_string(GSList *services)
return g_strdup(str);
}

-int write_trust(const char *src, const char *addr, const char *service,
- gboolean trust)
+int write_trust(const char *src, const char *addr, uint8_t addr_type,
+ const char *service, gboolean trust)
{
- char filename[PATH_MAX + 1], *str;
+ char filename[PATH_MAX + 1], key[20], *str;
GSList *services = NULL, *match;
gboolean trusted;
int ret;
@@ -760,8 +760,15 @@ int write_trust(const char *src, const char *addr, const char *service,

create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

- str = textfile_caseget(filename, addr);
- if (str)
+ snprintf(key, sizeof(key), "%17s#%hhu", addr, addr_type);
+
+ str = textfile_caseget(filename, key);
+ if (str == NULL) {
+ /* Try old format (address only) */
+ str = textfile_caseget(filename, addr);
+ if (str)
+ services = service_string_to_list(str);
+ } else
services = service_string_to_list(str);

match = g_slist_find_custom(services, service, (GCompareFunc) strcmp);
@@ -780,11 +787,14 @@ int write_trust(const char *src, const char *addr, const char *service,
services = g_slist_remove(services, match->data);

/* Remove the entry if the last trusted service was removed */
- if (!trust && !services)
- ret = textfile_casedel(filename, addr);
- else {
+ if (!trust && !services) {
+ ret = textfile_casedel(filename, key);
+ if (ret < 0)
+ /* Try old format (address only) */
+ ret = textfile_casedel(filename, addr);
+ } else {
char *new_str = service_list_to_string(services);
- ret = textfile_caseput(filename, addr, new_str);
+ ret = textfile_caseput(filename, key, new_str);
g_free(new_str);
}

@@ -795,18 +805,27 @@ int write_trust(const char *src, const char *addr, const char *service,
return ret;
}

-gboolean read_trust(const bdaddr_t *local, const char *addr, const char *service)
+gboolean read_trust(const bdaddr_t *local, const char *addr, uint8_t addr_type,
+ const char *service)
{
- char filename[PATH_MAX + 1], *str;
+ char filename[PATH_MAX + 1], key[20], *str;
GSList *services;
gboolean ret;

create_filename(filename, PATH_MAX, local, "trusts");

+ snprintf(key, sizeof(key), "%17s#%hhu", addr, addr_type);
+
+ str = textfile_caseget(filename, key);
+ if (str != NULL)
+ goto done;
+
+ /* Try old format (address only) */
str = textfile_caseget(filename, addr);
if (!str)
return FALSE;

+done:
services = service_string_to_list(str);

if (g_slist_find_custom(services, service, (GCompareFunc) strcmp))
diff --git a/src/storage.h b/src/storage.h
index 44fd87f..56fb14e 100644
--- a/src/storage.h
+++ b/src/storage.h
@@ -63,8 +63,10 @@ int write_link_key(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
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);
+gboolean read_trust(const bdaddr_t *local, const char *addr, uint8_t addr_type,
+ const char *service);
+int write_trust(const char *src, const char *addr, uint8_t addr_type,
+ const char *service, gboolean trust);
int write_device_profiles(bdaddr_t *src, bdaddr_t *dst, uint8_t dst_type,
const char *profiles);
int delete_entry(bdaddr_t *src, const char *storage, bdaddr_t *dst,
--
1.7.10.4


2012-07-27 19:43:20

by Vinicius Costa Gomes

[permalink] [raw]
Subject: [PATCH v3 BlueZ 09/12] storage: Store address type in "linkkeys" file

From: Paulo Alcantara <[email protected]>

---
src/adapter.c | 9 +++++++--
src/device.c | 3 ++-
src/event.c | 6 +++++-
src/storage.c | 21 +++++++++++++++++----
src/storage.h | 6 ++++--
5 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index c88a275..3b11268 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1793,20 +1793,25 @@ static struct smp_ltk_info *get_ltk_info(const char *addr, uint8_t bdaddr_type,
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 d9218ce..3dd443f 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1084,7 +1084,8 @@ struct btd_device *device_create(DBusConnection *conn,
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
@@ -408,6 +408,7 @@ int btd_event_link_key_notify(bdaddr_t *local, bdaddr_t *peer,
{
struct btd_adapter *adapter;
struct btd_device *device;
+ uint8_t peer_type;
int ret;

if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE))
@@ -415,7 +416,10 @@ int btd_event_link_key_notify(bdaddr_t *local, bdaddr_t *peer,

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
@@ -608,9 +608,10 @@ int write_lastused_info(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
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));
@@ -623,6 +624,7 @@ int write_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, uint8_t
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);
@@ -636,18 +638,29 @@ int write_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, uint8_t
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
@@ -58,8 +58,10 @@ int write_lastseen_info(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
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);
--
1.7.10.4


2012-07-27 19:43:19

by Vinicius Costa Gomes

[permalink] [raw]
Subject: [PATCH v3 BlueZ 08/12] storage: Store address type in "did" file

From: Paulo Alcantara <[email protected]>

---
src/device.c | 7 ++++---
src/storage.c | 33 +++++++++++++++++++++++----------
src/storage.h | 4 ++--
3 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/src/device.c b/src/device.c
index d6bceaf..d9218ce 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1095,8 +1095,8 @@ struct btd_device *device_create(DBusConnection *conn,
device_set_bonded(device, TRUE);
}

- if (read_device_id(srcaddr, address, NULL, &vendor, &product, &version)
- == 0) {
+ if (read_device_id(srcaddr, address, bdaddr_type, NULL, &vendor,
+ &product, &version) == 0) {
device_set_vendor(device, vendor);
device_set_product(device, product);
device_set_version(device, version);
@@ -1494,7 +1494,8 @@ static void update_services(struct browse_req *req, sdp_list_t *recs)
device_set_version(device, version);

if (source || vendor || product || version)
- store_device_id(srcaddr, dstaddr, source,
+ store_device_id(srcaddr, dstaddr,
+ device->bdaddr_type, source,
vendor, product, version);
}

diff --git a/src/storage.c b/src/storage.c
index 05fb0a8..864f2fd 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -1021,35 +1021,46 @@ sdp_record_t *find_record_in_list(sdp_list_t *recs, const char *uuid)
return NULL;
}

-int store_device_id(const gchar *src, const gchar *dst,
+int store_device_id(const gchar *src, const gchar *dst, uint8_t dst_type,
const uint16_t source, const uint16_t vendor,
const uint16_t product, const uint16_t version)
{
- char filename[PATH_MAX + 1], str[20];
+ char filename[PATH_MAX + 1], key[20], str[20];

create_name(filename, PATH_MAX, STORAGEDIR, src, "did");

create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

+ snprintf(key, sizeof(key), "%17s#%hhu", dst, dst_type);
+
snprintf(str, sizeof(str), "%04X %04X %04X %04X", source,
vendor, product, version);

- return textfile_put(filename, dst, str);
+ return textfile_put(filename, key, str);
}

static int read_device_id_from_did(const gchar *src, const gchar *dst,
- uint16_t *source, uint16_t *vendor,
- uint16_t *product, uint16_t *version)
+ uint8_t dst_type, uint16_t *source,
+ uint16_t *vendor, uint16_t *product,
+ uint16_t *version)
{
char filename[PATH_MAX + 1];
- char *str, *vendor_str, *product_str, *version_str;
+ char key[20], *str, *vendor_str, *product_str, *version_str;

create_name(filename, PATH_MAX, STORAGEDIR, src, "did");

+ snprintf(key, sizeof(key), "%17s#%hhu", dst, dst_type);
+
+ str = textfile_get(filename, key);
+ if (str != NULL)
+ goto done;
+
+ /* Try old format (address only) */
str = textfile_get(filename, dst);
if (!str)
return -ENOENT;

+done:
vendor_str = strchr(str, ' ');
if (!vendor_str) {
free(str);
@@ -1086,7 +1097,7 @@ static int read_device_id_from_did(const gchar *src, const gchar *dst,
}

int read_device_id(const gchar *srcaddr, const gchar *dstaddr,
- uint16_t *source, uint16_t *vendor,
+ uint8_t dst_type, uint16_t *source, uint16_t *vendor,
uint16_t *product, uint16_t *version)
{
uint16_t lsource, lvendor, lproduct, lversion;
@@ -1095,8 +1106,9 @@ int read_device_id(const gchar *srcaddr, const gchar *dstaddr,
bdaddr_t src, dst;
int err;

- err = read_device_id_from_did(srcaddr, dstaddr, &lsource,
- vendor, product, version);
+ err = read_device_id_from_did(srcaddr, dstaddr, dst_type, &lsource,
+ vendor, product,
+ version);
if (!err) {
if (lsource == 0xffff)
err = -ENOENT;
@@ -1141,7 +1153,8 @@ int read_device_id(const gchar *srcaddr, const gchar *dstaddr,
lversion = 0x0000;
}

- store_device_id(srcaddr, dstaddr, lsource, lvendor, lproduct, lversion);
+ store_device_id(srcaddr, dstaddr, dst_type, lsource, lvendor,
+ lproduct, lversion);

if (err)
return err;
diff --git a/src/storage.h b/src/storage.h
index 6af2475..f766193 100644
--- a/src/storage.h
+++ b/src/storage.h
@@ -74,10 +74,10 @@ int delete_record(const gchar *src, const gchar *dst, const uint32_t handle);
void delete_all_records(const bdaddr_t *src, const bdaddr_t *dst);
sdp_list_t *read_records(const bdaddr_t *src, const bdaddr_t *dst);
sdp_record_t *find_record_in_list(sdp_list_t *recs, const char *uuid);
-int store_device_id(const gchar *src, const gchar *dst,
+int store_device_id(const gchar *src, const gchar *dst, uint8_t dst_type,
const uint16_t source, const uint16_t vendor,
const uint16_t product, const uint16_t version);
-int read_device_id(const gchar *src, const gchar *dst,
+int read_device_id(const gchar *src, const gchar *dst, uint8_t dst_type,
uint16_t *source, uint16_t *vendor,
uint16_t *product, uint16_t *version);
int write_device_pairable(bdaddr_t *local, gboolean mode);
--
1.7.10.4


2012-07-27 19:43:18

by Vinicius Costa Gomes

[permalink] [raw]
Subject: [PATCH v3 BlueZ 07/12] storage: Store address type in "profiles" file

From: Paulo Alcantara <[email protected]>

---
src/adapter.c | 9 +++++++--
src/device.c | 5 +++--
src/storage.c | 11 +++++++----
src/storage.h | 3 ++-
4 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 0394ec0..c88a275 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1674,15 +1674,20 @@ static const GDBusSignalTable adapter_signals[] = {
static void create_stored_device_from_profiles(char *key, char *value,
void *user_data)
{
+ char address[18];
+ uint8_t bdaddr_type;
struct btd_adapter *adapter = user_data;
GSList *list, *uuids = bt_string2list(value);
struct btd_device *device;

+ if (sscanf(key, "%17s#%hhu", address, &bdaddr_type) < 2)
+ bdaddr_type = BDADDR_BREDR;
+
if (g_slist_find_custom(adapter->devices,
- key, (GCompareFunc) device_address_cmp))
+ address, (GCompareFunc) device_address_cmp))
return;

- device = device_create(connection, adapter, key, BDADDR_BREDR);
+ device = device_create(connection, adapter, address, bdaddr_type);
if (!device)
return;

diff --git a/src/device.c b/src/device.c
index 1b35d4b..d6bceaf 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1537,12 +1537,13 @@ static void store_profiles(struct btd_device *device)
adapter_get_address(adapter, &src);

if (!device->uuids) {
- write_device_profiles(&src, &device->bdaddr, "");
+ write_device_profiles(&src, &device->bdaddr,
+ device->bdaddr_type, "");
return;
}

str = bt_list2string(device->uuids);
- write_device_profiles(&src, &device->bdaddr, str);
+ write_device_profiles(&src, &device->bdaddr, device->bdaddr_type, str);
g_free(str);
}

diff --git a/src/storage.c b/src/storage.c
index c10f9ae..05fb0a8 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -807,9 +807,10 @@ gboolean read_trust(const bdaddr_t *local, const char *addr, const char *service
return ret;
}

-int write_device_profiles(bdaddr_t *src, bdaddr_t *dst, const char *profiles)
+int write_device_profiles(bdaddr_t *src, bdaddr_t *dst, uint8_t dst_type,
+ const char *profiles)
{
- char filename[PATH_MAX + 1], addr[18];
+ char filename[PATH_MAX + 1], key[20];

if (!profiles)
return -EINVAL;
@@ -818,8 +819,10 @@ int write_device_profiles(bdaddr_t *src, bdaddr_t *dst, const char *profiles)

create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

- ba2str(dst, addr);
- return textfile_put(filename, addr, profiles);
+ ba2str(dst, key);
+ sprintf(&key[17], "#%hhu", dst_type);
+
+ return textfile_put(filename, key, profiles);
}

int delete_entry(bdaddr_t *src, const char *storage, bdaddr_t *dst,
diff --git a/src/storage.h b/src/storage.h
index cd7b161..6af2475 100644
--- a/src/storage.h
+++ b/src/storage.h
@@ -63,7 +63,8 @@ int read_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, uint8_t *
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);
-int write_device_profiles(bdaddr_t *src, bdaddr_t *dst, const char *profiles);
+int write_device_profiles(bdaddr_t *src, bdaddr_t *dst, uint8_t dst_type,
+ const char *profiles);
int delete_entry(bdaddr_t *src, const char *storage, bdaddr_t *dst,
uint8_t dst_type);
int store_record(const gchar *src, const gchar *dst, sdp_record_t *rec);
--
1.7.10.4


2012-07-27 19:43:17

by Vinicius Costa Gomes

[permalink] [raw]
Subject: [PATCH v3 BlueZ 06/12] storage: Store address type in "lastused" file

From: Paulo Alcantara <[email protected]>

---
src/event.c | 6 +++---
src/storage.c | 11 +++++++----
src/storage.h | 3 ++-
3 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/event.c b/src/event.c
index 12eb9d9..9168013 100644
--- a/src/event.c
+++ b/src/event.c
@@ -244,7 +244,7 @@ static void update_lastseen(bdaddr_t *sba, bdaddr_t *dba, uint8_t dba_type)
write_lastseen_info(sba, dba, dba_type, tm);
}

-static void update_lastused(bdaddr_t *sba, bdaddr_t *dba)
+static void update_lastused(bdaddr_t *sba, bdaddr_t *dba, uint8_t dba_type)
{
time_t t;
struct tm *tm;
@@ -252,7 +252,7 @@ static void update_lastused(bdaddr_t *sba, bdaddr_t *dba)
t = time(NULL);
tm = gmtime(&t);

- write_lastused_info(sba, dba, tm);
+ write_lastused_info(sba, dba, dba_type, tm);
}

void btd_event_device_found(bdaddr_t *local, bdaddr_t *peer, uint8_t bdaddr_type,
@@ -460,7 +460,7 @@ void btd_event_conn_complete(bdaddr_t *local, bdaddr_t *peer, uint8_t bdaddr_typ
if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE))
return;

- update_lastused(local, peer);
+ update_lastused(local, peer, bdaddr_type);

if (dev_class != NULL) {
uint32_t class = dev_class[0] | (dev_class[1] << 8) |
diff --git a/src/storage.c b/src/storage.c
index 89c28e0..c10f9ae 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -590,9 +590,10 @@ int write_lastseen_info(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
return textfile_put(filename, key, str);
}

-int write_lastused_info(bdaddr_t *local, bdaddr_t *peer, struct tm *tm)
+int write_lastused_info(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
+ struct tm *tm)
{
- char filename[PATH_MAX + 1], addr[18], str[24];
+ char filename[PATH_MAX + 1], key[20], str[24];

memset(str, 0, sizeof(str));
strftime(str, sizeof(str), "%Y-%m-%d %H:%M:%S %Z", tm);
@@ -601,8 +602,10 @@ int write_lastused_info(bdaddr_t *local, bdaddr_t *peer, struct tm *tm)

create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

- ba2str(peer, addr);
- return textfile_put(filename, addr, str);
+ ba2str(peer, key);
+ sprintf(&key[17], "#%hhu", peer_type);
+
+ return textfile_put(filename, key, str);
}

int write_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, uint8_t type, int length)
diff --git a/src/storage.h b/src/storage.h
index f54812b..cd7b161 100644
--- a/src/storage.h
+++ b/src/storage.h
@@ -56,7 +56,8 @@ int write_features_info(bdaddr_t *local, bdaddr_t *peer, unsigned char *page1, u
int read_remote_features(bdaddr_t *local, bdaddr_t *peer, unsigned char *page1, unsigned char *page2);
int write_lastseen_info(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
struct tm *tm);
-int write_lastused_info(bdaddr_t *local, bdaddr_t *peer, 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);
ssize_t read_pin_code(bdaddr_t *local, bdaddr_t *peer, char *pin);
--
1.7.10.4


2012-07-27 19:43:16

by Vinicius Costa Gomes

[permalink] [raw]
Subject: [PATCH v3 BlueZ 05/12] storage: Store address type in "lastseen" file

From: Paulo Alcantara <[email protected]>

---
src/event.c | 6 +++---
src/storage.c | 11 +++++++----
src/storage.h | 3 ++-
3 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/event.c b/src/event.c
index 17fc250..12eb9d9 100644
--- a/src/event.c
+++ b/src/event.c
@@ -233,7 +233,7 @@ void btd_event_simple_pairing_complete(bdaddr_t *local, bdaddr_t *peer,
device_simple_pairing_complete(device, status);
}

-static void update_lastseen(bdaddr_t *sba, bdaddr_t *dba)
+static void update_lastseen(bdaddr_t *sba, bdaddr_t *dba, uint8_t dba_type)
{
time_t t;
struct tm *tm;
@@ -241,7 +241,7 @@ static void update_lastseen(bdaddr_t *sba, bdaddr_t *dba)
t = time(NULL);
tm = gmtime(&t);

- write_lastseen_info(sba, dba, tm);
+ write_lastseen_info(sba, dba, dba_type, tm);
}

static void update_lastused(bdaddr_t *sba, bdaddr_t *dba)
@@ -267,7 +267,7 @@ void btd_event_device_found(bdaddr_t *local, bdaddr_t *peer, uint8_t bdaddr_type
return;
}

- update_lastseen(local, peer);
+ update_lastseen(local, peer, bdaddr_type);

if (data)
write_remote_eir(local, peer, data, data_len);
diff --git a/src/storage.c b/src/storage.c
index 252b383..89c28e0 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -572,9 +572,10 @@ int read_remote_features(bdaddr_t *local, bdaddr_t *peer,
return err;
}

-int write_lastseen_info(bdaddr_t *local, bdaddr_t *peer, struct tm *tm)
+int write_lastseen_info(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
+ struct tm *tm)
{
- char filename[PATH_MAX + 1], addr[18], str[24];
+ char filename[PATH_MAX + 1], key[20], str[24];

memset(str, 0, sizeof(str));
strftime(str, sizeof(str), "%Y-%m-%d %H:%M:%S %Z", tm);
@@ -583,8 +584,10 @@ int write_lastseen_info(bdaddr_t *local, bdaddr_t *peer, struct tm *tm)

create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

- ba2str(peer, addr);
- return textfile_put(filename, addr, str);
+ ba2str(peer, key);
+ sprintf(&key[17], "#%hhu", peer_type);
+
+ return textfile_put(filename, key, str);
}

int write_lastused_info(bdaddr_t *local, bdaddr_t *peer, struct tm *tm)
diff --git a/src/storage.h b/src/storage.h
index 3231fec..f54812b 100644
--- a/src/storage.h
+++ b/src/storage.h
@@ -54,7 +54,8 @@ int read_remote_eir(bdaddr_t *local, bdaddr_t *peer, uint8_t *data);
int write_version_info(bdaddr_t *local, bdaddr_t *peer, uint16_t manufacturer, uint8_t lmp_ver, uint16_t lmp_subver);
int write_features_info(bdaddr_t *local, bdaddr_t *peer, unsigned char *page1, unsigned char *page2);
int read_remote_features(bdaddr_t *local, bdaddr_t *peer, unsigned char *page1, unsigned char *page2);
-int write_lastseen_info(bdaddr_t *local, bdaddr_t *peer, struct tm *tm);
+int write_lastseen_info(bdaddr_t *local, bdaddr_t *peer, uint8_t peer_type,
+ struct tm *tm);
int write_lastused_info(bdaddr_t *local, bdaddr_t *peer, 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);
--
1.7.10.4


2012-07-27 19:43:15

by Vinicius Costa Gomes

[permalink] [raw]
Subject: [PATCH v3 BlueZ 04/12] storage: Store address type in "blocked" file

From: Claudio Takahasi <[email protected]>

---
src/device.c | 6 +++---
src/storage.c | 31 +++++++++++++++++++++----------
src/storage.h | 5 +++--
3 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/src/device.c b/src/device.c
index d4d4d90..1b35d4b 100644
--- a/src/device.c
+++ b/src/device.c
@@ -546,7 +546,7 @@ int device_block(DBusConnection *conn, struct btd_device *device,

adapter_get_address(device->adapter, &src);

- err = write_blocked(&src, &device->bdaddr, TRUE);
+ err = write_blocked(&src, &device->bdaddr, device->bdaddr_type, TRUE);
if (err < 0)
error("write_blocked(): %s (%d)", strerror(-err), -err);

@@ -578,7 +578,7 @@ int device_unblock(DBusConnection *conn, struct btd_device *device,

adapter_get_address(device->adapter, &src);

- err = write_blocked(&src, &device->bdaddr, FALSE);
+ err = write_blocked(&src, &device->bdaddr, device->bdaddr_type, FALSE);
if (err < 0)
error("write_blocked(): %s (%d)", strerror(-err), -err);

@@ -1081,7 +1081,7 @@ struct btd_device *device_create(DBusConnection *conn,
device->alias = g_strdup(alias);
device->trusted = read_trust(&src, address, GLOBAL_TRUST);

- if (read_blocked(&src, &device->bdaddr))
+ if (read_blocked(&src, &device->bdaddr, device->bdaddr_type))
device_block(conn, device, FALSE);

if (read_link_key(&src, &device->bdaddr, NULL, NULL) == 0) {
diff --git a/src/storage.c b/src/storage.c
index df876b4..252b383 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -1177,38 +1177,49 @@ int read_device_pairable(bdaddr_t *bdaddr, gboolean *mode)
return 0;
}

-gboolean read_blocked(const bdaddr_t *local, const bdaddr_t *remote)
+gboolean read_blocked(const bdaddr_t *local, const bdaddr_t *remote,
+ uint8_t remote_type)
{
- char filename[PATH_MAX + 1], *str, addr[18];
+ char filename[PATH_MAX + 1], *str, key[20];

create_filename(filename, PATH_MAX, local, "blocked");

- ba2str(remote, addr);
+ ba2str(remote, key);
+ sprintf(&key[17], "#%hhu", remote_type);

- str = textfile_caseget(filename, addr);
- if (!str)
+ str = textfile_caseget(filename, key);
+ if (str != NULL)
+ goto done;
+
+ /* Try old format (address only) */
+ key[17] = '\0';
+
+ str = textfile_caseget(filename, key);
+ if (str == NULL)
return FALSE;

+done:
free(str);

return TRUE;
}

int write_blocked(const bdaddr_t *local, const bdaddr_t *remote,
- gboolean blocked)
+ uint8_t remote_type, gboolean blocked)
{
- char filename[PATH_MAX + 1], addr[18];
+ char filename[PATH_MAX + 1], key[20];

create_filename(filename, PATH_MAX, local, "blocked");

create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

- ba2str(remote, addr);
+ ba2str(remote, key);
+ sprintf(&key[17], "#%hhu", remote_type);

if (blocked == FALSE)
- return textfile_casedel(filename, addr);
+ return textfile_casedel(filename, key);

- return textfile_caseput(filename, addr, "");
+ return textfile_caseput(filename, key, "");
}

int write_device_services(const bdaddr_t *sba, const bdaddr_t *dba,
diff --git a/src/storage.h b/src/storage.h
index 2291390..3231fec 100644
--- a/src/storage.h
+++ b/src/storage.h
@@ -79,9 +79,10 @@ int read_device_id(const gchar *src, const gchar *dst,
uint16_t *product, uint16_t *version);
int write_device_pairable(bdaddr_t *local, gboolean mode);
int read_device_pairable(bdaddr_t *local, gboolean *mode);
-gboolean read_blocked(const bdaddr_t *local, const bdaddr_t *remote);
+gboolean read_blocked(const bdaddr_t *local, const bdaddr_t *remote,
+ uint8_t remote_type);
int write_blocked(const bdaddr_t *local, const bdaddr_t *remote,
- gboolean blocked);
+ uint8_t remote_type, gboolean blocked);
int write_device_services(const bdaddr_t *sba, const bdaddr_t *dba,
uint8_t bdaddr_type, const char *services);
int delete_device_service(const bdaddr_t *sba, const bdaddr_t *dba,
--
1.7.10.4


2012-07-27 19:43:14

by Vinicius Costa Gomes

[permalink] [raw]
Subject: [PATCH v3 BlueZ 03/12] core: Fix reading from "aliases" and "names" file

From: Paulo Alcantara <[email protected]>

---
src/adapter.c | 23 +++++++++++++++++------
1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 8820e27..0394ec0 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2801,16 +2801,26 @@ static gboolean pairing_is_legacy(bdaddr_t *local, bdaddr_t *peer,
return TRUE;
}

-static char *read_stored_data(bdaddr_t *local, bdaddr_t *peer, const char *file)
+static char *read_stored_data(bdaddr_t *local, bdaddr_t *peer,
+ uint8_t peer_type, const char *file)
{
- char local_addr[18], peer_addr[18], filename[PATH_MAX + 1];
+ char local_addr[18], key[20], filename[PATH_MAX + 1], *str;

ba2str(local, local_addr);
- ba2str(peer, peer_addr);

create_name(filename, PATH_MAX, STORAGEDIR, local_addr, file);

- return textfile_get(filename, peer_addr);
+ ba2str(peer, key);
+ sprintf(&key[17], "#%hhu", peer_type);
+
+ str = textfile_get(filename, key);
+ if (str != NULL)
+ return str;
+
+ /* Try old format (address only) */
+ key[17] = '\0';
+
+ return textfile_get(filename, key);
}

void adapter_update_found_devices(struct btd_adapter *adapter,
@@ -2868,7 +2878,7 @@ void adapter_update_found_devices(struct btd_adapter *adapter,

/* New device in the discovery session */

- name = read_stored_data(&adapter->bdaddr, bdaddr, "names");
+ name = read_stored_data(&adapter->bdaddr, bdaddr, bdaddr_type, "names");

if (bdaddr_type == BDADDR_BREDR) {
legacy = pairing_is_legacy(&adapter->bdaddr, bdaddr, data,
@@ -2888,7 +2898,8 @@ void adapter_update_found_devices(struct btd_adapter *adapter,
mgmt_confirm_name(adapter->dev_id, bdaddr, bdaddr_type,
name_known);

- alias = read_stored_data(&adapter->bdaddr, bdaddr, "aliases");
+ alias = read_stored_data(&adapter->bdaddr, bdaddr, bdaddr_type,
+ "aliases");

dev = found_device_new(bdaddr, bdaddr_type, name, alias, dev_class,
legacy, eir_data.flags);
--
1.7.10.4


2012-07-27 19:43:13

by Vinicius Costa Gomes

[permalink] [raw]
Subject: [PATCH v3 BlueZ 02/12] storage: Store address type in "aliases" file

From: Paulo Alcantara <[email protected]>

---
src/device.c | 7 ++++---
src/storage.c | 26 +++++++++++++++++++++-----
src/storage.h | 6 ++++--
3 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/src/device.c b/src/device.c
index 28d8a13..d4d4d90 100644
--- a/src/device.c
+++ b/src/device.c
@@ -457,8 +457,8 @@ static DBusMessage *set_alias(DBusConnection *conn, DBusMessage *msg,
ba2str(&device->bdaddr, dstaddr);

/* Remove alias if empty string */
- err = write_device_alias(srcaddr, dstaddr,
- g_str_equal(alias, "") ? NULL : alias);
+ err = write_device_alias(srcaddr, dstaddr, device->bdaddr_type,
+ g_str_equal(alias, "") ? NULL : alias);
if (err < 0)
return btd_error_failed(msg, strerror(-err));

@@ -1076,7 +1076,8 @@ struct btd_device *device_create(DBusConnection *conn,
ba2str(&src, srcaddr);

read_device_name(srcaddr, address, bdaddr_type, device->name);
- if (read_device_alias(srcaddr, address, alias, sizeof(alias)) == 0)
+ if (read_device_alias(srcaddr, address, bdaddr_type, alias,
+ sizeof(alias)) == 0)
device->alias = g_strdup(alias);
device->trusted = read_trust(&src, address, GLOBAL_TRUST);

diff --git a/src/storage.c b/src/storage.c
index 7a3010d..df876b4 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -62,17 +62,29 @@ static inline int create_filename(char *buf, size_t size,
return create_name(buf, size, STORAGEDIR, addr, name);
}

-int read_device_alias(const char *src, const char *dst, char *alias, size_t size)
+int read_device_alias(const char *src, const char *dst, uint8_t dst_type,
+ char *alias, size_t size)
{
char filename[PATH_MAX + 1], *tmp;
+ char key[20];
int err;

create_name(filename, PATH_MAX, STORAGEDIR, src, "aliases");

- tmp = textfile_get(filename, dst);
- if (!tmp)
+ snprintf(key, sizeof(key), "%17s#%hhu", dst, dst_type);
+
+ tmp = textfile_get(filename, key);
+ if (tmp != NULL)
+ goto done;
+
+ /* Try old format (address only) */
+ key[17] = '\0';
+
+ tmp = textfile_get(filename, key);
+ if (tmp == NULL)
return -ENXIO;

+done:
err = snprintf(alias, size, "%s", tmp);

free(tmp);
@@ -80,15 +92,19 @@ int read_device_alias(const char *src, const char *dst, char *alias, size_t size
return err < 0 ? -EIO : 0;
}

-int write_device_alias(const char *src, const char *dst, const char *alias)
+int write_device_alias(const char *src, const char *dst, uint8_t dst_type,
+ const char *alias)
{
char filename[PATH_MAX + 1];
+ char key[20];

create_name(filename, PATH_MAX, STORAGEDIR, src, "aliases");

create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

- return textfile_put(filename, dst, alias);
+ snprintf(key, sizeof(key), "%17s#%hhu", dst, dst_type);
+
+ return textfile_put(filename, key, alias);
}

int write_discoverable_timeout(bdaddr_t *bdaddr, int timeout)
diff --git a/src/storage.h b/src/storage.h
index c5fabd1..2291390 100644
--- a/src/storage.h
+++ b/src/storage.h
@@ -23,8 +23,10 @@

#include "textfile.h"

-int read_device_alias(const char *src, const char *dst, char *alias, size_t size);
-int write_device_alias(const char *src, const char *dst, const char *alias);
+int read_device_alias(const char *src, const char *dst, uint8_t dst_type,
+ char *alias, size_t size);
+int write_device_alias(const char *src, const char *dst, uint8_t dst_type,
+ const char *alias);
int write_discoverable_timeout(bdaddr_t *bdaddr, int timeout);
int read_discoverable_timeout(const char *src, int *timeout);
int write_pairable_timeout(bdaddr_t *bdaddr, int timeout);
--
1.7.10.4


2012-07-27 19:43:12

by Vinicius Costa Gomes

[permalink] [raw]
Subject: [PATCH v3 BlueZ 01/12] storage: Make it clear that delete_entry only works for addresses

Also, delete_entry should try to erase both addresses styles, with and
without address type, if not we may find some leftovers from deleted
devices.
---
src/device.c | 24 +++++++++---------------
src/storage.c | 22 +++++++++++++++++++---
src/storage.h | 3 ++-
3 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/src/device.c b/src/device.c
index cd571f7..28d8a13 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1152,30 +1152,24 @@ uint16_t btd_device_get_version(struct btd_device *device)

static void device_remove_stored(struct btd_device *device)
{
- bdaddr_t src;
- char key[20];
+ bdaddr_t src, dst;
+ uint8_t dst_type;
DBusConnection *conn = get_dbus_connection();

adapter_get_address(device->adapter, &src);
- ba2str(&device->bdaddr, key);
+ device_get_address(device, &dst, &dst_type);

- /* key: address only */
- delete_entry(&src, "profiles", key);
- delete_entry(&src, "trusts", key);
+ delete_entry(&src, "profiles", &dst, dst_type);
+ delete_entry(&src, "trusts", &dst, dst_type);

if (device_is_bonded(device)) {
- delete_entry(&src, "linkkeys", key);
- delete_entry(&src, "aliases", key);
-
- /* key: address#type */
- sprintf(&key[17], "#%hhu", device->bdaddr_type);
-
- delete_entry(&src, "longtermkeys", key);
+ delete_entry(&src, "linkkeys", &dst, dst_type);
+ delete_entry(&src, "aliases", &dst, dst_type);
+ delete_entry(&src, "longtermkeys", &dst, dst_type);

device_set_bonded(device, FALSE);
device->paired = FALSE;
- btd_adapter_remove_bonding(device->adapter, &device->bdaddr,
- device->bdaddr_type);
+ btd_adapter_remove_bonding(device->adapter, &dst, dst_type);
}

delete_all_records(&src, &device->bdaddr);
diff --git a/src/storage.c b/src/storage.c
index 9289e07..7a3010d 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -800,13 +800,29 @@ int write_device_profiles(bdaddr_t *src, bdaddr_t *dst, const char *profiles)
return textfile_put(filename, addr, profiles);
}

-int delete_entry(bdaddr_t *src, const char *storage, const char *key)
+int delete_entry(bdaddr_t *src, const char *storage, bdaddr_t *dst,
+ uint8_t dst_type)
{
- char filename[PATH_MAX + 1];
+ char filename[PATH_MAX + 1], key[20];
+ int err, ret;
+
+ ba2str(dst, key);
+ sprintf(&key[17], "#%hhu", dst_type);

create_filename(filename, PATH_MAX, src, storage);

- return textfile_del(filename, key);
+ err = 0;
+ ret = textfile_del(filename, key);
+ if (ret)
+ err = ret;
+
+ /* Trying without address type */
+ key[17] = '\0';
+ ret = textfile_del(filename, key);
+ if (ret)
+ err = ret;
+
+ return err;
}

int store_record(const gchar *src, const gchar *dst, sdp_record_t *rec)
diff --git a/src/storage.h b/src/storage.h
index 07de39f..c5fabd1 100644
--- a/src/storage.h
+++ b/src/storage.h
@@ -60,7 +60,8 @@ 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);
int write_device_profiles(bdaddr_t *src, bdaddr_t *dst, const char *profiles);
-int delete_entry(bdaddr_t *src, const char *storage, const char *key);
+int delete_entry(bdaddr_t *src, const char *storage, bdaddr_t *dst,
+ uint8_t dst_type);
int store_record(const gchar *src, const gchar *dst, sdp_record_t *rec);
sdp_record_t *record_from_string(const gchar *str);
sdp_record_t *fetch_record(const gchar *src, const gchar *dst, const uint32_t handle);
--
1.7.10.4