]> Dogcows Code - chaz/tar/blobdiff - src/list.c
Initial documentation for --quoting-style, --quote-chars and --no-quote-chars option.
[chaz/tar] / src / list.c
index 667607d7a196a563426254d3afcbe4762a2b7eb1..0c3e223a03e8b19c3485f8f41734cf88bf2f6509 100644 (file)
@@ -205,55 +205,28 @@ read_and (void (*do_something) (void))
 void
 list_archive (void)
 {
+  off_t block_ordinal = current_block_ordinal ();
   /* Print the header block.  */
 
   decode_header (current_header, &current_stat_info, &current_format, 0);
   if (verbose_option)
-    print_header (&current_stat_info, -1);
+    print_header (&current_stat_info, block_ordinal);
   
-  if (incremental_option && current_header->header.typeflag == GNUTYPE_DUMPDIR)
+  if (incremental_option)
     {
-      off_t size;
-      size_t written, check;
-      union block *data_block;
-
-      set_next_block_after (current_header);
-      if (multi_volume_option)
+      if (verbose_option > 2)
        {
-         assign_string (&save_name, current_stat_info.orig_file_name);
-         save_totsize = current_stat_info.stat.st_size;
+         if (current_stat_info.dumpdir)
+           list_dumpdir (current_stat_info.dumpdir,
+                         dumpdir_size (current_stat_info.dumpdir));
        }
-      for (size = current_stat_info.stat.st_size; size > 0; size -= written)
-       {
-         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 (multi_volume_option)
-       assign_string (&save_name, 0);
-
-      return;
     }
 
-  if (multi_volume_option)
-    assign_string (&save_name, current_stat_info.orig_file_name);
+  mv_begin (&current_stat_info);
 
   skip_member ();
 
-  if (multi_volume_option)
-    assign_string (&save_name, 0);
+  mv_end ();
 }
 
 /* Check header checksum */
@@ -425,6 +398,7 @@ read_header (bool raw_extended_headers)
            {
              xheader_read (header, OFF_FROM_HEADER (header->header.size));
              xheader_decode_global ();
+             xheader_destroy (&extended_header);
            }
 
          /* Loop!  */
@@ -601,7 +575,13 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
       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)
+       get_gnu_dumpdir ();
+    }
 }
 
 /* Convert buffer at WHERE0 of size DIGS from external format to
@@ -1288,25 +1268,19 @@ skip_file (off_t size)
 {
   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 ();
@@ -1315,8 +1289,7 @@ skip_file (off_t size)
 
       set_next_block_after (x);
       size -= BLOCKSIZE;
-      if (multi_volume_option)
-       save_sizeleft -= BLOCKSIZE;
+      mv_size_left (size);
     }
 }
 
@@ -1328,10 +1301,12 @@ skip_member (void)
   char save_typeflag = current_header->header.typeflag;
   set_next_block_after (current_header);
 
-  assign_string (&save_name, current_stat_info.orig_file_name);
+  mv_begin (&current_stat_info);
 
   if (current_stat_info.is_sparse)
     sparse_skip_file (&current_stat_info);
   else if (save_typeflag != DIRTYPE)
     skip_file (current_stat_info.stat.st_size);
+
+  mv_end ();
 }
This page took 0.024668 seconds and 4 git commands to generate.