]> sigrok.org Git - libsigrok.git/blobdiff - hardware/common/serial.c
serial: Fix leak in serial_open.
[libsigrok.git] / hardware / common / serial.c
index 66d8b9252a605a043abc6e232b2b9776d8dfc9a1..05e6f3b4eb4768c4e244582e18d7944c092b49f4 100644 (file)
@@ -22,7 +22,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <glib.h>
-#include <serialport.h>
+#include <libserialport.h>
 #include "libsigrok.h"
 #include "libsigrok-internal.h"
 
@@ -63,16 +63,15 @@ SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags)
 
        ret = sp_open(serial->data, flags);
 
-       switch (ret)
-       {
-               case SP_ERR_ARG:
-                       sr_err("Attempt to open serial port with invalid parameters.");
-                       return SR_ERR_ARG;
-               case SP_ERR_FAIL:
-                       error = sp_last_error_message();
-                       sr_err("Error opening port: %s.", error);
-                       sp_free_error_message(error);
-                       return SR_ERR;
+       switch (ret) {
+       case SP_ERR_ARG:
+               sr_err("Attempt to open serial port with invalid parameters.");
+               return SR_ERR_ARG;
+       case SP_ERR_FAIL:
+               error = sp_last_error_message();
+               sr_err("Error opening port: %s.", error);
+               sp_free_error_message(error);
+               return SR_ERR;
        }
 
 #ifndef _WIN32
@@ -109,25 +108,24 @@ SR_PRIV int serial_close(struct sr_serial_dev_inst *serial)
        }
 
        sr_spew("Closing serial port %s (fd %d).", serial->port, serial->fd);
-       ret = SR_OK;
 
        ret = sp_close(serial->data);
+       sp_free_port(serial->data);
 
-       switch (ret)
-       {
-               case SP_ERR_ARG:
-                       sr_err("Attempt to close an invalid serial port.");
-                       return SR_ERR_ARG;
-               case SP_ERR_FAIL:
-                       error = sp_last_error_message();
-                       sr_err("Error closing port: %s.", error);
-                       sp_free_error_message(error);
-                       return SR_ERR;
+       switch (ret) {
+       case SP_ERR_ARG:
+               sr_err("Attempt to close an invalid serial port.");
+               return SR_ERR_ARG;
+       case SP_ERR_FAIL:
+               error = sp_last_error_message();
+               sr_err("Error closing port: %s.", error);
+               sp_free_error_message(error);
+               return SR_ERR;
        }
 
        serial->fd = -1;
 
-       return ret;
+       return SR_OK;
 }
 
 /**
@@ -157,19 +155,18 @@ SR_PRIV int serial_flush(struct sr_serial_dev_inst *serial)
 
        ret = sp_flush(serial->data);
 
-       switch (ret)
-       {
-               case SP_ERR_ARG:
-                       sr_err("Attempt to flush an invalid serial port.");
-                       return SR_ERR_ARG;
-               case SP_ERR_FAIL:
-                       error = sp_last_error_message();
-                       sr_err("Error flushing port: %s.", error);
-                       sp_free_error_message(error);
-                       return SR_ERR;
+       switch (ret) {
+       case SP_ERR_ARG:
+               sr_err("Attempt to flush an invalid serial port.");
+               return SR_ERR_ARG;
+       case SP_ERR_FAIL:
+               error = sp_last_error_message();
+               sr_err("Error flushing port: %s.", error);
+               sp_free_error_message(error);
+               return SR_ERR;
        }
 
-       return ret;
+       return SR_OK;
 }
 
 /**
@@ -179,7 +176,7 @@ SR_PRIV int serial_flush(struct sr_serial_dev_inst *serial)
  * @param buf Buffer containing the bytes to write.
  * @param count Number of bytes to write.
  *
- * @return The number of bytes written, or -1 upon failure.
+ * @return The number of bytes written, or a negative error code upon failure.
  */
 SR_PRIV int serial_write(struct sr_serial_dev_inst *serial,
                const void *buf, size_t count)
@@ -189,27 +186,26 @@ SR_PRIV int serial_write(struct sr_serial_dev_inst *serial,
 
        if (!serial) {
                sr_dbg("Invalid serial port.");
-               return -1;
+               return SR_ERR;
        }
 
        if (serial->fd == -1) {
                sr_dbg("Cannot use unopened serial port %s (fd %d).",
                                serial->port, serial->fd);
-               return -1;
+               return SR_ERR;
        }
 
        ret = sp_write(serial->data, buf, count);
 
-       switch (ret)
-       {
-               case SP_ERR_ARG:
-                       sr_err("Attempted serial port write with invalid arguments.");
-                       return SR_ERR_ARG;
-               case SP_ERR_FAIL:
-                       error = sp_last_error_message();
-                       sr_err("Write error: %s.", error);
-                       sp_free_error_message(error);
-                       return SR_ERR;
+       switch (ret) {
+       case SP_ERR_ARG:
+               sr_err("Attempted serial port write with invalid arguments.");
+               return SR_ERR_ARG;
+       case SP_ERR_FAIL:
+               error = sp_last_error_message();
+               sr_err("Write error: %s.", error);
+               sp_free_error_message(error);
+               return SR_ERR;
        }
 
        sr_spew("Wrote %d/%d bytes (fd %d).", ret, count, serial->fd);
@@ -224,7 +220,7 @@ SR_PRIV int serial_write(struct sr_serial_dev_inst *serial,
  * @param buf Buffer where to store the bytes that are read.
  * @param count The number of bytes to read.
  *
- * @return The number of bytes read, or -1 upon failure.
+ * @return The number of bytes read, or a negative error code upon failure.
  */
 SR_PRIV int serial_read(struct sr_serial_dev_inst *serial, void *buf,
                size_t count)
@@ -234,27 +230,27 @@ SR_PRIV int serial_read(struct sr_serial_dev_inst *serial, void *buf,
 
        if (!serial) {
                sr_dbg("Invalid serial port.");
-               return -1;
+               return SR_ERR;
        }
 
        if (serial->fd == -1) {
                sr_dbg("Cannot use unopened serial port %s (fd %d).",
                                serial->port, serial->fd);
-               return -1;
+               return SR_ERR;
        }
 
        ret = sp_read(serial->data, buf, count);
 
-       switch (ret)
-       {
-               case SP_ERR_ARG:
-                       sr_err("Attempted serial port read with invalid arguments.");
-                       return SR_ERR_ARG;
-               case SP_ERR_FAIL:
-                       error = sp_last_error_message();
-                       sr_err("Read error: %s.", error);
-                       sp_free_error_message(error);
-                       return SR_ERR;
+       switch (ret) {
+       case SP_ERR_ARG:
+               sr_err("Attempted serial port read with invalid arguments.");
+               return SR_ERR_ARG;
+       // Temporarily disabled, will come back later.
+       // case SP_ERR_FAIL:
+       //      error = sp_last_error_message();
+       //      sr_err("Read error: %s.", error);
+       //      sp_free_error_message(error);
+       //      return SR_ERR;
        }
 
        sr_spew("Read %d/%d bytes (fd %d).", ret, count, serial->fd);
@@ -299,16 +295,15 @@ SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, int baudrate,
        ret = sp_set_params(serial->data, baudrate, bits, parity, stopbits,
                        flowcontrol, rts, dtr);
 
-       switch (ret)
-       {
-               case SP_ERR_ARG:
-                       sr_err("Invalid arguments for setting serial port parameters.");
-                       return SR_ERR_ARG;
-               case SP_ERR_FAIL:
-                       error = sp_last_error_message();
-                       sr_err("Error setting serial port parameters: %s.", error);
-                       sp_free_error_message(error);
-                       return SR_ERR;
+       switch (ret) {
+       case SP_ERR_ARG:
+               sr_err("Invalid arguments for setting serial port parameters.");
+               return SR_ERR_ARG;
+       case SP_ERR_FAIL:
+               error = sp_last_error_message();
+               sr_err("Error setting serial port parameters: %s.", error);
+               sp_free_error_message(error);
+               return SR_ERR;
        }
 
        return SR_OK;