From 6db32169ce93f0ec8e5a9b2c299760509ff1ef44 Mon Sep 17 00:00:00 2001 From: Thomas Jarosch Date: Thu, 19 Apr 2007 11:54:44 +0000 Subject: [PATCH] libftdi: (tomj) fix ftdi_list_free --- examples/Makefile.am | 4 +++- examples/find_all.c | 39 +++++++++++++++++++++++++++++++++++++++ src/ftdi.c | 13 ++++++++----- 3 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 examples/find_all.c diff --git a/examples/Makefile.am b/examples/Makefile.am index 010f860..50820c2 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -5,7 +5,8 @@ LDADD = $(top_builddir)/src/libftdi.la bin_PROGRAMS = simple \ bitbang \ bitbang2 \ - bitbang_ft2232 + bitbang_ft2232 \ + find_all # Don't install the example files AM_LDFLAGS = -no-install @@ -14,3 +15,4 @@ simple_SOURCES = simple.c bitbang_SOURCES = bitbang.c bitbang2_SOURCES = bitbang2.c bitbang_ft2232_SOURCES = bitbang_ft2232.c +find_all_SOURCES = find_all.c diff --git a/examples/find_all.c b/examples/find_all.c new file mode 100644 index 0000000..9f5d61c --- /dev/null +++ b/examples/find_all.c @@ -0,0 +1,39 @@ +/* + Example for ftdi_usb_find_all() +*/ + +#include +#include + +int main(int argc, char **argv) +{ + int ret, i; + struct ftdi_context ftdic; + struct ftdi_device_list *devlist, *curdev; + char manufacturer[128], description[128]; + + ftdi_init(&ftdic); + + if((ret = ftdi_usb_find_all(&ftdic, &devlist, 0x0403, 0x6001)) < 0) { + fprintf(stderr, "ftdi_usb_find_all failed: %d (%s)\n", ret, ftdi_get_error_string(&ftdic)); + return EXIT_FAILURE; + } + + printf("Number of FTDI devices found: %d\n", ret); + + i = 0; + for (curdev = devlist; curdev != NULL; i++) { + printf("Checking device: %d\n", i); + if((ret = ftdi_usb_get_strings(&ftdic, curdev->dev, &manufacturer, 128, description, 128, NULL, 0)) < 0) { + fprintf(stderr, "ftdi_usb_get_strings failed: %d (%s)\n", ret, ftdi_get_error_string(&ftdic)); + return EXIT_FAILURE; + } + printf("Manufacturer: %s, Description: %s\n\n", manufacturer, description); + curdev = curdev->next; + } + + ftdi_list_free(&devlist); + ftdi_deinit(&ftdic); + + return EXIT_SUCCESS; +} diff --git a/src/ftdi.c b/src/ftdi.c index 950e84e..583944e 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -158,6 +158,7 @@ int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devli ftdi_error_return(-2, "usb_find_devices() failed"); curdev = devlist; + *curdev = NULL; for (bus = usb_busses; bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { if (dev->descriptor.idVendor == vendor @@ -186,13 +187,15 @@ int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devli */ void ftdi_list_free(struct ftdi_device_list **devlist) { - struct ftdi_device_list **curdev; - for (; *devlist == NULL; devlist = curdev) { - curdev = &(*devlist)->next; - free(*devlist); + struct ftdi_device_list *curdev, *next; + + for (curdev = *devlist; curdev != NULL;) { + next = curdev->next; + free(curdev); + curdev = next; } - devlist = NULL; + *devlist = NULL; } /** -- 1.7.1