|
@@ -320,72 +320,72 @@ read_header (bool raw_extended_headers)
|
|
|
|
|
|
/* Good block. Decode file size and return. */
|
|
|
|
|
|
- if (header->header.typeflag == XHDTYPE
|
|
|
- || header->header.typeflag == XGLTYPE)
|
|
|
- {
|
|
|
- xheader_read (header, OFF_FROM_HEADER (header->header.size));
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
if (header->header.typeflag == LNKTYPE)
|
|
|
current_stat_info.stat.st_size = 0; /* links 0 size on tape */
|
|
|
else
|
|
|
current_stat_info.stat.st_size = OFF_FROM_HEADER (header->header.size);
|
|
|
|
|
|
if (header->header.typeflag == GNUTYPE_LONGNAME
|
|
|
- || header->header.typeflag == GNUTYPE_LONGLINK)
|
|
|
+ || header->header.typeflag == GNUTYPE_LONGLINK
|
|
|
+ || header->header.typeflag == XHDTYPE
|
|
|
+ || header->header.typeflag == XGLTYPE)
|
|
|
{
|
|
|
if (raw_extended_headers)
|
|
|
return HEADER_SUCCESS_EXTENDED;
|
|
|
- else
|
|
|
+ else if (header->header.typeflag == GNUTYPE_LONGNAME
|
|
|
+ || header->header.typeflag == GNUTYPE_LONGLINK)
|
|
|
{
|
|
|
size_t name_size = current_stat_info.stat.st_size;
|
|
|
size = name_size - name_size % BLOCKSIZE + 2 * BLOCKSIZE;
|
|
|
- if (name_size != current_stat_info.stat.st_size || size < name_size)
|
|
|
+ if (name_size != current_stat_info.stat.st_size
|
|
|
+ || size < name_size)
|
|
|
xalloc_die ();
|
|
|
- }
|
|
|
-
|
|
|
- header_copy = xmalloc (size + 1);
|
|
|
|
|
|
- if (header->header.typeflag == GNUTYPE_LONGNAME)
|
|
|
- {
|
|
|
- if (next_long_name)
|
|
|
- free (next_long_name);
|
|
|
- next_long_name = header_copy;
|
|
|
- next_long_name_blocks = size / BLOCKSIZE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (next_long_link)
|
|
|
- free (next_long_link);
|
|
|
- next_long_link = header_copy;
|
|
|
- next_long_link_blocks = size / BLOCKSIZE;
|
|
|
- }
|
|
|
-
|
|
|
- set_next_block_after (header);
|
|
|
- *header_copy = *header;
|
|
|
- bp = header_copy->buffer + BLOCKSIZE;
|
|
|
-
|
|
|
- for (size -= BLOCKSIZE; size > 0; size -= written)
|
|
|
- {
|
|
|
- data_block = find_next_block ();
|
|
|
- if (! data_block)
|
|
|
+ header_copy = xmalloc (size + 1);
|
|
|
+
|
|
|
+ if (header->header.typeflag == GNUTYPE_LONGNAME)
|
|
|
{
|
|
|
- ERROR ((0, 0, _("Unexpected EOF in archive")));
|
|
|
- break;
|
|
|
+ if (next_long_name)
|
|
|
+ free (next_long_name);
|
|
|
+ next_long_name = header_copy;
|
|
|
+ next_long_name_blocks = size / BLOCKSIZE;
|
|
|
}
|
|
|
- written = available_space_after (data_block);
|
|
|
- if (written > size)
|
|
|
- written = size;
|
|
|
-
|
|
|
- memcpy (bp, data_block->buffer, written);
|
|
|
- bp += written;
|
|
|
- set_next_block_after ((union block *)
|
|
|
- (data_block->buffer + written - 1));
|
|
|
- }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (next_long_link)
|
|
|
+ free (next_long_link);
|
|
|
+ next_long_link = header_copy;
|
|
|
+ next_long_link_blocks = size / BLOCKSIZE;
|
|
|
+ }
|
|
|
+
|
|
|
+ set_next_block_after (header);
|
|
|
+ *header_copy = *header;
|
|
|
+ bp = header_copy->buffer + BLOCKSIZE;
|
|
|
|
|
|
- *bp = '\0';
|
|
|
+ for (size -= BLOCKSIZE; size > 0; size -= written)
|
|
|
+ {
|
|
|
+ data_block = find_next_block ();
|
|
|
+ if (! data_block)
|
|
|
+ {
|
|
|
+ ERROR ((0, 0, _("Unexpected EOF in archive")));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ written = available_space_after (data_block);
|
|
|
+ if (written > size)
|
|
|
+ written = size;
|
|
|
+
|
|
|
+ memcpy (bp, data_block->buffer, written);
|
|
|
+ bp += written;
|
|
|
+ set_next_block_after ((union block *)
|
|
|
+ (data_block->buffer + written - 1));
|
|
|
+ }
|
|
|
|
|
|
+ *bp = '\0';
|
|
|
+ }
|
|
|
+ else if (header->header.typeflag == XHDTYPE
|
|
|
+ || header->header.typeflag == XGLTYPE)
|
|
|
+ xheader_read (header, OFF_FROM_HEADER (header->header.size));
|
|
|
+
|
|
|
/* Loop! */
|
|
|
|
|
|
}
|