diff options
author | Pádraig Brady <P@draigBrady.com> | 2014-01-29 04:42:56 +0000 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2014-02-09 21:37:24 +0000 |
commit | 6e824a66194528696ba265d6111a6bddce4a8ff8 (patch) | |
tree | 13ae36f27040f4db4b220ab753694e00f45aa7d9 /src/tail.c | |
parent | 476ce37019df5b1cb917c5b50e71f9bce5911401 (diff) | |
download | coreutils-6e824a66194528696ba265d6111a6bddce4a8ff8.tar.xz |
head,tail: consistently diagnose write errors
If we can't output more data, we should immediately
diagnose the issue and exit rather than consuming all
of input (in some cases).
* src/tail.c (xwrite_stdout): Also diagnose the case where
only some data is written. Also clearerr() to avoid the
redundant less specific error from atexit (close_stdout);
* src/head.c (xwrite_stdout): Copy this new function from tail,
and use it to write all output.
* tests/misc/head-write-error.sh: A new test to ensure we
exit immediately on write error.
* tests/local.mk: Reference the new test.
Diffstat (limited to 'src/tail.c')
-rw-r--r-- | src/tail.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/tail.c b/src/tail.c index a5268c2c6..5ff738df8 100644 --- a/src/tail.c +++ b/src/tail.c @@ -339,13 +339,6 @@ pretty_name (struct File_spec const *f) return (STREQ (f->name, "-") ? _("standard input") : f->name); } -static void -xwrite_stdout (char const *buffer, size_t n_bytes) -{ - if (n_bytes > 0 && fwrite (buffer, 1, n_bytes, stdout) == 0) - error (EXIT_FAILURE, errno, _("write error")); -} - /* Record a file F with descriptor FD, size SIZE, status ST, and blocking status BLOCKING. */ @@ -385,6 +378,20 @@ write_header (const char *pretty_filename) first_file = false; } +/* Write N_BYTES from BUFFER to stdout. + Exit immediately on error with a single diagnostic. */ + +static void +xwrite_stdout (char const *buffer, size_t n_bytes) +{ + if (n_bytes > 0 && fwrite (buffer, 1, n_bytes, stdout) < n_bytes) + { + clearerr (stdout); /* To avoid redundant close_stdout diagnostic. */ + error (EXIT_FAILURE, errno, _("error writing %s"), + quote ("standard output")); + } +} + /* Read and output N_BYTES of file PRETTY_FILENAME starting at the current position in FD. If N_BYTES is COPY_TO_EOF, then copy until end of file. If N_BYTES is COPY_A_BUFFER, then copy at most one buffer's worth. |