[cmake-developers] [PATCH] cmArchiveWrite: don't store sparse files when using standard tar formats

Roman Donchenko roman.donchenko at itseez.com
Mon Jul 6 10:54:19 EDT 2015


Sparse files in tars are a GNU extension that libarchive will use if it
detects holes in the input file, even when using the standard pax/paxr
formats. Not all tar implementations can handle sparse files; in particular,
the internal implementation dpkg uses to extract packages can't. To
maximize archive portability, turn this feature off by clearing the
sparseness information from archive entries.
---
 Source/cmArchiveWrite.cxx | 11 ++++++++++-
 Source/cmArchiveWrite.h   |  1 +
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/Source/cmArchiveWrite.cxx b/Source/cmArchiveWrite.cxx
index 72818f5..32afde1 100644
--- a/Source/cmArchiveWrite.cxx
+++ b/Source/cmArchiveWrite.cxx
@@ -84,7 +84,8 @@ cmArchiveWrite::cmArchiveWrite(
     Stream(os),
     Archive(archive_write_new()),
     Disk(archive_read_disk_new()),
-    Verbose(false)
+    Verbose(false),
+    Format(format)
 {
   switch (c)
     {
@@ -282,6 +283,14 @@ bool cmArchiveWrite::AddFile(const char* file,
   archive_entry_acl_clear(e);
   archive_entry_xattr_clear(e);
   archive_entry_set_fflags(e, 0, 0);
+
+  if (Format == "pax" || Format == "paxr")
+    {
+    // Sparse files are a GNU tar extension. Don't use them in standard
+    // tar files.
+    archive_entry_sparse_clear(e);
+    }
+
   if(archive_write_header(this->Archive, e) != ARCHIVE_OK)
     {
     this->Error = "archive_write_header: ";
diff --git a/Source/cmArchiveWrite.h b/Source/cmArchiveWrite.h
index 794cb28..e6f515d 100644
--- a/Source/cmArchiveWrite.h
+++ b/Source/cmArchiveWrite.h
@@ -84,6 +84,7 @@ private:
   struct archive* Archive;
   struct archive* Disk;
   bool Verbose;
+  std::string Format;
   std::string Error;
   std::string MTime;
 };
-- 
1.9.1



More information about the cmake-developers mailing list