/* 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.
void
list_archive (void)
{
+ off_t block_ordinal = current_block_ordinal ();
/* Print the header block. */
decode_header (current_header, ¤t_stat_info, ¤t_format, 0);
if (verbose_option)
- print_header (¤t_stat_info, -1);
-
- if (incremental_option && current_header->header.typeflag == GNUTYPE_DUMPDIR)
- {
- off_t size;
- size_t written, check;
- union block *data_block;
+ print_header (¤t_stat_info, block_ordinal);
- set_next_block_after (current_header);
- if (multi_volume_option)
- {
- assign_string (&save_name, current_stat_info.orig_file_name);
- save_totsize = current_stat_info.stat.st_size;
- }
- for (size = current_stat_info.stat.st_size; size > 0; size -= written)
+ if (incremental_option)
+ {
+ if (verbose_option > 2)
{
- if (multi_volume_option)
- save_sizeleft = size;
- data_block = find_next_block ();
- if (!data_block)
- {
- ERROR ((0, 0, _("Unexpected EOF in archive")));
- break; /* FIXME: What happens, then? */
- }
- written = available_space_after (data_block);
- if (written > size)
- written = size;
- set_next_block_after ((union block *)
- (data_block->buffer + written - 1));
- if (verbose_option > 2)
- list_dumpdir (data_block->buffer, written);
+ if (is_dumpdir (¤t_stat_info))
+ list_dumpdir (current_stat_info.dumpdir,
+ dumpdir_size (current_stat_info.dumpdir));
}
- if (multi_volume_option)
- assign_string (&save_name, 0);
-
- return;
}
- if (multi_volume_option)
- assign_string (&save_name, current_stat_info.orig_file_name);
-
skip_member ();
-
- if (multi_volume_option)
- assign_string (&save_name, 0);
}
/* Check header checksum */
{
xheader_read (header, OFF_FROM_HEADER (header->header.size));
xheader_decode_global ();
+ xheader_destroy (&extended_header);
}
/* Loop! */
stat_info->is_sparse = true;
}
else
- stat_info->is_sparse = false;
+ {
+ stat_info->is_sparse = false;
+ if (((current_format == GNU_FORMAT
+ || current_format == OLDGNU_FORMAT)
+ && current_header->header.typeflag == GNUTYPE_DUMPDIR)
+ || stat_info->dumpdir)
+ stat_info->is_dumpdir = true;
+ }
}
/* Convert buffer at WHERE0 of size DIGS from external format to
if (test_label_option && current_header->header.typeflag != GNUTYPE_VOLHDR)
return;
-
+
+ if (show_stored_names_option)
+ {
+ switch (subcommand_option)
+ {
+ case CAT_SUBCOMMAND:
+ case UPDATE_SUBCOMMAND:
+ case APPEND_SUBCOMMAND:
+ case CREATE_SUBCOMMAND:
+ temp_name = st->file_name ? st->file_name : st->orig_file_name;
+ break;
+
+ default:
+ temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
+ }
+ }
+ else
+ temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
+
if (block_number_option)
{
char buf[UINTMAX_STRSIZE_BOUND];
{
union block *x;
- if (multi_volume_option)
- {
- save_totsize = size;
- save_sizeleft = size;
- }
+ /* FIXME: Make sure mv_begin is always called before it */
if (seekable_archive)
{
off_t nblk = seek_archive (size);
if (nblk >= 0)
- {
- size -= nblk * BLOCKSIZE;
- if (multi_volume_option) /* Argh.. */
- save_sizeleft -= nblk * BLOCKSIZE;
- }
+ size -= nblk * BLOCKSIZE;
else
seekable_archive = false;
}
+ mv_size_left (size);
+
while (size > 0)
{
x = find_next_block ();
set_next_block_after (x);
size -= BLOCKSIZE;
- if (multi_volume_option)
- save_sizeleft -= BLOCKSIZE;
+ mv_size_left (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);
- assign_string (&save_name, current_stat_info.orig_file_name);
+ 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 ();
+ }
}