}
/* Write a "private" header */
-static union block *
+union block *
start_private_header (const char *name, size_t size)
{
time_t t;
}
return write_short_name (st);
}
-
+
static union block *
-write_extended (struct tar_stat_info *st, union block *old_header, char type)
+write_extended (struct tar_stat_info *st, union block *old_header)
{
union block *header, hp;
size_t size;
return old_header;
xheader_finish (&extended_header);
- size = extended_header.size;
-
memcpy (hp.buffer, old_header, sizeof (hp));
-
- header = start_private_header (p = xheader_xhdr_name (st), size);
+ p = xheader_xhdr_name (st);
+ xheader_write (XHDTYPE, p, &extended_header);
free (p);
- header->header.typeflag = type;
-
- finish_header (st, header, -1);
-
- p = extended_header.buffer;
-
- do
- {
- size_t len;
-
- header = find_next_block ();
- len = BLOCKSIZE;
- if (len > size)
- len = size;
- memcpy (header->buffer, p, len);
- if (len < BLOCKSIZE)
- memset (header->buffer + len, 0, BLOCKSIZE - len);
- p += len;
- size -= len;
- set_next_block_after (header);
- }
- while (size > 0);
-
- xheader_destroy (&extended_header);
header = find_next_block ();
memcpy (header, &hp.buffer, sizeof (hp.buffer));
return header;
return header;
}
-/* Finish off a filled-in header block and write it out. We also
- print the file name and/or full info if verbose is on. If BLOCK_ORDINAL
- is not negative, is the block ordinal of the first record for this
- file, which may be a preceding long name or long link record. */
void
-finish_header (struct tar_stat_info *st,
- union block *header, off_t block_ordinal)
+simple_finish_header (union block *header)
{
size_t i;
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_format = archive_format;
- print_header (st, block_ordinal);
- }
-
- header = write_extended (st, header, XHDTYPE);
-
memcpy (header->header.chksum, CHKBLANKS, sizeof header->header.chksum);
sum = 0;
set_next_block_after (header);
}
+
+/* Finish off a filled-in header block and write it out. We also
+ print the file name and/or full info if verbose is on. If BLOCK_ORDINAL
+ is not negative, is the block ordinal of the first record for this
+ file, which may be a preceding long name or long link record. */
+void
+finish_header (struct tar_stat_info *st,
+ union block *header, off_t block_ordinal)
+{
+ size_t i;
+ 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_format = archive_format;
+ print_header (st, block_ordinal);
+ }
+
+ header = write_extended (st, header);
+ simple_finish_header (header);
+}
\f
void
char *p;
open_archive (ACCESS_WRITE);
-
+ xheader_write_global ();
+
if (incremental_option)
{
size_t buffer_size = 1000;