summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2016-04-04 13:17:34 +0100
committerPádraig Brady <P@draigBrady.com>2016-04-21 21:34:00 +0100
commit0f5d784bc6c8f63be70cffeaaa88aaca740c3bf6 (patch)
tree00970cc61ea104fdb908a45628693ee79ce4f7b2
parent2ef621251992bc0b9fbc9ada98606996047ed8a3 (diff)
downloadcoreutils-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.c2
-rwxr-xr-xtests/misc/yes.sh19
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