X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fusb.c;h=9c34b38ad1bdb204d89c5a16f2631c11fb7617f0;hb=329733d92c5004f0fe308eff26b9537fded2cdf3;hp=ec502c97501704f38bed9b2d535374166ff7601e;hpb=76bc5f6376104e8b65322011b67aafbd45348fe2;p=libsigrok.git diff --git a/src/usb.c b/src/usb.c index ec502c97..9c34b38a 100644 --- a/src/usb.c +++ b/src/usb.c @@ -276,7 +276,29 @@ SR_PRIV int usb_get_port_path(libusb_device *dev, char *path, int path_len) uint8_t port_numbers[8]; int i, n, len; +/* + * FreeBSD requires that devices prior to calling libusb_get_port_numbers() + * have been opened with libusb_open(). + */ +#ifdef __FreeBSD__ + struct libusb_device_handle *devh; + if (libusb_open(dev, &devh) != 0) + return SR_ERR; +#endif n = libusb_get_port_numbers(dev, port_numbers, sizeof(port_numbers)); +#ifdef __FreeBSD__ + libusb_close(devh); +#endif + +/* Workaround FreeBSD libusb_get_port_numbers() returning 0. */ +#ifdef __FreeBSD__ + if (n == 0) { + port_numbers[0] = libusb_get_device_address(dev); + n = 1; + } +#endif + if (n < 1) + return SR_ERR; len = snprintf(path, path_len, "usb/%d-%d", libusb_get_bus_number(dev), port_numbers[0]);