GNU/Hurd: retry EINTR returns from pipe I/O
[exim.git] / src / src / transport.c
index 14bd91cdb3e2160c0ee47f65a2c2a8e302e07cc0..c4f3745096205ab29b300667b0bc14e6e53a1ac1 100644 (file)
@@ -1254,16 +1254,24 @@ if ((write_pid = fork()) == 0)
   rc = internal_transport_write_message(tctx, size_limit);
 
   save_errno = errno;
-  if (  write(pfd[pipe_write], (void *)&rc, sizeof(BOOL))
-        != sizeof(BOOL)
-     || write(pfd[pipe_write], (void *)&save_errno, sizeof(int))
-        != sizeof(int)
-     || write(pfd[pipe_write], (void *)&tctx->addr->more_errno, sizeof(int))
-        != sizeof(int)
-     || write(pfd[pipe_write], (void *)&tctx->addr->delivery_usec, sizeof(int))
-        != sizeof(int)
-     )
-    rc = FALSE;        /* compiler quietening */
+  errno = 0;
+  for (int retries = 10;;)
+    {
+    if (  os_pipe_write(pfd[pipe_write], (void *)&rc, sizeof(BOOL))
+         != sizeof(BOOL)
+       || os_pipe_write(pfd[pipe_write], (void *)&save_errno, sizeof(int))
+         != sizeof(int)
+       || os_pipe_write(pfd[pipe_write], (void *)&tctx->addr->more_errno, sizeof(int))
+         != sizeof(int)
+       || os_pipe_write(pfd[pipe_write], (void *)&tctx->addr->delivery_usec, sizeof(int))
+         != sizeof(int)
+       )
+      if (errno == EINTR && --retries > 0)
+       continue;
+      else
+       rc = FALSE;     /* compiler quietening */
+    break;
+    }
   exim_underbar_exit(0);
   }
 save_errno = errno;
@@ -1376,7 +1384,7 @@ if (write_pid > 0)
     if (rc == 0)
       {
       BOOL ok;
-      if (read(pfd[pipe_read], (void *)&ok, sizeof(BOOL)) != sizeof(BOOL))
+      if (os_pipe_read(pfd[pipe_read], (void *)&ok, sizeof(BOOL)) != sizeof(BOOL))
        {
        DEBUG(D_transport)
          debug_printf("pipe read from writing process: %s\n", strerror(errno));
@@ -1385,9 +1393,9 @@ if (write_pid > 0)
        }
       else if (!ok)
         {
-       int dummy = read(pfd[pipe_read], (void *)&save_errno, sizeof(int));
-        dummy = read(pfd[pipe_read], (void *)&tctx->addr->more_errno, sizeof(int));
-        dummy = read(pfd[pipe_read], (void *)&tctx->addr->delivery_usec, sizeof(int));
+       int dummy = os_pipe_read(pfd[pipe_read], (void *)&save_errno, sizeof(int));
+        dummy = os_pipe_read(pfd[pipe_read], (void *)&tctx->addr->more_errno, sizeof(int));
+        dummy = os_pipe_read(pfd[pipe_read], (void *)&tctx->addr->delivery_usec, sizeof(int));
        dummy = dummy;          /* compiler quietening */
         yield = FALSE;
         }