diff --git a/plugins/neard.c b/plugins/neard.c
index d44e5c2..632d454 100644
--- a/plugins/neard.c
+++ b/plugins/neard.c
#include "eir.h"
#include "storage.h"
#include "agent.h"
+#include "hcid.h"
#define NEARD_NAME "org.neard"
#define NEARD_PATH "/"
static gboolean agent_registered = FALSE;
static gboolean agent_register_postpone = FALSE;
+/* For NFC mimetype limits max OOB EIR size */
+#define NFC_OOB_EIR_MAX UINT8_MAX
+
static DBusMessage *error_reply(DBusMessage *msg, int error)
{
switch (error) {
AGENT_INTERFACE);
}
+static void read_local_complete(struct btd_adapter *adapter, uint8_t *hash,
+ uint8_t *randomizer, void *user_data)
+{
+ DBusMessage *msg = user_data;
+ DBusMessage *reply;
+
+ DBG("");
+
+ if (!agent_registered) {
+ dbus_message_unref(msg);
+
+ if (agent_register_postpone) {
+ agent_register_postpone = FALSE;
+ register_agent();
+ }
+
+ return;
+ }
+
+ if (hash && randomizer) {
+ int len;
+ uint8_t eir[NFC_OOB_EIR_MAX];
+ uint8_t *peir = eir;
+ bdaddr_t addr;
+ DBusMessageIter iter;
+ DBusMessageIter dict;
+
+ adapter_get_address(adapter, &addr);
+
+ len = eir_create_oob(&addr, btd_adapter_get_name(adapter),
+ btd_adapter_get_class(adapter), hash,
+ randomizer, main_opts.did_vendor,
+ main_opts.did_product, main_opts.did_version,
+ main_opts.did_source,
+ btd_adapter_get_services(adapter), eir);
+
+ reply = dbus_message_new_method_return(msg);
+
+ dbus_message_iter_init_append(reply, &iter);
+
+ dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+ DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING
+ DBUS_TYPE_VARIANT_AS_STRING
+ DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+ &dict);
+
+ dict_append_array(&dict, "EIR", DBUS_TYPE_BYTE, &peir, len);
+
+ dbus_message_iter_close_container(&iter, &dict);
+
+ } else {
+ reply = error_reply(msg, EIO);
+ }
+
+ dbus_message_unref(msg);
+
+ if (!g_dbus_send_message(btd_get_dbus_connection(), reply))
+ error("D-Bus send failed");
+}
+
static void bonding_complete(struct btd_adapter *adapter, bdaddr_t *bdaddr,
uint8_t status, void *user_data)
{
static DBusMessage *request_oob(DBusConnection *conn, DBusMessage *msg,
void *data)
{
+ struct btd_adapter *adapter;
+ struct oob_handler *handler;
+ int ret;
+
DBG("");
- return error_reply(msg, ENOTSUP);
+ adapter = manager_get_default_adapter();
+ ret = check_adapter(adapter);
+ if (ret < 0)
+ return error_reply(msg, -ret);
+
+ ret = process_params(msg, adapter, NULL);
+ if (ret < 0)
+ return error_reply(msg, -ret);
+
+ ret = btd_adapter_read_local_oob_data(adapter);
+ if (ret < 0)
+ return error_reply(msg, -ret);
+
+ handler = g_new0(struct oob_handler, 1);
+ handler->read_local_cb = read_local_complete;
+ handler->user_data = dbus_message_ref(msg);
+
+ btd_adapter_set_oob_handler(adapter, handler);
+
+ return NULL;
}
static DBusMessage *release(DBusConnection *conn, DBusMessage *msg,