X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fbuffer.c;h=a7d89712fc0d931dddd948403f95249a1c7f0c6e;hb=576e99a21c566598d7a701142e439cb283cac24f;hp=0f5c76e7c5238c068faa41fefcdeaf4abe7f6607;hpb=f0a1f78196f75678424712ac36f0a4a46e3e5658;p=chaz%2Ftar diff --git a/src/buffer.c b/src/buffer.c index 0f5c76e..a7d8971 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1,7 +1,7 @@ /* 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. @@ -492,20 +492,20 @@ open_compressed_archive (void) 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 @@ -514,7 +514,7 @@ print_stats (FILE *fp, const char *text, tarlong numbytes) from the archive), EOL is a delimiter to add at the end of the output line. */ int -format_total_stats (FILE *fp, char **formats, int eor, int eol) +format_total_stats (FILE *fp, const char **formats, int eor, int eol) { int n; @@ -524,27 +524,28 @@ format_total_stats (FILE *fp, char **formats, int eor, int eol) 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)); @@ -569,7 +570,7 @@ format_total_stats (FILE *fp, char **formats, int eor, int eol) return n; } -char *default_total_format[] = { +const char *default_total_format[] = { N_("Total bytes read"), /* Amanda 2.4.1p1 looks for "Total bytes written: [0-9][0-9]*". */ N_("Total bytes written"), @@ -667,6 +668,22 @@ init_buffer (void) 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 @@ -687,6 +704,7 @@ _open_archive (enum access_mode wanted_access) /* 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; @@ -730,7 +748,6 @@ _open_archive (enum access_mode wanted_access) enum compress_type type; archive = STDIN_FILENO; - type = check_compressed_archive (&shortfile); if (type != ct_tar && type != ct_none) FATAL_ERROR ((0, 0,