From 0f5d784bc6c8f63be70cffeaaa88aaca740c3bf6 Mon Sep 17 00:00:00 2001 From: Pádraig Brady Date: Mon, 4 Apr 2016 13:17:34 +0100 Subject: yes: avoid redundant diagnostics on write error * src/yes.c (main): For large inputs only write a single diagnostic for write errors. * tests/misc/yes.sh: Test when /dev/full is available. --- src/yes.c | 2 ++ tests/misc/yes.sh | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/yes.c b/src/yes.c index 31424cf20..1d2c612c9 100644 --- a/src/yes.c +++ b/src/yes.c @@ -121,6 +121,7 @@ main (int argc, char **argv) if ((pbuf - buf) && fwrite (buf, pbuf - buf, 1, stdout) != 1) { error (0, errno, _("standard output")); + clearerr (stdout); return EXIT_FAILURE; } for (j = i; j < argc; j++) @@ -128,6 +129,7 @@ main (int argc, char **argv) || putchar (j == argc - 1 ? '\n' : ' ') == EOF) { error (0, errno, _("standard output")); + clearerr (stdout); return EXIT_FAILURE; } } diff --git a/tests/misc/yes.sh b/tests/misc/yes.sh index 137159334..a3027432b 100755 --- a/tests/misc/yes.sh +++ b/tests/misc/yes.sh @@ -30,9 +30,9 @@ for size in 1 1999 4095 4096 8191 8192 16383 16384; do done # Check the many small items case, -# both fitting and overflowing the internal buffer -external=env -if external true $(seq 4000); then +# both fitting and overflowing the internal buffer. +# First check that 4000 arguments supported. +if test 4000 -eq $(sh -c 'echo $#' 0 $(seq 4000)); then for i in 100 4000; do seq $i | paste -s -d ' ' | sed p > out.1 yes $(seq $i) | head -n2 > out.2 @@ -40,4 +40,17 @@ if external true $(seq 4000); then done fi +# Check a single appropriate diagnostic is output on write error +if test -w /dev/full && test -c /dev/full; then + # The single output diagnostic expected, + # (without the possibly varying :strerror(ENOSPC) suffix). + printf '%s\n' "yes: standard output" > exp + + for size in 1 16384; do + returns_ 1 yes "$(printf %${size}s '')" >/dev/full 2>errt + sed 's/\(yes:.*\):.*/\1/' errt > err + compare exp err || fail=1 + done +fi + Exit $fail -- cgit v1.2.3-54-g00ecf