--- /dev/null
+#!/usr/bin/env bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="write-error"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_HEXDUMP"
+
+[ -c /dev/full ] || ts_skip "/dev/full not found"
+
+$TS_CMD_HEXDUMP -C --no-squeezing -n 1048576 /dev/zero > /dev/full 2> "$TS_ERRLOG"
+rc=$?
+printf "exit code: %d\n" "$rc" >> "$TS_OUTPUT"
+
+ts_finalize
{
struct list_head *p;
struct hexdump_fs *tfs;
- int ret;
+ int ret, stdout_errno;
struct hexdump *hex = xcalloc(1, sizeof (struct hexdump));
hex->length = -1;
display(hex);
ret = hex->exitval;
+ stdout_errno = hex->stdout_errno;
hex_free(hex);
+ if (stdout_errno) {
+ /*
+ * The stream error flag does not preserve errno. Report the
+ * saved write error here and bypass close_stdout_atexit() to
+ * avoid relying on unrelated errno values after cleanup.
+ */
+ errno = stdout_errno;
+ if (stdout_errno != EPIPE)
+ warn(_("write error"));
+ if (flush_standard_stream(stderr) != 0)
+ _exit(EXIT_FAILURE);
+ _exit(ret);
+ }
return ret;
}
struct list_head fshead; /* head of format strings */
ssize_t blocksize; /* data block size */
int exitval; /* final exit value */
+ int stdout_errno; /* errno from stdout error */
ssize_t length; /* max bytes to read */
off_t skip; /* bytes to skip */
/* Sparse file optimization using FIEMAP (Linux only) */