mirror of
https://git.savannah.gnu.org/git/tar.git
synced 2026-07-19 14:32:22 +00:00
(<human.h>): Include.
(print_total_written): Also print human-readable byte count, and bytes/s. (open_archive, flush_write): Use start_time, not current time. (flush_read): Report about garbage bytes ignored at end of archive, but act on non-garbage bytes (instead of ignoring them). (new_volume): Use WARN for warnings.
This commit is contained in:
+56
-45
@@ -38,6 +38,7 @@ time_t time ();
|
||||
#endif
|
||||
|
||||
#include <fnmatch.h>
|
||||
#include <human.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "rmt.h"
|
||||
@@ -152,9 +153,27 @@ myfork (void)
|
||||
void
|
||||
print_total_written (void)
|
||||
{
|
||||
fprintf (stderr, _("Total bytes written: "));
|
||||
fprintf (stderr, TARLONG_FORMAT, prev_written + bytes_written);
|
||||
fprintf (stderr, "\n");
|
||||
tarlong written = prev_written + bytes_written;
|
||||
char bytes[sizeof (tarlong) * CHAR_BIT];
|
||||
char abbr[LONGEST_HUMAN_READABLE + 1];
|
||||
char rate[LONGEST_HUMAN_READABLE + 1];
|
||||
double seconds;
|
||||
|
||||
#if HAVE_CLOCK_GETTIME
|
||||
struct timespec now;
|
||||
if (clock_gettime (CLOCK_REALTIME, &now) == 0)
|
||||
seconds = ((now.tv_sec - start_timespec.tv_sec)
|
||||
+ (now.tv_nsec - start_timespec.tv_nsec) / 1e9);
|
||||
else
|
||||
#endif
|
||||
seconds = time (0) - start_time;
|
||||
|
||||
sprintf (bytes, TARLONG_FORMAT, written);
|
||||
fprintf (stderr, _("Total written: %s bytes (%sB, %sB/s)\n"), bytes,
|
||||
human_readable ((uintmax_t) written, abbr, 1, -1024),
|
||||
(0 < seconds && written / seconds < (uintmax_t) -1
|
||||
? human_readable ((uintmax_t) (written / seconds), rate, 1, -1024)
|
||||
: "?"));
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------.
|
||||
@@ -866,7 +885,7 @@ open_archive (enum access_mode access)
|
||||
assign_string (¤t_file_name, record_start->header.name);
|
||||
|
||||
record_start->header.typeflag = GNUTYPE_VOLHDR;
|
||||
TIME_TO_CHARS (time (0), record_start->header.mtime);
|
||||
TIME_TO_CHARS (start_time, record_start->header.mtime);
|
||||
finish_header (record_start);
|
||||
#if 0
|
||||
current_block++;
|
||||
@@ -961,7 +980,7 @@ flush_write (void)
|
||||
{
|
||||
memset (record_start, 0, BLOCKSIZE);
|
||||
sprintf (record_start->header.name, "%s Volume %d", volume_label_option, volno);
|
||||
TIME_TO_CHARS (time (0), record_start->header.mtime);
|
||||
TIME_TO_CHARS (start_time, record_start->header.mtime);
|
||||
record_start->header.typeflag = GNUTYPE_VOLHDR;
|
||||
finish_header (record_start);
|
||||
}
|
||||
@@ -1118,7 +1137,7 @@ flush_read (void)
|
||||
}
|
||||
}
|
||||
|
||||
error_loop:
|
||||
error_loop:
|
||||
status = rmtread (archive, record_start->buffer, record_size);
|
||||
if (status == record_size)
|
||||
return;
|
||||
@@ -1190,8 +1209,8 @@ error_loop:
|
||||
global_volno--;
|
||||
goto try_volume;
|
||||
}
|
||||
s1 = UINTMAX_FROM_CHARS (cursor->header.size);
|
||||
s2 = UINTMAX_FROM_CHARS (cursor->oldgnu_header.offset);
|
||||
s1 = UINTMAX_FROM_HEADER (cursor->header.size);
|
||||
s2 = UINTMAX_FROM_HEADER (cursor->oldgnu_header.offset);
|
||||
if (real_s_totsize != s1 + s2 || s1 + s2 < s2)
|
||||
{
|
||||
char totsizebuf[UINTMAX_STRSIZE_BOUND];
|
||||
@@ -1208,7 +1227,7 @@ error_loop:
|
||||
goto try_volume;
|
||||
}
|
||||
if (real_s_totsize - real_s_sizeleft
|
||||
!= OFF_FROM_CHARS (cursor->oldgnu_header.offset))
|
||||
!= OFF_FROM_HEADER (cursor->oldgnu_header.offset))
|
||||
{
|
||||
WARN ((0, 0, _("This volume is out of sequence")));
|
||||
volno--;
|
||||
@@ -1226,49 +1245,41 @@ error_loop:
|
||||
goto error_loop; /* try again */
|
||||
}
|
||||
|
||||
short_read:
|
||||
short_read:
|
||||
more = record_start->buffer + status;
|
||||
left = record_size - status;
|
||||
|
||||
again:
|
||||
if (left % BLOCKSIZE == 0)
|
||||
while (left % BLOCKSIZE != 0)
|
||||
{
|
||||
/* FIXME: for size=0, multi-volume support. On the first record, warn
|
||||
about the problem. */
|
||||
while ((status = rmtread (archive, more, left)) < 0)
|
||||
read_error ();
|
||||
|
||||
if (!read_full_records_option && verbose_option
|
||||
&& record_start_block == 0 && status > 0)
|
||||
WARN ((0, 0, _("Record size = %lu blocks"),
|
||||
(unsigned long) (status / BLOCKSIZE)));
|
||||
if (status == 0)
|
||||
{
|
||||
ERROR ((0, 0, _("%d garbage bytes ignored at end of archive"),
|
||||
(int) ((record_size - left) % BLOCKSIZE)));
|
||||
break;
|
||||
}
|
||||
|
||||
record_end = record_start + (record_size - left) / BLOCKSIZE;
|
||||
|
||||
return;
|
||||
}
|
||||
if (read_full_records_option)
|
||||
{
|
||||
if (! read_full_records_option)
|
||||
FATAL_ERROR ((0, 0, _("Unaligned block (%lu bytes) in archive"),
|
||||
(unsigned long) (record_size - left)));
|
||||
|
||||
/* User warned us about this. Fix up. */
|
||||
|
||||
if (left > 0)
|
||||
{
|
||||
error2loop:
|
||||
status = rmtread (archive, more, left);
|
||||
if (status < 0)
|
||||
{
|
||||
read_error ();
|
||||
goto error2loop; /* try again */
|
||||
}
|
||||
if (status == 0)
|
||||
FATAL_ERROR ((0, 0, _("Archive %s EOF not on block boundary"),
|
||||
*archive_name_cursor));
|
||||
left -= status;
|
||||
more += status;
|
||||
goto again;
|
||||
}
|
||||
left -= status;
|
||||
more += status;
|
||||
}
|
||||
else
|
||||
FATAL_ERROR ((0, 0, _("Only read %lu bytes from archive %s"),
|
||||
(unsigned long) status, *archive_name_cursor));
|
||||
|
||||
/* FIXME: for size=0, multi-volume support. On the first record, warn
|
||||
about the problem. */
|
||||
|
||||
if (!read_full_records_option && verbose_option
|
||||
&& record_start_block == 0 && status > 0)
|
||||
WARN ((0, 0, _("Record size = %lu blocks"),
|
||||
(unsigned long) ((record_size - left) / BLOCKSIZE)));
|
||||
|
||||
record_end = record_start + (record_size - left) / BLOCKSIZE;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------.
|
||||
@@ -1547,7 +1558,7 @@ new_volume (enum access_mode access)
|
||||
|
||||
if (fgets (input_buffer, sizeof input_buffer, read_file) == 0)
|
||||
{
|
||||
fprintf (stderr, _("EOF where user reply was expected"));
|
||||
WARN ((0, 0, _("EOF where user reply was expected")));
|
||||
|
||||
if (subcommand_option != EXTRACT_SUBCOMMAND
|
||||
&& subcommand_option != LIST_SUBCOMMAND
|
||||
@@ -1577,7 +1588,7 @@ new_volume (enum access_mode access)
|
||||
case 'q':
|
||||
/* Quit. */
|
||||
|
||||
fprintf (stdlis, _("No new volume; exiting.\n"));
|
||||
WARN ((0, 0, _("No new volume; exiting.\n")));
|
||||
|
||||
if (subcommand_option != EXTRACT_SUBCOMMAND
|
||||
&& subcommand_option != LIST_SUBCOMMAND
|
||||
|
||||
Reference in New Issue
Block a user