svn commit: r209152 - head/usr.bin/tar
Tim Kientzle
kientzle at FreeBSD.org
Mon Jun 14 02:56:46 UTC 2010
Author: kientzle
Date: Mon Jun 14 02:56:45 2010
New Revision: 209152
URL: http://svn.freebsd.org/changeset/base/209152
Log:
If the compressed data is larger than the uncompressed,
report the compression ratio as 0% instead of displaying
nonsense triggered by numeric overflow. This is common
when dealing with uncompressed files when the I/O blocking
causes there to be small transient differences in the
accounting.
Thanks to: Boris Samorodov
Modified:
head/usr.bin/tar/read.c
head/usr.bin/tar/write.c
Modified: head/usr.bin/tar/read.c
==============================================================================
--- head/usr.bin/tar/read.c Mon Jun 14 02:31:53 2010 (r209151)
+++ head/usr.bin/tar/read.c Mon Jun 14 02:56:45 2010 (r209152)
@@ -103,6 +103,7 @@ progress_func(void *cookie)
struct archive *a = progress_data->archive;
struct archive_entry *entry = progress_data->entry;
uint64_t comp, uncomp;
+ int compression;
if (!need_report())
return;
@@ -112,9 +113,13 @@ progress_func(void *cookie)
if (a != NULL) {
comp = archive_position_compressed(a);
uncomp = archive_position_uncompressed(a);
+ if (comp > uncomp)
+ compression = 0;
+ else
+ compression = (int)((uncomp - comp) * 100 / uncomp);
fprintf(stderr,
"In: %s bytes, compression %d%%;",
- tar_i64toa(comp), (int)((uncomp - comp) * 100 / uncomp));
+ tar_i64toa(comp), compression);
fprintf(stderr, " Out: %d files, %s bytes\n",
archive_file_count(a), tar_i64toa(uncomp));
}
Modified: head/usr.bin/tar/write.c
==============================================================================
--- head/usr.bin/tar/write.c Mon Jun 14 02:31:53 2010 (r209151)
+++ head/usr.bin/tar/write.c Mon Jun 14 02:56:45 2010 (r209152)
@@ -965,15 +965,21 @@ report_write(struct bsdtar *bsdtar, stru
struct archive_entry *entry, int64_t progress)
{
uint64_t comp, uncomp;
+ int compression;
+
if (bsdtar->verbose)
fprintf(stderr, "\n");
comp = archive_position_compressed(a);
uncomp = archive_position_uncompressed(a);
fprintf(stderr, "In: %d files, %s bytes;",
archive_file_count(a), tar_i64toa(uncomp));
+ if (comp > uncomp)
+ compression = 0;
+ else
+ compression = (int)((uncomp - comp) * 100 / uncomp);
fprintf(stderr,
" Out: %s bytes, compression %d%%\n",
- tar_i64toa(comp), (int)((uncomp - comp) * 100 / uncomp));
+ tar_i64toa(comp), compression);
/* Can't have two calls to tar_i64toa() pending, so split the output. */
safe_fprintf(stderr, "Current: %s (%s",
archive_entry_pathname(entry),
More information about the svn-src-head
mailing list