summaryrefslogtreecommitdiff
path: root/libaltos
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2018-01-13 21:29:08 -0800
committerKeith Packard <keithp@keithp.com>2018-01-13 21:29:08 -0800
commit54e8e033ccf47526e5ff08f93c105ef75334924e (patch)
tree896996da5eba01ba4ccab0cd5deca8015f57a115 /libaltos
parentb95db5819885da89504d5e11decfda98cfac37aa (diff)
libaltos: Use case-insensitive compare when matching BT MACs
We use the BT MAC vendor portion to figure out which port to connect to as that is simpler and takes less network traffic than actually doing discovery. However, on Windows, we were generating the address in lower case and comparing against upper case vendors, which didn't work out too well. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'libaltos')
-rw-r--r--libaltos/libaltos_common.c31
-rw-r--r--libaltos/libaltos_windows.c4
2 files changed, 25 insertions, 10 deletions
diff --git a/libaltos/libaltos_common.c b/libaltos/libaltos_common.c
index f577de02..713a775c 100644
--- a/libaltos/libaltos_common.c
+++ b/libaltos/libaltos_common.c
@@ -76,24 +76,39 @@ altos_putchar(struct altos_file *file, char c)
}
struct bt_vendor_map {
- char vendor[10];
- int port;
+ const char vendor[10];
+ int port;
};
static const struct bt_vendor_map altos_bt_vendor_map[] = {
{ .vendor = "00:12:6f:", 1 }, /* Rayson */
- { .vendor = "8C:DE:52:", 6 }, /* ISSC */
- { .vendor = "D8:80:39:", 6 }, /* Microchip */
+ { .vendor = "8c:de:52:", 6 }, /* ISSC */
+ { .vendor = "d8:80:39:", 6 }, /* Microchip */
};
#define NUM_BT_VENDOR_MAP (sizeof altos_bt_vendor_map / sizeof altos_bt_vendor_map[0])
#define BT_PORT_DEFAULT 1
+static inline int
+ao_tolower(int c) {
+ if ('A' <= c && c <= 'Z')
+ return c + 'a' - 'A';
+ return c;
+}
+
int altos_bt_port(struct altos_bt_device *device) {
- unsigned i;
- for (i = 0; i < NUM_BT_VENDOR_MAP; i++)
- if (strncmp (device->addr, altos_bt_vendor_map[i].vendor, strlen(altos_bt_vendor_map[i].vendor)) == 0)
- return altos_bt_vendor_map[i].port;
+ unsigned i, j;
+ for (i = 0; i < NUM_BT_VENDOR_MAP; i++) {
+ const char *vendor = altos_bt_vendor_map[i].vendor;
+ for (j = 0; ; j++) {
+ if (vendor[j] == '\0')
+ return altos_bt_vendor_map[i].port;
+ if (device->addr[j] == '\0')
+ break;
+ if (ao_tolower(device->addr[j]) != vendor[j])
+ break;
+ }
+ }
return BT_PORT_DEFAULT;
}
diff --git a/libaltos/libaltos_windows.c b/libaltos/libaltos_windows.c
index 4f9f1807..846e2217 100644
--- a/libaltos/libaltos_windows.c
+++ b/libaltos/libaltos_windows.c
@@ -639,7 +639,7 @@ static void
ba2str(BTH_ADDR ba, char *str)
{
- sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x",
+ sprintf(str, "%02X:%02X:%02X:%02X:%02X:%02X",
get_byte(ba, 0),
get_byte(ba, 1),
get_byte(ba, 2),
@@ -755,8 +755,8 @@ altos_bt_open(struct altos_bt_device *device)
altos_set_last_winsock_error();
closesocket(file->socket);
free(file);
+ log_message("Connection attempted to address %s port %d\n", device->addr, sockaddr_bth.port);
return NULL;
}
return &file->file;
}
-