]> sigrok.org Git - libserialport.git/commitdiff
Add sp_get_port_handle() function.
authorMartin Ling <redacted>
Sat, 23 Nov 2013 17:50:45 +0000 (17:50 +0000)
committerMartin Ling <redacted>
Sat, 23 Nov 2013 17:50:45 +0000 (17:50 +0000)
libserialport.h.in
serialport.c

index 2492f68fe23f8b28b21651de4e97b702a6718484..d2dd037ba5749cd2c48e30da1cabfe92f9199265 100644 (file)
@@ -285,6 +285,30 @@ enum sp_return sp_get_port_by_name(const char *portname, struct sp_port **port_p
  */
 char *sp_get_port_name(const struct sp_port *port);
 
+/**
+ * Get the operating system handle for a port.
+ *
+ * The type of the handle depends on the operating system. On Unix based
+ * systems, the handle is a file descriptor of type "int". On Windows, the
+ * handle is of type "HANDLE". The user should allocate a variable of the
+ * appropriate type and pass a pointer to this to receive the result.
+ *
+ * To obtain a valid handle, the port must first be opened by calling
+ * sp_open() using the same port structure.
+ *
+ * After the port is closed or the port structure freed, the handle may
+ * no longer be valid.
+ *
+ * @warning This feature is provided so that programs may make use of
+ *          OS-specific functionality where desired. Obviously this comes
+ *          at a cost in portability, however it also cannot be guaranteed
+ *          that direct usage of the OS handle will not conflict with the
+ *          library's own usage of the port. Be careful.
+ *
+ * @return SP_OK upon success, a negative error code otherwise.
+ */
+enum sp_return sp_get_port_handle(const struct sp_port *port, void *result);
+
 /**
  * Free a port structure obtained from sp_get_port_by_name() or sp_copy_port().
  */
index 0ec664a6122f556772a8235f163971bf019fefde..739a6ed6f9afe06189631cc4e93bf59e7e9e1284 100644 (file)
@@ -203,6 +203,24 @@ char *sp_get_port_name(const struct sp_port *port)
        RETURN_VALUE("%s", port->name);
 }
 
+enum sp_return sp_get_port_handle(const struct sp_port *port, void *result_ptr)
+{
+       TRACE("%p", port);
+
+       if (!port)
+               RETURN_ERROR(SP_ERR_ARG, "Null port");
+
+#ifdef _WIN32
+       HANDLE *handle_ptr = result_ptr;
+       *handle_ptr = port->hdl;
+#else
+       int *fd_ptr = result_ptr;
+       *fd_ptr = port->fd;
+#endif
+
+       RETURN_OK();
+}
+
 enum sp_return sp_copy_port(const struct sp_port *port, struct sp_port **copy_ptr)
 {
        TRACE("%p, %p", port, copy_ptr);