summaryrefslogtreecommitdiffstats
path: root/proxy/src/gp_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'proxy/src/gp_util.c')
-rw-r--r--proxy/src/gp_util.c39
1 files changed, 39 insertions, 0 deletions
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;
+}