GNU/Hurd: retry EINTR returns from pipe I/O
[users/heiko/exim.git] / src / OS / os.c-GNU
index e5d6ff66cd7b6f31a1338187eaec4f666e67b09f..06226839b68b051b6e20d432a6a92b0428ceec92 100644 (file)
@@ -52,4 +52,39 @@ return -1;
 }
 #endif  /* OS_LOAD_AVERAGE */
 
+
+ssize_t
+os_pipe_read(int fd, void * buf, size_t count)
+{
+for (int rc, retries = 10; retries > 0; retries--)
+  {
+  if ((rc = read(fd, buf, count) >= 0) break;
+  if (rc != -1 || errno != EINTR) break;
+  }
+return rc;
+}
+
+
+ssize_t
+os_pipe_write(int fd, void * buf, size_t count)
+{
+for (int rc, retries = 10; retries > 0; retries--)
+  {
+  if ((rc = write(fd, buf, count) >= 0) break;
+  if (rc != -1 || errno != EINTR) break;
+  }
+return rc;
+}
+
+ssize_t
+os_pipe_writev(int fd, const struct iovec * iov, int iovcnt
+{
+for (int rc, retries = 10; retries > 0; retries--)
+  {
+  if ((rc = writev(fd, iov, iovcnt) >= 0) break;
+  if (rc != -1 || errno != EINTR) break;
+  }
+return rc;
+}
+
 /* End of os.c-GNU */