]> sigrok.org Git - libserialport.git/commitdiff
Add sp_copy_port() function.
authorMartin Ling <redacted>
Mon, 4 Nov 2013 13:42:55 +0000 (13:42 +0000)
committerUwe Hermann <redacted>
Thu, 14 Nov 2013 23:42:39 +0000 (00:42 +0100)
README
libserialport.h
serialport.c

diff --git a/README b/README
index fefbef23ffd15c6ba3ab52005058b8bfb9f27c39..1e7f911367a96191bc469b8f483c12907e20445e 100644 (file)
--- a/README
+++ b/README
@@ -107,16 +107,32 @@ int sp_list_ports(struct sp_port ***list_ptr);
  allocate a variable of type "struct sp_port **" and pass a pointer to this to
  receive the result.
 
- The result should be freed after use by calling sp_free_port_list().
+ The result should be freed after use by calling sp_free_port_list(). If a port
+ from the list is to be used after freeing the list, it must be copied first
+ using sp_copy_port().
 
  Returns: SP_OK on success, SP_ERR_FAIL on failure, SP_ERR_MEM on allocation
           failure, or SP_ERR_ARG if an invalid pointer is passed. If any error
           is returned, the variable pointed to by list_ptr will be set to NULL.
           Otherwise, it will be set to point to the newly allocated array.
 
+int sp_copy_port(const struct sp_port *port, struct sp_port **copy_ptr);
+
+ Makes a new copy of a sp_port structure. The user should allocate a variable
+ of type "struct sp_port *" and pass a pointer to this to receive the result.
+
+ The copy should be freed after use by calling sp_free_port().
+
+ Returns: SP_OK on success, SP_ERR_MEM on allocation failure, or SP_ERR_ARG
+          if an invalid port or pointer is passed. If any error is returned,
+          the variable pointed to by copy_ptr will be set to NULL. Otherwise,
+          it will be set to point to the newly allocated copy.
+
 void sp_free_port_list(struct sp_port **list);
 
- Frees a port list obtained from sp_list_ports().
+ Frees a port list obtained from sp_list_ports(). This will also free all
+ the sp_port structures referred to from the list; any that are to be retained
+ must be copied first using sp_copy_port().
 
 Opening and closing ports
 -------------------------
index ac583e9431772094e928e29278ae8989f6b7c35d..5f1f2c6e58dc0567575199c85e3cb00081bc7bec 100644 (file)
@@ -82,6 +82,7 @@ enum {
 int sp_get_port_by_name(const char *portname, struct sp_port **port_ptr);
 void sp_free_port(struct sp_port *port);
 int sp_list_ports(struct sp_port ***list_ptr);
+int sp_copy_port(const struct sp_port *port, struct sp_port **copy_ptr);
 void sp_free_port_list(struct sp_port **ports);
 int sp_open(struct sp_port *port, int flags);
 int sp_close(struct sp_port *port);
index c891006ea19a622bc27d1794f8207ea142bd5c75..f7e946b44d4f850dd22f2280ac718321b7cc3f78 100644 (file)
@@ -50,6 +50,9 @@ int sp_get_port_by_name(const char *portname, struct sp_port **port_ptr)
        struct sp_port *port;
        int len;
 
+       if (!port_ptr)
+               return SP_ERR_ARG;
+
        *port_ptr = NULL;
 
        if (!portname)
@@ -73,6 +76,19 @@ int sp_get_port_by_name(const char *portname, struct sp_port **port_ptr)
        return SP_OK;
 }
 
+int sp_copy_port(const struct sp_port *port, struct sp_port **copy_ptr)
+{
+       if (!copy_ptr)
+               return SP_ERR_ARG;
+
+       *copy_ptr = NULL;
+
+       if (!port || !port->name)
+               return SP_ERR_ARG;
+
+       return sp_get_port_by_name(port->name, copy_ptr);
+}
+
 void sp_free_port(struct sp_port *port)
 {
        if (!port)