[Replicant] [PATCH v2 1/4] samsung-ipc/utils: add data_read and data_write

Denis 'GNUtoo' Carikli GNUtoo at cyberdimension.org
Tue Feb 23 14:37:03 UTC 2021


These wrappers are meant to handle the case where read or writes
handles a smaller number of bytes than requested.

This way that handling doesn't need to be duplicated everywhere
in libsamsung-ipc.

Having access to the ipc_client struct could enable future
logging of read and writes without having to change any of the
code already using data_read and data_write.

Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo at cyberdimension.org>
---
 include/samsung-ipc.h |  3 +++
 samsung-ipc/utils.c   | 43 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/include/samsung-ipc.h b/include/samsung-ipc.h
index 25106c6..53f1f72 100644
--- a/include/samsung-ipc.h
+++ b/include/samsung-ipc.h
@@ -154,6 +154,9 @@ int ipc_rfs_header_setup(struct ipc_rfs_header *header,
 int ipc_rfs_message_setup(const struct ipc_rfs_header *header,
 			  struct ipc_message *message);
 
+ssize_t data_read(struct ipc_client *client, int fd, void *buf, size_t count);
+ssize_t data_write(struct ipc_client *client, int fd, const void *buf,
+		   size_t count);
 void *file_data_read(struct ipc_client *client, const char *path, size_t size,
 		     size_t chunk_size, unsigned int offset);
 int file_data_write(struct ipc_client *client, const char *path,
diff --git a/samsung-ipc/utils.c b/samsung-ipc/utils.c
index c0734ac..44cbe2d 100644
--- a/samsung-ipc/utils.c
+++ b/samsung-ipc/utils.c
@@ -38,6 +38,49 @@
 
 #include <samsung-ipc.h>
 
+ssize_t data_read(__attribute__((unused)) struct ipc_client *client, int fd,
+		  void *buf, size_t count)
+{
+	/* From read(2): "According  to POSIX.1, if count is greater than
+	 * SSIZE_MAX, the result is implementation-defined"
+	 */
+	ssize_t remaining = (ssize_t)count;
+
+	while (remaining > 0) {
+		ssize_t rc;
+
+		rc = read(fd, buf, count);
+		if (rc == -1)
+			/* errno is passed to the caller */
+			return rc;
+		remaining -= rc;
+	}
+
+	return count;
+}
+
+ssize_t data_write(__attribute__((unused)) struct ipc_client *client, int fd,
+		   const void *buf, size_t count)
+{
+	/* From write(2): "According  to POSIX.1, if count is greater than
+	 * SSIZE_MAX, the result is implementation-defined"
+	 */
+	ssize_t remaining = (ssize_t)count;
+
+	while (remaining > 0) {
+		ssize_t rc;
+
+		rc = write(fd, buf, count);
+		if (rc == -1)
+			/* errno is passed to the caller */
+			return rc;
+		remaining -= rc;
+	}
+
+	return count;
+
+}
+
 void *file_data_read(struct ipc_client *client, const char *path, size_t size,
 		     size_t chunk_size, unsigned int offset)
 {
-- 
2.30.1



More information about the Replicant mailing list