From 58a39677c961c72b052eae0b9d94b992254d6e10 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Fri, 3 Jan 2014 16:45:35 -0500 Subject: Add utility functions to read()/write() safely MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Automatically handle short reads due to singals interrupting the process. Signed-off-by: Simo Sorce Reviewed-by: Günther Deschner --- proxy/src/gp_common.h | 2 ++ proxy/src/gp_util.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/proxy/src/gp_common.h b/proxy/src/gp_common.h index f2b8c3e..3a1b7be 100644 --- a/proxy/src/gp_common.h +++ b/proxy/src/gp_common.h @@ -69,6 +69,8 @@ bool gp_same(const char *a, const char *b); bool gp_boolean_is_true(const char *s); char *gp_getenv(const char *name); +ssize_t gp_safe_read(int fd, void *buf, size_t count); +ssize_t gp_safe_write(int fd, const void *buf, size_t count); /* NOTE: read the note in gp_util.c before using gp_strerror() */ char *gp_strerror(int errnum); diff --git a/proxy/src/gp_util.c b/proxy/src/gp_util.c index 4fbac4e..34f3024 100644 --- a/proxy/src/gp_util.c +++ b/proxy/src/gp_util.c @@ -29,6 +29,7 @@ #include #include #include +#include bool gp_same(const char *a, const char *b) { @@ -125,3 +126,41 @@ char *gp_strerror(int errnum) errno = saved_errno; return buf; } + +ssize_t gp_safe_read(int fd, void *buf, size_t count) +{ + char *b = (char *)buf; + ssize_t len = 0; + ssize_t ret; + + do { + ret = read(fd, &b[len], count - len); + if (ret == -1) { + if (errno == EINTR) continue; + return ret; + } + if (ret == 0) break; /* EOF */ + len += ret; + } while (count > len); + + return len; +} + +ssize_t gp_safe_write(int fd, const void *buf, size_t count) +{ + const char *b = (const char *)buf; + ssize_t len = 0; + ssize_t ret; + + do { + ret = write(fd, &b[len], count - len); + if (ret == -1) { + if (errno == EINTR) continue; + return ret; + } + if (ret == 0) break; /* EOF */ + len += ret; + } while (count > len); + + return len; +} -- cgit