From 7c62ddb6099a901326ac878e9742e667fd393023 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Tue, 4 Dec 2012 13:19:01 +0200 Subject: [PATCH] core: Move link key storing from event.c to mgmt.c --- src/event.c | 92 ----------------------------------------------------- src/event.h | 3 -- src/mgmt.c | 63 +++++++++++++++++++++++++++++++++--- 3 files changed, 59 insertions(+), 99 deletions(-) diff --git a/src/event.c b/src/event.c index 6269f1cf9..03c3853ad 100644 --- a/src/event.c +++ b/src/event.c @@ -53,95 +53,3 @@ #include "agent.h" #include "storage.h" #include "event.h" - -static gboolean get_adapter_and_device(const bdaddr_t *src, bdaddr_t *dst, - struct btd_adapter **adapter, - struct btd_device **device, - gboolean create) -{ - char peer_addr[18]; - - *adapter = manager_find_adapter(src); - if (!*adapter) { - error("Unable to find matching adapter"); - return FALSE; - } - - ba2str(dst, peer_addr); - - if (create) - *device = adapter_get_device(*adapter, peer_addr); - else - *device = adapter_find_device(*adapter, peer_addr); - - if (create && !*device) { - error("Unable to get device object!"); - return FALSE; - } - - return TRUE; -} - -static void store_link_key(struct btd_adapter *adapter, - struct btd_device *device, uint8_t *key, - uint8_t type, uint8_t pin_length) -{ - char adapter_addr[18]; - char device_addr[18]; - char filename[PATH_MAX + 1]; - GKeyFile *key_file; - char key_str[35]; - char *str; - int i; - gsize length = 0; - - ba2str(adapter_get_address(adapter), adapter_addr); - ba2str(device_get_address(device), device_addr); - - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", adapter_addr, - device_addr); - filename[PATH_MAX] = '\0'; - - key_file = g_key_file_new(); - g_key_file_load_from_file(key_file, filename, 0, NULL); - - key_str[0] = '0'; - key_str[1] = 'x'; - for (i = 0; i < 16; i++) - sprintf(key_str + 2 + (i * 2), "%2.2X", key[i]); - - g_key_file_set_string(key_file, "LinkKey", "Key", key_str); - - g_key_file_set_integer(key_file, "LinkKey", "Type", type); - g_key_file_set_integer(key_file, "LinkKey", "PINLength", pin_length); - - create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - - str = g_key_file_to_data(key_file, &length, NULL); - g_file_set_contents(filename, str, length, NULL); - g_free(str); - - g_key_file_free(key_file); -} - -int btd_event_link_key_notify(bdaddr_t *local, bdaddr_t *peer, - uint8_t *key, uint8_t key_type, - uint8_t pin_length) -{ - struct btd_adapter *adapter; - struct btd_device *device; - - if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE)) - return -ENODEV; - - DBG("storing link key of type 0x%02x", key_type); - - store_link_key(adapter, device, key, key_type, pin_length); - - device_set_bonded(device, TRUE); - - if (device_is_temporary(device)) - device_set_temporary(device, FALSE); - - return 0; -} diff --git a/src/event.h b/src/event.h index 280d8a4cd..fa1fa02bb 100644 --- a/src/event.h +++ b/src/event.h @@ -21,6 +21,3 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ - -int btd_event_link_key_notify(bdaddr_t *local, bdaddr_t *peer, uint8_t *key, - uint8_t key_type, uint8_t pin_length); diff --git a/src/mgmt.c b/src/mgmt.c index f51e85d7b..5b31cf77b 100644 --- a/src/mgmt.c +++ b/src/mgmt.c @@ -458,10 +458,54 @@ static void bonding_complete(struct controller_info *info, adapter_bonding_complete(adapter, bdaddr, status); } +static void store_link_key(struct btd_adapter *adapter, + struct btd_device *device, uint8_t *key, + uint8_t type, uint8_t pin_length) +{ + char adapter_addr[18]; + char device_addr[18]; + char filename[PATH_MAX + 1]; + GKeyFile *key_file; + char key_str[35]; + char *str; + int i; + gsize length = 0; + + ba2str(adapter_get_address(adapter), adapter_addr); + ba2str(device_get_address(device), device_addr); + + snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", adapter_addr, + device_addr); + filename[PATH_MAX] = '\0'; + + key_file = g_key_file_new(); + g_key_file_load_from_file(key_file, filename, 0, NULL); + + key_str[0] = '0'; + key_str[1] = 'x'; + for (i = 0; i < 16; i++) + sprintf(key_str + 2 + (i * 2), "%2.2X", key[i]); + + g_key_file_set_string(key_file, "LinkKey", "Key", key_str); + + g_key_file_set_integer(key_file, "LinkKey", "Type", type); + g_key_file_set_integer(key_file, "LinkKey", "PINLength", pin_length); + + create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + + str = g_key_file_to_data(key_file, &length, NULL); + g_file_set_contents(filename, str, length, NULL); + g_free(str); + + g_key_file_free(key_file); +} + static void mgmt_new_link_key(int sk, uint16_t index, void *buf, size_t len) { struct mgmt_ev_new_link_key *ev = buf; struct controller_info *info; + struct btd_adapter *adapter; + struct btd_device *device; if (len != sizeof(*ev)) { error("mgmt_new_link_key event size mismatch (%zu != %zu)", @@ -485,10 +529,21 @@ static void mgmt_new_link_key(int sk, uint16_t index, void *buf, size_t len) info = &controllers[index]; - if (ev->store_hint) - btd_event_link_key_notify(&info->bdaddr, &ev->key.addr.bdaddr, - ev->key.val, ev->key.type, - ev->key.pin_len); + if (!get_adapter_and_device(&info->bdaddr, &ev->key.addr.bdaddr, + &adapter, &device, true)) + return; + + if (ev->store_hint) { + struct mgmt_link_key_info *key = &ev->key; + + store_link_key(adapter, device, key->val, key->type, + key->pin_len); + + device_set_bonded(device, TRUE); + + if (device_is_temporary(device)) + device_set_temporary(device, FALSE); + } bonding_complete(info, &ev->key.addr.bdaddr, 0); } -- 2.47.3