X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Flist.c;h=b592c8beb0ffe52cc736984d299ae77043ef1034;hb=ff989f4b845671303f27977e4310a6849cb558c0;hp=3166e686c1ca43970807805f75da15a87204a004;hpb=951b0370df3312cec343c590007301d3edd1be80;p=chaz%2Ftar diff --git a/src/list.c b/src/list.c index 3166e68..b592c8b 100644 --- a/src/list.c +++ b/src/list.c @@ -22,7 +22,7 @@ /* Define to non-zero for forcing old ctime format instead of ISO format. */ #undef USE_OLD_CTIME -#include "system.h" +#include #include #include "common.h" @@ -118,6 +118,8 @@ read_and (void (*do_something) (void)) quotearg_colon (current_stat_info.file_name))); /* Fall through. */ default: + decode_header (current_header, + ¤t_stat_info, ¤t_format, 0); skip_member (); continue; } @@ -530,8 +532,10 @@ decode_header (union block *header, struct tar_stat_info *stat_info, stat_info->stat.st_mode = MODE_FROM_HEADER (header->header.mode); stat_info->stat.st_mtime = TIME_FROM_HEADER (header->header.mtime); - assign_string (&stat_info->uname, header->header.uname); - assign_string (&stat_info->gname, header->header.gname); + assign_string (&stat_info->uname, + header->header.uname[0] ? header->header.uname : NULL); + assign_string (&stat_info->gname, + header->header.gname[0] ? header->header.gname : NULL); stat_info->devmajor = MAJOR_FROM_HEADER (header->header.devmajor); stat_info->devminor = MINOR_FROM_HEADER (header->header.devminor); @@ -595,6 +599,8 @@ decode_header (union block *header, struct tar_stat_info *stat_info, sparse_fixup_header (stat_info); stat_info->is_sparse = true; } + else + stat_info->is_sparse = false; } /* Convert buffer at WHERE0 of size DIGS from external format to @@ -1263,16 +1269,17 @@ skip_file (off_t size) } } -/* Skip the current member in the archive. */ +/* Skip the current member in the archive. + NOTE: Current header must be decoded before calling this function. */ void skip_member (void) { char save_typeflag = current_header->header.typeflag; set_next_block_after (current_header); - + assign_string (&save_name, current_stat_info.file_name); - if (sparse_member_p (¤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);