X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fusb.c;h=02510caed4edca7293410788156521d35be81e61;hb=be64f90b53d09d9720dc6e06ff8ab61d96c03932;hp=d66f188085c94638efea1283b4dd900d4fb9a130;hpb=c2bf5506ee7864975917a7b6e7e93b78226887ce;p=libsigrok.git diff --git a/src/usb.c b/src/usb.c index d66f1880..02510cae 100644 --- a/src/usb.c +++ b/src/usb.c @@ -19,6 +19,7 @@ * along with this program. If not, see . */ +#include #include #include #include @@ -183,6 +184,9 @@ static LIBUSB_CALL void usb_pollfd_added(libusb_os_handle fd, usource = user_data; + if (G_UNLIKELY(g_source_is_destroyed(&usource->base))) + return; + pollfd = g_slice_new(GPollFD); #ifdef G_OS_WIN32 events = G_IO_IN; @@ -192,7 +196,7 @@ static LIBUSB_CALL void usb_pollfd_added(libusb_os_handle fd, pollfd->revents = 0; g_ptr_array_add(usource->pollfds, pollfd); - g_source_add_poll((GSource *)usource, pollfd); + g_source_add_poll(&usource->base, pollfd); } /** Callback invoked when a libusb FD should be removed from the poll set. @@ -205,13 +209,16 @@ static LIBUSB_CALL void usb_pollfd_removed(libusb_os_handle fd, void *user_data) usource = user_data; + if (G_UNLIKELY(g_source_is_destroyed(&usource->base))) + return; + /* It's likely that the removed poll FD is at the end. */ for (i = usource->pollfds->len; G_LIKELY(i > 0); i--) { pollfd = g_ptr_array_index(usource->pollfds, i - 1); if ((libusb_os_handle)pollfd->fd == fd) { - g_source_remove_poll((GSource *)usource, pollfd); + g_source_remove_poll(&usource->base, pollfd); g_ptr_array_remove_index_fast(usource->pollfds, i - 1); return; } @@ -352,7 +359,7 @@ SR_PRIV GSList *sr_usb_find(libusb_context *usb_ctx, const char *conn) return NULL; } - if (bus > 64) { + if (bus > 255) { sr_err("Invalid bus specified: %d.", bus); return NULL; } @@ -477,19 +484,20 @@ SR_PRIV int usb_get_port_path(libusb_device *dev, char *path, int path_len) /* * FreeBSD requires that devices prior to calling libusb_get_port_numbers() * have been opened with libusb_open(). + * This apparently also applies to some Mac OS X versions. */ -#ifdef __FreeBSD__ +#if defined(__FreeBSD__) || defined(__APPLE__) 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__ +#if defined(__FreeBSD__) || defined(__APPLE__) libusb_close(devh); #endif -/* Workaround FreeBSD libusb_get_port_numbers() returning 0. */ -#ifdef __FreeBSD__ +/* Workaround FreeBSD / Mac OS X libusb_get_port_numbers() returning 0. */ +#if defined(__FreeBSD__) || defined(__APPLE__) if (n == 0) { port_numbers[0] = libusb_get_device_address(dev); n = 1;