+#ifdef HAVE_LIBUSB_GET_PORT_NUMBERS
+static bool jtag_libusb_location_equal(libusb_device *device)
+{
+ uint8_t port_path[MAX_USB_PORTS];
+ uint8_t dev_bus;
+ int path_len;
+
+ path_len = libusb_get_port_numbers(device, port_path, MAX_USB_PORTS);
+ if (path_len == LIBUSB_ERROR_OVERFLOW) {
+ LOG_WARNING("cannot determine path to usb device! (more than %i ports in path)\n",
+ MAX_USB_PORTS);
+ return false;
+ }
+ dev_bus = libusb_get_bus_number(device);
+
+ return jtag_usb_location_equal(dev_bus, port_path, path_len);
+}
+#else /* HAVE_LIBUSB_GET_PORT_NUMBERS */
+static bool jtag_libusb_location_equal(libusb_device *device)
+{
+ return true;
+}
+#endif /* HAVE_LIBUSB_GET_PORT_NUMBERS */
+
+
+/* Returns true if the string descriptor indexed by str_index in device matches string */
+static bool string_descriptor_equal(libusb_device_handle *device, uint8_t str_index,
+ const char *string)
+{
+ int retval;
+ bool matched;
+ char desc_string[256+1]; /* Max size of string descriptor */
+
+ if (str_index == 0)
+ return false;
+
+ retval = libusb_get_string_descriptor_ascii(device, str_index,
+ (unsigned char *)desc_string, sizeof(desc_string)-1);
+ if (retval < 0) {
+ LOG_ERROR("libusb_get_string_descriptor_ascii() failed with %d", retval);
+ return false;
+ }
+
+ /* Null terminate descriptor string in case it needs to be logged. */
+ desc_string[sizeof(desc_string)-1] = '\0';
+
+ matched = strncmp(string, desc_string, sizeof(desc_string)) == 0;
+ if (!matched)
+ LOG_DEBUG("Device serial number '%s' doesn't match requested serial '%s'",
+ desc_string, string);
+ return matched;
+}
+