(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:
Sergey Poznyakoff
2006-06-20 15:14:47 +00:00
parent 693134a4e7
commit ca2f855c90

View File

@@ -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;
}