aboutsummaryrefslogtreecommitdiffstats
path: root/src/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.c')
-rw-r--r--src/util.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/src/util.c b/src/util.c
index f73634a..5cbe44b 100644
--- a/src/util.c
+++ b/src/util.c
@@ -82,7 +82,11 @@ void* nread(int fd, size_t* n)
got = read(fd, buf + *n, size - *n);
if (got < 0)
- goto fail;
+ {
+ if (errno == EINTR)
+ continue;
+ goto fail;
+ }
if (got == 0)
break;
*n += (size_t)got;
@@ -99,6 +103,39 @@ void* nread(int fd, size_t* n)
/**
+ * Write an entire buffer to a file
+ *
+ * Not cancelled by `EINTR`
+ *
+ * @param fd The file descriptor
+ * @param buf The buffer which shall be written to the fail
+ * @param n The size of the buffer
+ * @return The number of written bytes, less than `n`
+ * on error, cannot exceed `n`
+ */
+size_t nwrite(int fd, const void* buf, size_t n)
+{
+ const char* bs = buf;
+ ssize_t wrote;
+ size_t ptr = 0;
+
+ while (ptr < n)
+ {
+ wrote = write(fd, bs + ptr, n - ptr);
+ if (wrote <= 0)
+ {
+ if ((wrote < 0) && (errno == EINTR))
+ continue;
+ return ptr;
+ }
+ ptr += (size_t)wrote;
+ }
+
+ return ptr;
+}
+
+
+/**
* Duplicate a file descriptor an make sure
* the new file descriptor's index as a
* specified minimum value