Clean up on error
[libftdi] / examples / baud_test.c
index b53031b..d744a42 100644 (file)
@@ -12,7 +12,7 @@
  *       s:<vendor>:<product>:<serial> first device with given vendor id, product id and serial string
  *  -d <datasize to send in bytes>
  *  -b <baudrate> (divides by 16 if bitbang as taken from the ftdi datasheets)
- *  -m <mode to use> r: serial a: async bitbang s:sync bitbang 
+ *  -m <mode to use> r: serial a: async bitbang s:sync bitbang
  *  -c <chunksize>
  *
  * (C) 2009 by Gerd v. Egidy <gerd.von.egidy@intra2net.com>
@@ -39,7 +39,7 @@ double get_prec_time()
 {
     struct timeval tv;
     double res;
-    
+
     gettimeofday(&tv,NULL);
 
     res=tv.tv_sec;
@@ -55,6 +55,7 @@ int main(int argc, char **argv)
     unsigned char *txbuf;
     unsigned char *rxbuf;
     double start, duration, plan;
+    int retval= 0;
 
     // default values
     int baud=9600;
@@ -65,7 +66,7 @@ int main(int argc, char **argv)
     char *devicedesc=default_devicedesc;
     int txchunksize=256;
     enum ftdi_mpsse_mode test_mode=BITMODE_BITBANG;
-    
+
     while ((t = getopt (argc, argv, "b:d:p:m:c:")) != -1)
     {
         switch (t)
@@ -74,7 +75,7 @@ int main(int argc, char **argv)
                 datasize = atoi (optarg);
                 break;
             case 'm':
-                switch(*optarg)
+                switch (*optarg)
                 {
                     case 'r':
                         // serial
@@ -113,13 +114,15 @@ int main(int argc, char **argv)
     if (ftdi_init(&ftdic) < 0)
     {
         fprintf(stderr, "ftdi_init failed\n");
-        return EXIT_FAILURE;
+        retval = EXIT_FAILURE;
+        goto done;
     }
 
     if (ftdi_usb_open_string(&ftdic, devicedesc) < 0)
     {
         fprintf(stderr,"Can't open ftdi device: %s\n",ftdi_get_error_string(&ftdic));
-        return EXIT_FAILURE;
+        retval = EXIT_FAILURE;
+        goto do_deinit;
     }
 
     set_baud=baud;
@@ -135,7 +138,8 @@ int main(int argc, char **argv)
     if (ftdi_set_bitmode(&ftdic, 0xFF,test_mode) < 0)
     {
         fprintf(stderr,"Can't set mode: %s\n",ftdi_get_error_string(&ftdic));
-        return EXIT_FAILURE;
+        retval = EXIT_FAILURE;
+        goto do_close;
     }
 
     if (test_mode==BITMODE_RESET)
@@ -162,16 +166,17 @@ int main(int argc, char **argv)
     }
 
     if (ftdi_write_data_set_chunksize(&ftdic, txchunksize) < 0 ||
-        ftdi_read_data_set_chunksize(&ftdic, txchunksize) < 0)
+            ftdi_read_data_set_chunksize(&ftdic, txchunksize) < 0)
     {
         fprintf(stderr,"Can't set chunksize: %s\n",ftdi_get_error_string(&ftdic));
-        return EXIT_FAILURE;
+        retval = EXIT_FAILURE;
+        goto do_close;
     }
 
-    if(test_mode==BITMODE_SYNCBB)
+    if (test_mode==BITMODE_SYNCBB)
     {
         // completely clear the receive buffer before beginning
-        while(ftdi_read_data(&ftdic, rxbuf, txchunksize)>0);
+        while (ftdi_read_data(&ftdic, rxbuf, txchunksize)>0);
     }
 
     start=get_prec_time();
@@ -181,7 +186,7 @@ int main(int argc, char **argv)
     ftdic.usb_read_timeout=1;
 
     i=0;
-    while(i < datasize)
+    while (i < datasize)
     {
         int sendsize=txchunksize;
         if (i+sendsize > datasize)
@@ -191,12 +196,13 @@ int main(int argc, char **argv)
         {
             fprintf(stderr,"write failed at %d: %s\n",
                     i, ftdi_get_error_string(&ftdic));
-            return EXIT_FAILURE;
+            retval = EXIT_FAILURE;
+            goto do_close;
         }
 
         i+=sendsize;
 
-        if(test_mode==BITMODE_SYNCBB)
+        if (test_mode==BITMODE_SYNCBB)
         {
             // read the same amount of data as sent
             ftdi_read_data(&ftdic, rxbuf, sendsize);
@@ -205,8 +211,14 @@ int main(int argc, char **argv)
 
     duration=get_prec_time()-start;
     printf("and took %.4f seconds, this is %.0f baud or factor %.3f\n",duration,(plan*baud)/duration,plan/duration);
-
+do_close:
     ftdi_usb_close(&ftdic);
+do_deinit:
     ftdi_deinit(&ftdic);
+done:
+    if(rxbuf)
+        free(rxbuf);
+    if(txbuf)
+        free(txbuf);
     exit (0);
 }