From f72c03f81c6d2cbf5510838a8ae0c99a11f43048 Mon Sep 17 00:00:00 2001 From: Denis 'GNUtoo' Carikli Date: Tue, 16 Feb 2021 13:28:10 +0100 Subject: samsung-ipc/utils: add data_read and data_write 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 --- samsung-ipc/utils.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'samsung-ipc') 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 +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) { -- cgit v1.2.3