summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2013-07-18 18:39:55 +0100
committerPádraig Brady <P@draigBrady.com>2013-07-19 11:23:12 +0100
commite6fc265b755eef0eae425caec3f93b8e28dbdddb (patch)
tree45d2cb1dabaa74eb9247ea0fc9f12a2e33e4d04d
parent5fdb50825f598035d52ea8a26be7611e1a906703 (diff)
downloadcoreutils-e6fc265b755eef0eae425caec3f93b8e28dbdddb.tar.xz
dd: make status=none suppress all diagnostics
* src/dd.c (STATUS_NONE): Simplify the enum so that it's more general than just suppressing transfer counts. Then test this in all locations where non fatal diagnostics are output. * tests/dd/misc.sh: Ensure the diagnostic about being unable to skip past the end of input is suppressed. * NEWS: Mention the change in behavior. Fixes http://bugs.gnu.org/14897
-rw-r--r--NEWS3
-rw-r--r--doc/coreutils.texi2
-rw-r--r--src/dd.c39
-rwxr-xr-xtests/dd/misc.sh6
4 files changed, 30 insertions, 20 deletions
diff --git a/NEWS b/NEWS
index 5abaf81f1..62181ec8d 100644
--- a/NEWS
+++ b/NEWS
@@ -51,6 +51,9 @@ GNU coreutils NEWS -*- outline -*-
** Changes in behavior
+ dd status=none now suppresses all non fatal diagnostic messages,
+ not just the transfer counts.
+
stdbuf now requires at least one buffering mode option to be specified,
as per the documented interface.
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
index ca10a16ff..b8d40b4f5 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
@@ -8548,7 +8548,7 @@ that normally make up the last status line.
@item none
@opindex none @r{dd status=}
-Do not print any informational messages to stderr.
+Do not print any informational or warning messages to stderr.
Error messages are output as normal.
@end table
diff --git a/src/dd.c b/src/dd.c
index f727a5ef9..59d6cd1dc 100644
--- a/src/dd.c
+++ b/src/dd.c
@@ -136,9 +136,7 @@ enum
enum
{
STATUS_NOXFER = 01,
- STATUS_NOCOUNTS = 02,
- STATUS_LAST = STATUS_NOCOUNTS,
- STATUS_NONE = STATUS_LAST | (STATUS_LAST - 1)
+ STATUS_NONE = 02
};
/* The name of the input file, or NULL for the standard input. */
@@ -738,7 +736,7 @@ print_stats (void)
double delta_s;
char const *bytes_per_second;
- if ((status_flags & STATUS_NONE) == STATUS_NONE)
+ if (status_flags & STATUS_NONE)
return;
fprintf (stderr,
@@ -1031,12 +1029,13 @@ iread (int fd, char *buf, size_t size)
if (0 < prev_nread && prev_nread < size)
{
uintmax_t prev = prev_nread;
- error (0, 0, ngettext (("warning: partial read (%"PRIuMAX" byte); "
- "suggest iflag=fullblock"),
- ("warning: partial read (%"PRIuMAX" bytes); "
- "suggest iflag=fullblock"),
- select_plural (prev)),
- prev);
+ if (!(status_flags & STATUS_NONE))
+ error (0, 0, ngettext (("warning: partial read (%"PRIuMAX" byte); "
+ "suggest iflag=fullblock"),
+ ("warning: partial read (%"PRIuMAX" bytes); "
+ "suggest iflag=fullblock"),
+ select_plural (prev)),
+ prev);
warn_partial_read = false;
}
@@ -1080,7 +1079,8 @@ iwrite (int fd, char const *buf, size_t size)
if ((output_flags & O_DIRECT) && size < output_blocksize)
{
int old_flags = fcntl (STDOUT_FILENO, F_GETFL);
- if (fcntl (STDOUT_FILENO, F_SETFL, old_flags & ~O_DIRECT) != 0)
+ if (fcntl (STDOUT_FILENO, F_SETFL, old_flags & ~O_DIRECT) != 0
+ && !(status_flags & STATUS_NONE))
error (0, errno, _("failed to turn off O_DIRECT: %s"),
quote (output_file));
@@ -1573,9 +1573,11 @@ skip_via_lseek (char const *filename, int fdesc, off_t offset, int whence)
&& ioctl (fdesc, MTIOCGET, &s2) == 0
&& MT_SAME_POSITION (s1, s2))
{
- error (0, 0, _("warning: working around lseek kernel bug for file (%s)\n\
- of mt_type=0x%0lx -- see <sys/mtio.h> for the list of types"),
- filename, s2.mt_type);
+ if (!(status_flags & STATUS_NONE))
+ error (0, 0, _("warning: working around lseek kernel bug for file "
+ "(%s)\n of mt_type=0x%0lx -- "
+ "see <sys/mtio.h> for the list of types"),
+ filename, s2.mt_type);
errno = 0;
new_position = -1;
}
@@ -1745,7 +1747,7 @@ advance_input_after_read_error (size_t nbytes)
if (offset == input_offset)
return true;
diff = input_offset - offset;
- if (! (0 <= diff && diff <= nbytes))
+ if (! (0 <= diff && diff <= nbytes) && !(status_flags & STATUS_NONE))
error (0, 0, _("warning: invalid file offset after failed read"));
if (0 <= skip_via_lseek (input_file, STDIN_FILENO, diff, SEEK_CUR))
return true;
@@ -1943,7 +1945,8 @@ dd_copy (void)
1. file is too small
2. pipe has not enough data
3. partial reads */
- if (us_blocks || (!input_offset_overflow && us_bytes))
+ if ((us_blocks || (!input_offset_overflow && us_bytes))
+ && !(status_flags & STATUS_NONE))
{
error (0, 0,
_("%s: cannot skip to specified offset"), quote (input_file));
@@ -2010,7 +2013,9 @@ dd_copy (void)
if (nread < 0)
{
- error (0, errno, _("error reading %s"), quote (input_file));
+ if (!(conversions_mask & C_NOERROR) || !(status_flags & STATUS_NONE))
+ error (0, errno, _("error reading %s"), quote (input_file));
+
if (conversions_mask & C_NOERROR)
{
print_stats ();
diff --git a/tests/dd/misc.sh b/tests/dd/misc.sh
index b9ad31ab0..1f53b3a37 100755
--- a/tests/dd/misc.sh
+++ b/tests/dd/misc.sh
@@ -32,10 +32,12 @@ ln -s $tmp_in $tmp_sym || framework_failure_
# check status=none suppresses all output to stderr
dd status=none if=$tmp_in of=/dev/null 2> err || fail=1
-test -s err && fail=1
+test -s err && { cat err; fail=1; }
+dd status=none if=$tmp_in skip=2 of=/dev/null 2> err || fail=1
+test -s err && { cat err; fail=1; }
# check status=none is cumulative with status=noxfer
dd status=none status=noxfer if=$tmp_in of=/dev/null 2> err || fail=1
-test -s err && fail=1
+test -s err && { cat err; fail=1; }
dd if=$tmp_in of=$tmp_out 2> /dev/null || fail=1
compare $tmp_in $tmp_out || fail=1