X-Git-Url: https://git.exim.org/users/jgh/exim.git/blobdiff_plain/f8f40a64d41c4d47b974810320ab257e2eac0cf3..2791749f220602482c2cce772e6520c54218c0dd:/src/src/transport.c diff --git a/src/src/transport.c b/src/src/transport.c index 14bd91cdb..c4f374509 100644 --- a/src/src/transport.c +++ b/src/src/transport.c @@ -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; }