On AIX 5.1, 7.1 and IRIX 6.5, the pipe-filter-ii test fails like this: ./test-pipe-filter-ii1: write to tr subprocess failed: Resource temporarily unavailable FAIL: test-pipe-filter-ii1.sh
This fixes it. 2011-06-05 Bruno Haible <br...@clisp.org> pipe-filter-ii: Fix test failure on AIX and IRIX. * lib/pipe-filter-ii.c (pipe_filter_ii_execute): When write() fails with EAGAIN, retry with a smaller buffer size. *** lib/pipe-filter-ii.c.orig Sun Jun 5 19:12:12 2011 --- lib/pipe-filter-ii.c Sun Jun 5 18:57:39 2011 *************** *** 347,367 **** const void *buf = prepare_write (&bufsize, private_data); if (buf != NULL) { ! ssize_t nwritten = ! write (fd[1], buf, ! bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize); ! if (nwritten < 0) { ! if (!IS_EAGAIN (errno)) { ! if (exit_on_error) ! error (EXIT_FAILURE, errno, ! _("write to %s subprocess failed"), progname); ! goto fail; } } - else if (nwritten > 0) - done_write ((void *) buf, nwritten, private_data); } else { --- 347,388 ---- const void *buf = prepare_write (&bufsize, private_data); if (buf != NULL) { ! /* Writing to a pipe in non-blocking mode is tricky: The ! write() call may fail with EAGAIN, simply because suffcient ! space is not available in the pipe. See POSIX:2008 ! <http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html>. ! This happens actually on AIX and IRIX, when bufsize >= 8192 ! (even though PIPE_BUF and pathconf ("/", _PC_PIPE_BUF) are ! both 32768). */ ! size_t attempt_to_write = ! (bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize); ! for (;;) { ! ssize_t nwritten = write (fd[1], buf, attempt_to_write); ! if (nwritten < 0) { ! if (errno == EAGAIN) ! { ! attempt_to_write = attempt_to_write / 2; ! if (attempt_to_write == 0) ! break; ! } ! else if (!IS_EAGAIN (errno)) ! { ! if (exit_on_error) ! error (EXIT_FAILURE, errno, ! _("write to %s subprocess failed"), ! progname); ! goto fail; ! } ! } ! else ! { ! if (nwritten > 0) ! done_write ((void *) buf, nwritten, private_data); ! break; } } } else { -- In memoriam Eduard Lederer <http://de.wikipedia.org/wiki/Eduard_Lederer>