diff options
author | Pádraig Brady <P@draigBrady.com> | 2016-04-04 13:17:34 +0100 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2016-04-21 21:34:00 +0100 |
commit | 0f5d784bc6c8f63be70cffeaaa88aaca740c3bf6 (patch) | |
tree | 00970cc61ea104fdb908a45628693ee79ce4f7b2 | |
parent | 2ef621251992bc0b9fbc9ada98606996047ed8a3 (diff) | |
download | coreutils-0f5d784bc6c8f63be70cffeaaa88aaca740c3bf6.tar.xz |
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.
-rw-r--r-- | src/yes.c | 2 | ||||
-rwxr-xr-x | tests/misc/yes.sh | 19 |
2 files changed, 18 insertions, 3 deletions
@@ -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 |