libftdi: (tomj) fix ftdi_list_free
authorThomas Jarosch <opensource@intra2net.com>
Thu, 19 Apr 2007 11:54:44 +0000 (11:54 +0000)
committerThomas Jarosch <opensource@intra2net.com>
Thu, 19 Apr 2007 11:54:44 +0000 (11:54 +0000)
examples/Makefile.am
examples/find_all.c [new file with mode: 0644]
src/ftdi.c

index 010f860..50820c2 100644 (file)
@@ -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 (file)
index 0000000..9f5d61c
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+    Example for ftdi_usb_find_all()
+*/
+
+#include <stdio.h>
+#include <ftdi.h>
+
+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;
+}
index 950e84e..583944e 100644 (file)
@@ -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;
 }
 
 /**