Fix libusb_get_device_list return value

It was documented to return the list length, but was returning 0.
This commit is contained in:
Daniel Drake 2008-05-04 00:51:59 +01:00
parent a74106a9b4
commit 5878daa85e
3 changed files with 17 additions and 10 deletions

View 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);

View 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

View 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);