diff --git a/src/event.c b/src/event.c
index 6269f1c..03c3853 100644
--- a/src/event.c
+++ b/src/event.c
#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 280d8a4..fa1fa02 100644
--- a/src/event.h
+++ b/src/event.h
* 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 f51e85d..5b31cf7 100644
--- a/src/mgmt.c
+++ b/src/mgmt.c
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)",
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);
}