Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Jun 2010 02:56:45 +0000 (UTC)
From:      Tim Kientzle <kientzle@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r209152 - head/usr.bin/tar
Message-ID:  <201006140256.o5E2ujXa022350@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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),



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201006140256.o5E2ujXa022350>