summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2014-01-03 16:45:35 -0500
committerGünther Deschner <gdeschner@redhat.com>2014-01-15 17:55:19 +0100
commit58a39677c961c72b052eae0b9d94b992254d6e10 (patch)
tree2dc2dc5824a1efb20eebe0eb9fcd866b4caaab4a
parentad766e34ade64ba1d9f4fdefb32849d2b330e854 (diff)
downloadgss-proxy-58a39677c961c72b052eae0b9d94b992254d6e10.tar.gz
gss-proxy-58a39677c961c72b052eae0b9d94b992254d6e10.tar.xz
gss-proxy-58a39677c961c72b052eae0b9d94b992254d6e10.zip
Add utility functions to read()/write() safely
Automatically handle short reads due to singals interrupting the process. Signed-off-by: Simo Sorce <simo@redhat.com> Reviewed-by: Günther Deschner <gdeschner@redhat.com>
-rw-r--r--proxy/src/gp_common.h2
-rw-r--r--proxy/src/gp_util.c39
2 files changed, 41 insertions, 0 deletions
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 <stdlib.h>
#include <stdio.h>
#include <errno.h>
+#include <unistd.h>
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;
+}