(start_header): Store long file names

in "path" keyword of an extended header if in POSIX
mode.
(finish_header): print header before calling write_extended().
This commit is contained in:
Sergey Poznyakoff
2003-09-03 00:02:32 +00:00
parent 01f19e973b
commit ce059f3cc8

View File

@@ -469,10 +469,16 @@ start_header (const char *name, struct tar_stat_info *st)
union block *header;
name = safer_name_suffix (name, 0);
assign_string (&st->file_name, name);
if (sizeof header->header.name <= strlen (name))
write_long (name, GNUTYPE_LONGNAME);
{
if (archive_format == POSIX_FORMAT)
xheader_store ("path", st);
else
write_long (name, GNUTYPE_LONGNAME);
}
header = find_next_block ();
memset (header->buffer, 0, sizeof (union block));
@@ -629,6 +635,22 @@ finish_header (union block *header, off_t block_ordinal)
int sum;
char *p;
/* Note: It is important to do this before the call to write_extended(),
so that the actual ustar header is printed */
if (verbose_option
&& header->header.typeflag != GNUTYPE_LONGLINK
&& header->header.typeflag != GNUTYPE_LONGNAME
&& header->header.typeflag != XHDTYPE
&& header->header.typeflag != XGLTYPE)
{
/* These globals are parameters to print_header, sigh. */
current_header = header;
/* current_stat_info is already set up. */
current_format = archive_format;
print_header (block_ordinal);
}
header = write_extended (header, XHDTYPE);
memcpy (header->header.chksum, CHKBLANKS, sizeof header->header.chksum);
@@ -651,18 +673,6 @@ finish_header (union block *header, off_t block_ordinal)
uintmax_to_chars ((uintmax_t) sum, header->header.chksum, 7);
if (verbose_option
&& header->header.typeflag != GNUTYPE_LONGLINK
&& header->header.typeflag != GNUTYPE_LONGNAME)
{
/* These globals are parameters to print_header, sigh. */
current_header = header;
/* current_stat_info is already set up. */
current_format = archive_format;
print_header (block_ordinal);
}
set_next_block_after (header);
}