(pax_dump_header): Store original sparse file name
in GNU.sparse.name variable. The name field in the ustar header now contains generated name (%d/GNUSparseFile.%p/%f), so that non-pax-aware tars won't extract the file under the original filename.
This commit is contained in:
15
src/sparse.c
15
src/sparse.c
@@ -886,11 +886,12 @@ pax_dump_header (struct tar_sparse_file *file)
|
||||
size_t i;
|
||||
char nbuf[UINTMAX_STRSIZE_BOUND];
|
||||
struct sp_array *map = file->stat_info->sparse_map;
|
||||
|
||||
char *save_file_name = NULL;
|
||||
|
||||
/* Store the real file size */
|
||||
xheader_store ("GNU.sparse.size", file->stat_info, NULL);
|
||||
xheader_store ("GNU.sparse.numblocks", file->stat_info, NULL);
|
||||
|
||||
|
||||
/* FIXME-1.14-1.15.1-1.20: See the comment above.
|
||||
Starting with 1.17 this should display a warning about POSIX-incompatible
|
||||
keywords being generated. In 1.20, the true branch of the if block below
|
||||
@@ -907,6 +908,11 @@ pax_dump_header (struct tar_sparse_file *file)
|
||||
}
|
||||
else
|
||||
{
|
||||
xheader_store ("GNU.sparse.name", file->stat_info, NULL);
|
||||
save_file_name = file->stat_info->file_name;
|
||||
file->stat_info->file_name = xheader_format_name (file->stat_info,
|
||||
"%d/GNUSparseFile.%p/%f", 0);
|
||||
|
||||
xheader_string_begin ();
|
||||
for (i = 0; i < file->stat_info->sparse_map_avail; i++)
|
||||
{
|
||||
@@ -922,6 +928,11 @@ pax_dump_header (struct tar_sparse_file *file)
|
||||
/* Store the effective (shrunken) file size */
|
||||
OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size);
|
||||
finish_header (file->stat_info, blk, block_ordinal);
|
||||
if (save_file_name)
|
||||
{
|
||||
free (file->stat_info->file_name);
|
||||
file->stat_info->file_name = save_file_name;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user