/* Buffer management for tar.
- Copyright 1988, 1992-1994, 1996-1997, 1999-2010, 2013 Free Software
- Foundation, Inc.
+ Copyright 1988, 1992-1994, 1996-1997, 1999-2010, 2013-2014 Free
+ Software Foundation, Inc.
This file is part of GNU tar.
static int
print_stats (FILE *fp, const char *text, tarlong numbytes)
{
- char bytes[sizeof (tarlong) * CHAR_BIT];
char abbr[LONGEST_HUMAN_READABLE + 1];
char rate[LONGEST_HUMAN_READABLE + 1];
-
+ int n = 0;
+
int human_opts = human_autoscale | human_base_1024 | human_SI | human_B;
- sprintf (bytes, TARLONG_FORMAT, numbytes);
-
- return fprintf (fp, "%s: %s (%s, %s/s)",
- text, bytes,
- human_readable (numbytes, abbr, human_opts, 1, 1),
- (0 < duration && numbytes / duration < (uintmax_t) -1
- ? human_readable (numbytes / duration, rate, human_opts, 1, 1)
- : "?"));
+ if (text && text[0])
+ n += fprintf (fp, "%s: ", gettext (text));
+ return n + fprintf (fp, TARLONG_FORMAT " (%s, %s/s)",
+ numbytes,
+ human_readable (numbytes, abbr, human_opts, 1, 1),
+ (0 < duration && numbytes / duration < (uintmax_t) -1
+ ? human_readable (numbytes / duration, rate, human_opts, 1, 1)
+ : "?"));
}
/* Format totals to file FP. FORMATS is an array of strings to output
case CAT_SUBCOMMAND:
case UPDATE_SUBCOMMAND:
case APPEND_SUBCOMMAND:
- n = print_stats (fp, _(formats[TF_WRITE]),
+ n = print_stats (fp, formats[TF_WRITE],
prev_written + bytes_written);
break;
case DELETE_SUBCOMMAND:
{
char buf[UINTMAX_STRSIZE_BOUND];
- n = print_stats (fp, _(formats[TF_READ]),
+ n = print_stats (fp, formats[TF_READ],
records_read * record_size);
fputc (eor, fp);
n++;
- n += print_stats (fp, _(formats[TF_WRITE]),
+ n += print_stats (fp, formats[TF_WRITE],
prev_written + bytes_written);
fputc (eor, fp);
n++;
-
- n += fprintf (fp, "%s: %s",
- _(formats[TF_DELETED]),
+
+ if (formats[TF_DELETED] && formats[TF_DELETED][0])
+ n += fprintf (fp, "%s: ", gettext (formats[TF_DELETED]));
+ n += fprintf (fp, "%s",
STRINGIFY_BIGINT ((records_read - records_skipped)
* record_size
- (prev_written + bytes_written), buf));
record_end = record_start + blocking_factor;
}
+static void
+check_tty (enum access_mode mode)
+{
+ /* Refuse to read archive from and write it to a tty. */
+ if (strcmp (archive_name_array[0], "-") == 0
+ && isatty (mode == ACCESS_READ ? STDIN_FILENO : STDOUT_FILENO))
+ {
+ FATAL_ERROR ((0, 0,
+ mode == ACCESS_READ
+ ? _("Refusing to read archive contents from terminal "
+ "(missing -f option?)")
+ : _("Refusing to write archive contents to terminal "
+ "(missing -f option?)")));
+ }
+}
+
/* Open an archive file. The argument specifies whether we are
reading or writing, or both. */
static void
/* When updating the archive, we start with reading. */
access_mode = wanted_access == ACCESS_UPDATE ? ACCESS_READ : wanted_access;
+ check_tty (access_mode);
read_full_records = read_full_records_option;
enum compress_type type;
archive = STDIN_FILENO;
-
type = check_compressed_archive (&shortfile);
if (type != ct_tar && type != ct_none)
FATAL_ERROR ((0, 0,