X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Flist.c;h=2d05873d846b327a3e91aa4e6452ebf9865d5b39;hb=5032e08eb9178fdb1de2a02dcf4281b65143fb80;hp=0c3e223a03e8b19c3485f8f41734cf88bf2f6509;hpb=52429bb9563d5b4bfece4cf9036ce9363e05996b;p=chaz%2Ftar diff --git a/src/list.c b/src/list.c index 0c3e223..2d05873 100644 --- a/src/list.c +++ b/src/list.c @@ -1,7 +1,7 @@ /* List a tar archive, with support routines for reading a tar archive. Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000, - 2001, 2003, 2004, 2005 Free Software Foundation, Inc. + 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Written by John Gilmore, on 1985-08-26. @@ -211,22 +211,18 @@ list_archive (void) decode_header (current_header, ¤t_stat_info, ¤t_format, 0); if (verbose_option) print_header (¤t_stat_info, block_ordinal); - + if (incremental_option) { if (verbose_option > 2) { - if (current_stat_info.dumpdir) + if (is_dumpdir (¤t_stat_info)) list_dumpdir (current_stat_info.dumpdir, dumpdir_size (current_stat_info.dumpdir)); } } - mv_begin (¤t_stat_info); - skip_member (); - - mv_end (); } /* Check header checksum */ @@ -577,10 +573,11 @@ decode_header (union block *header, struct tar_stat_info *stat_info, else { stat_info->is_sparse = false; - if ((current_format == GNU_FORMAT - || current_format == OLDGNU_FORMAT) - && current_header->header.typeflag == GNUTYPE_DUMPDIR) - get_gnu_dumpdir (); + if (((current_format == GNU_FORMAT + || current_format == OLDGNU_FORMAT) + && current_header->header.typeflag == GNUTYPE_DUMPDIR) + || stat_info->dumpdir) + stat_info->is_dumpdir = true; } } @@ -1009,7 +1006,7 @@ print_header (struct tar_stat_info *st, off_t block_ordinal) } else temp_name = st->orig_file_name ? st->orig_file_name : st->file_name; - + if (block_number_option) { char buf[UINTMAX_STRSIZE_BOUND]; @@ -1280,7 +1277,7 @@ skip_file (off_t size) } mv_size_left (size); - + while (size > 0) { x = find_next_block (); @@ -1298,15 +1295,18 @@ skip_file (off_t size) void skip_member (void) { - char save_typeflag = current_header->header.typeflag; - set_next_block_after (current_header); + if (!current_stat_info.skipped) + { + char save_typeflag = current_header->header.typeflag; + set_next_block_after (current_header); - mv_begin (¤t_stat_info); + mv_begin (¤t_stat_info); - if (current_stat_info.is_sparse) - sparse_skip_file (¤t_stat_info); - else if (save_typeflag != DIRTYPE) - skip_file (current_stat_info.stat.st_size); + if (current_stat_info.is_sparse) + sparse_skip_file (¤t_stat_info); + else if (save_typeflag != DIRTYPE) + skip_file (current_stat_info.stat.st_size); - mv_end (); + mv_end (); + } }