X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Ftar;a=blobdiff_plain;f=src%2Fbuffer.c;h=95e8a26de1e42a5b2b922300c57dbd3e22db25f0;hp=1452940be72a31fde8caae50cad880d3a4737181;hb=45ccda119355a1087450039a250359c1d0de0d08;hpb=cd7bdd4076ca154575bbef85eb2157e59befcfe2 diff --git a/src/buffer.c b/src/buffer.c index 1452940..95e8a26 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. @@ -247,7 +247,7 @@ set_volume_start_time (void) last_stat_time = volume_start_time; } -void +double compute_duration (void) { struct timespec now; @@ -255,6 +255,7 @@ compute_duration (void) duration += ((now.tv_sec - last_stat_time.tv_sec) + (now.tv_nsec - last_stat_time.tv_nsec) / 1e9); gettime (&last_stat_time); + return duration; } @@ -488,64 +489,98 @@ open_compressed_archive (void) return archive; } - -static 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); - - fprintf (fp, "%s: %s (%s, %s/s)\n", - 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) + : "?")); } -void -print_total_stats (void) +/* Format totals to file FP. FORMATS is an array of strings to output + before each data item (bytes read, written, deleted, in that order). + EOR is a delimiter to output after each item (used only if deleting + from the archive), EOL is a delimiter to add at the end of the output + line. */ +int +format_total_stats (FILE *fp, const char **formats, int eor, int eol) { + int n; + switch (subcommand_option) { case CREATE_SUBCOMMAND: case CAT_SUBCOMMAND: case UPDATE_SUBCOMMAND: case APPEND_SUBCOMMAND: - /* Amanda 2.4.1p1 looks for "Total bytes written: [0-9][0-9]*". */ - print_stats (stderr, _("Total bytes written"), - prev_written + bytes_written); + n = print_stats (fp, formats[TF_WRITE], + prev_written + bytes_written); break; case DELETE_SUBCOMMAND: { char buf[UINTMAX_STRSIZE_BOUND]; - print_stats (stderr, _("Total bytes read"), - records_read * record_size); - print_stats (stderr, _("Total bytes written"), - prev_written + bytes_written); - fprintf (stderr, _("Total bytes deleted: %s\n"), - STRINGIFY_BIGINT ((records_read - records_skipped) - * record_size - - (prev_written + bytes_written), buf)); + n = print_stats (fp, formats[TF_READ], + records_read * record_size); + + fputc (eor, fp); + n++; + + n += print_stats (fp, formats[TF_WRITE], + prev_written + bytes_written); + + fputc (eor, fp); + n++; + + 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)); } break; case EXTRACT_SUBCOMMAND: case LIST_SUBCOMMAND: case DIFF_SUBCOMMAND: - print_stats (stderr, _("Total bytes read"), - records_read * record_size); + n = print_stats (fp, _(formats[TF_READ]), + records_read * record_size); break; default: abort (); } + if (eol) + { + fputc (eol, fp); + n++; + } + return n; +} + +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"), + N_("Total bytes deleted") +}; + +void +print_total_stats (void) +{ + format_total_stats (stderr, default_total_format, '\n', '\n'); } /* Compute and return the block ordinal at current_block. */ @@ -722,9 +757,6 @@ _open_archive (enum access_mode wanted_access) break; } } - else if (verify_option) - archive = rmtopen (archive_name_array[0], O_RDWR | O_CREAT | O_BINARY, - MODE_RW, rsh_command_option); else switch (wanted_access) { @@ -740,8 +772,12 @@ _open_archive (enum access_mode wanted_access) maybe_backup_file (archive_name_array[0], 1); backed_up_flag = 1; } - archive = rmtcreat (archive_name_array[0], MODE_RW, - rsh_command_option); + if (verify_option) + archive = rmtopen (archive_name_array[0], O_RDWR | O_CREAT | O_BINARY, + MODE_RW, rsh_command_option); + else + archive = rmtcreat (archive_name_array[0], MODE_RW, + rsh_command_option); break; case ACCESS_UPDATE: @@ -883,16 +919,16 @@ short_read (size_t status) left = record_size - status; if (left && left % BLOCKSIZE == 0 - && verbose_option + && (warning_option & WARN_RECORD_SIZE) && record_start_block == 0 && status != 0 && archive_is_dev ()) { unsigned long rsize = status / BLOCKSIZE; WARN ((0, 0, - ngettext ("Record size = %lu block", - "Record size = %lu blocks", - rsize), - rsize)); + ngettext ("Record size = %lu block", + "Record size = %lu blocks", + rsize), + rsize)); } while (left % BLOCKSIZE != 0