Fix libusb_get_device_list return value
authorDaniel Drake <dsd@gentoo.org>
Sat, 3 May 2008 23:51:59 +0000 (00:51 +0100)
committerDaniel Drake <dsd@gentoo.org>
Sat, 3 May 2008 23:51:59 +0000 (00:51 +0100)
It was documented to return the list length, but was returning 0.

examples/lsusb.c
libusb/core.c
libusb/libusb.h

index 9aad2bf..193b23a 100644 (file)
@@ -39,14 +39,15 @@ int main(void)
 {
        libusb_device **devs;
        int r;
+       size_t cnt;
 
        r = libusb_init();
        if (r < 0)
                return r;
 
-       r = libusb_get_device_list(&devs);
-       if (r < 0)
-               return r;
+       cnt = libusb_get_device_list(&devs);
+       if (cnt < 0)
+               return (int) cnt;
 
        print_devs(devs);
        libusb_free_device_list(devs, 1);
index 479f919..59df43e 100644 (file)
@@ -80,8 +80,8 @@ pthread_mutex_t usbi_open_devs_lock = PTHREAD_MUTEX_INITIALIZER;
 // discover devices
 libusb_device **list;
 libusb_device *found = NULL;
-int cnt = libusb_get_device_list(&list);
-int i = 0;
+size_t cnt = libusb_get_device_list(&list);
+size_t i = 0;
 if (cnt < 0)
        error();
 
@@ -281,12 +281,16 @@ struct libusb_device *usbi_get_device_by_session_id(unsigned long session_id)
  * not to unreference a device you are about to open until after you have
  * opened it.
  *
+ * This return value of this function indicates the number of devices in
+ * the resultant list. The list is actually one element larger, as it is
+ * NULL-terminated.
+ *
  * \param list output location for a list of devices. Must be later freed with
  * libusb_free_device_list().
  * \returns the number of devices in the outputted list, or LIBUSB_ERROR_NO_MEM
  * on memory allocation failure.
  */
-API_EXPORTED int libusb_get_device_list(libusb_device ***list)
+API_EXPORTED size_t libusb_get_device_list(libusb_device ***list)
 {
        struct discovered_devs *discdevs = discovered_devs_alloc();
        struct libusb_device **ret;
@@ -299,14 +303,16 @@ API_EXPORTED int libusb_get_device_list(libusb_device ***list)
                return LIBUSB_ERROR_NO_MEM;
 
        r = usbi_backend->get_device_list(&discdevs);
-       if (r < 0)
+       if (r < 0) {
+               len = r;
                goto out;
+       }
 
        /* convert discovered_devs into a list */
        len = discdevs->len;
        ret = malloc(sizeof(void *) * (len + 1));
        if (!ret) {
-               r = LIBUSB_ERROR_NO_MEM;
+               len = LIBUSB_ERROR_NO_MEM;
                goto out;
        }
 
@@ -319,7 +325,7 @@ API_EXPORTED int libusb_get_device_list(libusb_device ***list)
 
 out:
        discovered_devs_free(discdevs);
-       return r;
+       return len;
 }
 
 /** \ingroup dev
index dc88a16..b69dd7f 100644 (file)
@@ -635,7 +635,7 @@ struct libusb_transfer {
 int libusb_init(void);
 void libusb_exit(void);
 
-int libusb_get_device_list(libusb_device ***list);
+size_t libusb_get_device_list(libusb_device ***list);
 void libusb_free_device_list(libusb_device **list, int unref_devices);
 const struct libusb_device_descriptor *libusb_get_device_descriptor(
        libusb_device *dev);