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 <gnu...@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 _______________________________________________ Replicant mailing list Replicant@osuosl.org https://lists.osuosl.org/mailman/listinfo/replicant