libaltos: Use case-insensitive compare when matching BT MACs
authorKeith Packard <keithp@keithp.com>
Sun, 14 Jan 2018 05:29:08 +0000 (21:29 -0800)
committerKeith Packard <keithp@keithp.com>
Sun, 14 Jan 2018 05:29:08 +0000 (21:29 -0800)
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>
libaltos/libaltos_common.c
libaltos/libaltos_windows.c

index f577de022a16b2de0413c32bde610cf35e6c0083..713a775c6f70c9acee6011705b5aa6256cd06bc2 100644 (file)
@@ -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;
 }
 
index 4f9f18075e02c9744a6f6509ce6a9bcd6567e7d4..846e2217b4c7799ec155cd9870264eb798165b77 100644 (file)
@@ -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;
 }
-