X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fusb.c;h=9c34b38ad1bdb204d89c5a16f2631c11fb7617f0;hb=f44f7e61a37f0b42dc06e85278b0b152ddc70ab2;hp=1c9e4118ebc0ad96e35e01cbadaf654e547c50bc;hpb=db156e5409b44bb90a81c1fcd160c2313fc156a0;p=libsigrok.git diff --git a/src/usb.c b/src/usb.c index 1c9e4118..9c34b38a 100644 --- a/src/usb.c +++ b/src/usb.c @@ -271,27 +271,40 @@ SR_PRIV int usb_source_remove(struct sr_session *session, struct sr_context *ctx return SR_OK; } -SR_PRIV int usb_get_port_path(libusb_device *dev, const char *path, int path_len) +SR_PRIV int usb_get_port_path(libusb_device *dev, char *path, int path_len) { - gchar s[64]; - gchar tmp_s[8]; - uint8_t port_numbers[32]; - int i; - - memset(port_numbers, 0, sizeof(port_numbers)); - libusb_get_port_numbers(dev, port_numbers, sizeof(port_numbers)); - - g_snprintf((gchar*)&s, sizeof(s), "usb/%d-%d", - libusb_get_bus_number(dev), port_numbers[0]); - - i = 1; - while (port_numbers[i]) { - g_snprintf(tmp_s, sizeof(tmp_s), ".%d", port_numbers[i]); - g_strlcat((gchar*)&s, tmp_s, sizeof(s)); - i++; + 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]); - g_strlcpy((gchar*)path, s, path_len); + for (i = 1; i < n; i++) + len += snprintf(path+len, path_len-len, ".%d", port_numbers[i]); return SR_OK; }