From a10af97063bd0800037bba35d55fbb0af7e47f75 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Tue, 21 Jan 2014 13:54:30 +0200 Subject: [PATCH] tools/btmgmt: Remove src/eir.c dependency --- Makefile.tools | 2 +- tools/btmgmt.c | 47 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/Makefile.tools b/Makefile.tools index 7548dca00..cd2d1ca26 100644 --- a/Makefile.tools +++ b/Makefile.tools @@ -262,7 +262,7 @@ tools_hwdb_LDADD = lib/libbluetooth-internal.la tools_hcieventmask_LDADD = lib/libbluetooth-internal.la -tools_btmgmt_SOURCES = tools/btmgmt.c src/glib-helper.c src/eir.c \ +tools_btmgmt_SOURCES = tools/btmgmt.c src/glib-helper.c \ monitor/mainloop.h monitor/mainloop.c \ src/shared/io.h src/shared/io-mainloop.c \ src/shared/queue.h src/shared/queue.c \ diff --git a/tools/btmgmt.c b/tools/btmgmt.c index c0e042238..e67389316 100644 --- a/tools/btmgmt.c +++ b/tools/btmgmt.c @@ -47,7 +47,6 @@ #include "src/shared/util.h" #include "src/shared/mgmt.h" #include "lib/mgmt.h" -#include "eir.h" static bool monitor = false; static bool discovery = false; @@ -312,14 +311,41 @@ static void confirm_name_rsp(uint8_t status, uint16_t len, printf("confirm_name succeeded for %s\n", addr); } +static char *eir_get_name(const uint8_t *eir, uint16_t eir_len) +{ + uint8_t parsed = 0; + + if (eir_len < 2) + return NULL; + + while (parsed < eir_len - 1) { + uint8_t field_len = eir[0]; + + if (field_len == 0) + break; + + parsed += field_len + 1; + + if (parsed > eir_len) + break; + + /* Check for short of complete name */ + if (eir[1] == 0x09 || eir[1] == 0x08) + return strndup((char *) &eir[2], field_len - 1); + + eir += field_len + 1; + } + + return NULL; +} + static void device_found(uint16_t index, uint16_t len, const void *param, void *user_data) { const struct mgmt_ev_device_found *ev = param; struct mgmt *mgmt = user_data; - uint32_t flags; uint16_t eir_len; - struct eir_data eir; + uint32_t flags; if (len < sizeof(*ev)) { fprintf(stderr, @@ -336,23 +362,22 @@ static void device_found(uint16_t index, uint16_t len, const void *param, return; } - memset(&eir, 0, sizeof(eir)); - eir_parse(&eir, ev->eir, eir_len); - if (monitor || discovery) { - char addr[18]; + char addr[18], *name; + ba2str(&ev->addr.bdaddr, addr); printf("hci%u dev_found: %s type %s rssi %d " "flags 0x%04x ", index, addr, typestr(ev->addr.type), ev->rssi, flags); - if (eir.name) - printf("name %s\n", eir.name); + name = eir_get_name(ev->eir, eir_len); + if (name) + printf("name %s\n", name); else printf("eir_len %u\n", eir_len); - } - eir_data_free(&eir); + free(name); + } if (discovery && (flags & MGMT_DEV_FOUND_CONFIRM_NAME)) { struct mgmt_cp_confirm_name cp; -- 2.47.3