[libosmocore PATCH v3] src/serial.c: Add serial helper read and write function

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

Alvaro Neira anayuso at sysmocom.de
Thu Feb 13 12:10:37 UTC 2014


From: Álvaro Neira Ayuso <anayuso at sysmocom.de>

This patch provide two new functions for reading and writing
from the serial interface. I think this two functions makes it
easy reading and writing from the serial interface.

Signed-off-by: Alvaro Neira Ayuso <anayuso at sysmocom.de>
---
v3: Fixed the bug that i send errno when in this case errno don't return anything. 
Fixed some format error for having consistency  with the others function and now, 
I control when read function return the value 0 for saying the end of the file.

v2: Fixed the write function for don't supposing that i will write
all the msg in one time. I have studied the limit in the read function
and i have used the -errno like the other functions inside serial.c for
having consistency. The previous version, i have supposed that we need
to liberate the info in case of error, now if we have a error we can
check the info that we have received or we must to send again.

 include/osmocom/core/serial.h |    4 +++
 src/serial.c                  |   53 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 57 insertions(+)

diff --git a/include/osmocom/core/serial.h b/include/osmocom/core/serial.h
index 1640a6d..056010b 100644
--- a/include/osmocom/core/serial.h
+++ b/include/osmocom/core/serial.h
@@ -33,10 +33,14 @@
 
 #include <termios.h>
 
+struct msgb;
+
 int osmo_serial_init(const char *dev, speed_t baudrate);
 int osmo_serial_set_baudrate(int fd, speed_t baudrate);
 int osmo_serial_set_custom_baudrate(int fd, int baudrate);
 int osmo_serial_clear_custom_baudrate(int fd);
+int osmo_serial_write(int fd, struct msgb *msg);
+int osmo_serial_read(int fd, struct msgb *msg, int numbytes);
 
 /*! @} */
 
diff --git a/src/serial.c b/src/serial.c
index 66ee756..8c28e7a 100644
--- a/src/serial.c
+++ b/src/serial.c
@@ -43,6 +43,7 @@
 #endif
 
 #include <osmocom/core/serial.h>
+#include <osmocom/core/msgb.h>
 
 
 #if 0
@@ -226,4 +227,56 @@ osmo_serial_clear_custom_baudrate(int fd)
 	return 0;
 }
 
+/*! \brief Read data from Serial interface
+ *  \param[in] fd File descriptor of the open device
+ *  \param[in] msg Struct where we save the info
+ *  \param[in] numbytes Number of bytes that we want read
+ *  \returns 0 for success or negative errno.
+ */
+int
+osmo_serial_read(int fd, struct msgb *msg, int numbytes)
+{
+	int rc, bread = 0;
+
+	if (numbytes > msg->data_len)
+		return -ENOSPC;
+
+	while (bread < numbytes) {
+		rc = read(fd, msg->tail, numbytes - bread);
+		if (rc < 0)
+			return -errno;
+		if (rc == 0)
+			break;
+
+		bread += rc;
+		msgb_put(msg, rc);
+	}
+
+	return bread;
+}
+
+/*! \brief Write data to Serial interface
+ *  \param[in] fd File descriptor of the open device
+ *  \param[in] msg Struct where we have the info for writing
+ *  \returns 0 for success or negative errno.
+ *
+ * The msgb->data pointer is updated when consuming this message
+ */
+int
+osmo_serial_write(int fd, struct msgb *msg)
+{
+	int rc, bwritten = 0;
+
+	while (msg->len > 0) {
+		rc = write(fd, msg->data, msg->len);
+		if (rc < 0)
+			return -errno;
+
+		msgb_pull(msg, rc);
+		bwritten += rc;
+	}
+
+	return bwritten;
+}
+
 /*! @} */





More information about the OpenBSC mailing list