mirror of
https://git.savannah.gnu.org/git/tar.git
synced 2026-08-21 16:56:06 +00:00
Handle directory members consistently when listing and when extracting.
* src/list.c (skim_member): Recognize directory members using the same rules as during extraction. * tests/skipdir.at: New testcase. * tests/testsuite.at: Add new test. * tests/Makefile.am: Likewise.
This commit is contained in:
+20
-2
@@ -1414,6 +1414,23 @@ skip_member (void)
|
||||
skim_member (false);
|
||||
}
|
||||
|
||||
static bool
|
||||
member_is_dir (struct tar_stat_info *info, char typeflag)
|
||||
{
|
||||
switch (typeflag) {
|
||||
case AREGTYPE:
|
||||
case REGTYPE:
|
||||
case CONTTYPE:
|
||||
return info->had_trailing_slash;
|
||||
|
||||
case DIRTYPE:
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Skip the current member in the archive.
|
||||
If MUST_COPY, always copy instead of skipping. */
|
||||
void
|
||||
@@ -1421,14 +1438,15 @@ skim_member (bool must_copy)
|
||||
{
|
||||
if (!current_stat_info.skipped)
|
||||
{
|
||||
char save_typeflag = current_header->header.typeflag;
|
||||
bool is_dir = member_is_dir (¤t_stat_info,
|
||||
current_header->header.typeflag);
|
||||
set_next_block_after (current_header);
|
||||
|
||||
mv_begin_read (¤t_stat_info);
|
||||
|
||||
if (current_stat_info.is_sparse)
|
||||
sparse_skim_file (¤t_stat_info, must_copy);
|
||||
else if (save_typeflag != DIRTYPE)
|
||||
else if (!is_dir)
|
||||
skim_file (current_stat_info.stat.st_size, must_copy);
|
||||
|
||||
mv_end ();
|
||||
|
||||
Reference in New Issue
Block a user