(start_private_header): Removed static qualifier.

(write_extended): Removed superfluous last argument. Use
xheader_write()
(simple_finish_header): New function.
(finish_header): Use simple_finish_header() to break recursive
dependency between this function and write_extended().
This commit is contained in:
Sergey Poznyakoff
2004-02-20 15:32:12 +00:00
parent 17be45c834
commit 93a4273b66

View File

@@ -371,7 +371,7 @@ tar_copy_str (char *dst, const char *src, size_t len)
}
/* Write a "private" header */
static union block *
union block *
start_private_header (const char *name, size_t size)
{
time_t t;
@@ -534,9 +534,9 @@ write_long_name (struct tar_stat_info *st)
}
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;
@@ -546,36 +546,10 @@ write_extended (struct tar_stat_info *st, union block *old_header, char type)
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;
@@ -743,6 +717,36 @@ start_header (struct tar_stat_info *st)
return header;
}
void
simple_finish_header (union block *header)
{
size_t i;
int sum;
char *p;
memcpy (header->header.chksum, CHKBLANKS, sizeof header->header.chksum);
sum = 0;
p = header->buffer;
for (i = sizeof *header; i-- != 0; )
/* We can't use unsigned char here because of old compilers, e.g. V7. */
sum += 0xFF & *p++;
/* Fill in the checksum field. It's formatted differently from the
other fields: it has [6] digits, a null, then a space -- rather than
digits, then a null. We use to_chars.
The final space is already there, from
checksumming, and to_chars doesn't modify it.
This is a fast way to do:
sprintf(header->header.chksum, "%6o", sum); */
uintmax_to_chars ((uintmax_t) sum, header->header.chksum, 7);
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
@@ -770,29 +774,8 @@ finish_header (struct tar_stat_info *st,
print_header (st, block_ordinal);
}
header = write_extended (st, header, XHDTYPE);
memcpy (header->header.chksum, CHKBLANKS, sizeof header->header.chksum);
sum = 0;
p = header->buffer;
for (i = sizeof *header; i-- != 0; )
/* We can't use unsigned char here because of old compilers, e.g. V7. */
sum += 0xFF & *p++;
/* Fill in the checksum field. It's formatted differently from the
other fields: it has [6] digits, a null, then a space -- rather than
digits, then a null. We use to_chars.
The final space is already there, from
checksumming, and to_chars doesn't modify it.
This is a fast way to do:
sprintf(header->header.chksum, "%6o", sum); */
uintmax_to_chars ((uintmax_t) sum, header->header.chksum, 7);
set_next_block_after (header);
header = write_extended (st, header);
simple_finish_header (header);
}
@@ -1069,7 +1052,8 @@ create_archive (void)
char *p;
open_archive (ACCESS_WRITE);
xheader_write_global ();
if (incremental_option)
{
size_t buffer_size = 1000;