|
|
diff --git a/NEWS b/NEWS |
|
|
index 8aeae33..8f3c416 100644 |
|
|
--- a/NEWS |
|
|
+++ b/NEWS |
|
|
@@ -1,10 +1,15 @@ |
|
|
GNU tar NEWS - User visible changes. 2012-11-19 |
|
|
Please send GNU tar bug reports to <bug-tar@gnu.org> |
|
|
|
|
|
+** Sparse files with large data |
|
|
+ |
|
|
+When creating a PAX-format archive, tar no longer arbitrarily restricts |
|
|
+the size of the representation of a sparse file to be less than 8 GiB. |
|
|
+ |
|
|
|
|
|
version 1.26 - Sergey Poznyakoff, 2011-03-12 |
|
|
|
|
|
-* Bugfixes |
|
|
+* Bug fixes |
|
|
|
|
|
** Fix the --verify option, which broke in version 1.24. |
|
|
|
|
|
diff --git a/src/sparse.c b/src/sparse.c |
|
|
index 4b2f982..cfd0c66 100644 |
|
|
--- a/src/sparse.c |
|
|
+++ b/src/sparse.c |
|
|
@@ -919,6 +919,18 @@ pax_sparse_member_p (struct tar_sparse_file *file) |
|
|
|| file->stat_info->sparse_major > 0; |
|
|
} |
|
|
|
|
|
+/* Start a header that uses the effective (shrunken) file size. */ |
|
|
+static union block * |
|
|
+pax_start_header (struct tar_stat_info *st) |
|
|
+{ |
|
|
+ off_t realsize = st->stat.st_size; |
|
|
+ union block *blk; |
|
|
+ st->stat.st_size = st->archive_file_size; |
|
|
+ blk = start_header (st); |
|
|
+ st->stat.st_size = realsize; |
|
|
+ return blk; |
|
|
+} |
|
|
+ |
|
|
static bool |
|
|
pax_dump_header_0 (struct tar_sparse_file *file) |
|
|
{ |
|
|
@@ -968,9 +980,7 @@ pax_dump_header_0 (struct tar_sparse_file *file) |
|
|
return false; |
|
|
} |
|
|
} |
|
|
- blk = start_header (file->stat_info); |
|
|
- /* Store the effective (shrunken) file size */ |
|
|
- OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size); |
|
|
+ blk = pax_start_header (file->stat_info); |
|
|
finish_header (file->stat_info, blk, block_ordinal); |
|
|
if (save_file_name) |
|
|
{ |
|
|
@@ -1035,9 +1045,7 @@ pax_dump_header_1 (struct tar_sparse_file *file) |
|
|
if (strlen (file->stat_info->file_name) > NAME_FIELD_SIZE) |
|
|
file->stat_info->file_name[NAME_FIELD_SIZE] = 0; |
|
|
|
|
|
- blk = start_header (file->stat_info); |
|
|
- /* Store the effective (shrunken) file size */ |
|
|
- OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size); |
|
|
+ blk = pax_start_header (file->stat_info); |
|
|
finish_header (file->stat_info, blk, block_ordinal); |
|
|
free (file->stat_info->file_name); |
|
|
file->stat_info->file_name = save_file_name;
|
|
|
|