summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorRoman Donchenko <roman.donchenko@itseez.com>2015-07-06 14:54:19 (GMT)
committerBrad King <brad.king@kitware.com>2015-07-06 19:01:08 (GMT)
commitedae40239e64f8ea6c03d28601c9e7403a354f65 (patch)
tree10ff0ca8f2407379c7cde70e9c59203e7329f188 /Source
parent7e86f567aca6b913689dc2d8c17a17936284b811 (diff)
downloadCMake-edae40239e64f8ea6c03d28601c9e7403a354f65.zip
CMake-edae40239e64f8ea6c03d28601c9e7403a354f65.tar.gz
CMake-edae40239e64f8ea6c03d28601c9e7403a354f65.tar.bz2
cmArchiveWrite: do not store sparse files when using standard tar formats
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.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmArchiveWrite.cxx11
-rw-r--r--Source/cmArchiveWrite.h1
2 files changed, 11 insertions, 1 deletions
diff --git a/Source/cmArchiveWrite.cxx b/Source/cmArchiveWrite.cxx
index 72818f5..44d0d4e 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 (this->Format == "pax" || this->Format == "paxr")
+ {
+ // Sparse files are a GNU tar extension.
+ // Do not 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;
};