X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Flist.c;h=cd63064df05b23c44b8d9c17319271cce1b6005e;hb=15a607fc11d8563fe471924fb6e718ceb9adfce4;hp=f5684c443aa30b3ca97b282469c4914b3740c4f2;hpb=683390b02dedca56036b9b1b2aeae46fbfde4e49;p=chaz%2Ftar diff --git a/src/list.c b/src/list.c index f5684c4..cd63064 100644 --- a/src/list.c +++ b/src/list.c @@ -573,8 +573,14 @@ decode_header (union block *header, struct tar_stat_info *stat_info, } } + stat_info->archive_file_size = stat_info->stat.st_size; xheader_decode (stat_info); - current_stat_info.archive_file_size = current_stat_info.stat.st_size; + + if (sparse_member_p (stat_info)) + { + sparse_fixup_header (stat_info); + stat_info->is_sparse = true; + } } /* Convert buffer at WHERE0 of size DIGS from external format to @@ -1102,16 +1108,10 @@ print_header (struct tar_stat_info *st, off_t block_ordinal) strcat (size, STRINGIFY_BIGINT (minor (st->stat.st_rdev), uintbuf)); break; - case GNUTYPE_SPARSE: - strcpy (size, - STRINGIFY_BIGINT - (UINTMAX_FROM_HEADER (current_header - ->oldgnu_header.realsize), - uintbuf)); - break; + default: /* st->stat.st_size keeps stored file size */ - strcpy (size, STRINGIFY_BIGINT (st->archive_file_size, uintbuf)); + strcpy (size, STRINGIFY_BIGINT (st->stat.st_size, uintbuf)); break; } @@ -1243,20 +1243,10 @@ skip_member (void) char save_typeflag = current_header->header.typeflag; set_next_block_after (current_header); - if (current_format == OLDGNU_FORMAT - && current_header->oldgnu_header.isextended) - { - union block *exhdr; - do - { - exhdr = find_next_block (); - if (!exhdr) - FATAL_ERROR ((0, 0, _("Unexpected EOF in archive"))); - set_next_block_after (exhdr); - } - while (exhdr->sparse_header.isextended); - } + assign_string (&save_name, current_stat_info.file_name); - if (save_typeflag != DIRTYPE) + if (sparse_member_p (¤t_stat_info)) + sparse_skip_file (¤t_stat_info); + else if (save_typeflag != DIRTYPE) skip_file (current_stat_info.stat.st_size); }