]> Dogcows Code - chaz/tar/blobdiff - src/list.c
(decode_header): Call xheader_decode unconditionally.
[chaz/tar] / src / list.c
index 2148990f7d7cb57536db59bcdecf623c90d56d94..fdc8fa9975b14cb7b81e4d0e72fa9323f4076d18 100644 (file)
@@ -76,6 +76,9 @@ read_and (void (*do_something) (void))
   do
     {
       prev_status = status;
+      tar_stat_destroy (&current_stat_info);
+      xheader_destroy (&extended_header);
+      
       status = read_header (false);
       switch (status)
        {
@@ -127,10 +130,19 @@ read_and (void (*do_something) (void))
            }
 
          set_next_block_after (current_header);
+
+         if (!ignore_zeros_option)
+           {
+             char buf[UINTMAX_STRSIZE_BOUND];
+
+             status = read_header (false);
+             if (status == HEADER_ZERO_BLOCK)
+               break;
+             WARN ((0, 0, _("A lone zero block at %s"),
+                    STRINGIFY_BIGINT (current_block_ordinal (), buf)));
+           }
          status = prev_status;
-         if (ignore_zeros_option)
-           continue;
-         break;
+         continue;
 
        case HEADER_END_OF_FILE:
          if (block_number_option)
@@ -182,7 +194,7 @@ list_archive (void)
 
   decode_header (current_header, &current_stat_info, &current_format, 0);
   if (verbose_option)
-    print_header (-1);
+    print_header (&current_stat_info, -1);
 
   if (incremental_option && current_header->header.typeflag == GNUTYPE_DUMPDIR)
     {
@@ -486,8 +498,10 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
          && ISOCTAL (header->star_header.ctime[0])
          && header->star_header.ctime[11] == ' ')
        format = STAR_FORMAT;
-      else
+      else if (extended_header.size)
        format = POSIX_FORMAT;
+      else
+       format = USTAR_FORMAT;
     }
   else if (strcmp (header->header.magic, OLDGNU_MAGIC) == 0)
     format = OLDGNU_FORMAT;
@@ -502,6 +516,9 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
   stat_info->devmajor = MAJOR_FROM_HEADER (header->header.devmajor);
   stat_info->devminor = MINOR_FROM_HEADER (header->header.devminor);
   
+  stat_info->stat.st_atime = start_time;
+  stat_info->stat.st_ctime = start_time;
+
   if (format == OLDGNU_FORMAT && incremental_option)
     {
       stat_info->stat.st_atime = TIME_FROM_HEADER (header->oldgnu_header.atime);
@@ -550,8 +567,8 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
        }
     }
 
-  if (extended_header.size)
-    xheader_decode (stat_info);
+  current_stat_info.archive_file_size = current_stat_info.stat.st_size;
+  xheader_decode (stat_info);
 }
 
 /* Convert buffer at WHERE0 of size DIGS from external format to
@@ -927,11 +944,11 @@ static int ugswidth = UGSWIDTH;   /* maximum width encountered so far */
 #endif
 
 void
-print_header (off_t block_ordinal)
+print_header (struct tar_stat_info *st, off_t block_ordinal)
 {
   char modes[11];
   char const *time_stamp;
-  char *temp_name = current_stat_info.orig_file_name ? current_stat_info.orig_file_name : current_stat_info.file_name;
+  char *temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
   
   /* These hold formatted ints.  */
   char uform[UINTMAX_STRSIZE_BOUND], gform[UINTMAX_STRSIZE_BOUND];
@@ -1015,17 +1032,17 @@ print_header (off_t block_ordinal)
          break;
        }
 
-      decode_mode (current_stat_info.stat.st_mode, modes + 1);
+      decode_mode (st->stat.st_mode, modes + 1);
 
       /* Time stamp.  */
 
-      time_stamp = tartime (current_stat_info.stat.st_mtime);
+      time_stamp = tartime (st->stat.st_mtime);
 
       /* User and group names.  */
 
-      if (current_stat_info.uname && current_format != V7_FORMAT
+      if (st->uname && current_format != V7_FORMAT
          && !numeric_owner_option)
-       user = current_stat_info.uname;
+       user = st->uname;
       else
        {
          /* Try parsing it as an unsigned integer first, and as a
@@ -1045,9 +1062,9 @@ print_header (off_t block_ordinal)
            }
        }
 
-      if (current_stat_info.gname && current_format != V7_FORMAT
+      if (st->gname && current_format != V7_FORMAT
          && !numeric_owner_option)
-       group = current_stat_info.gname;
+       group = st->gname;
       else
        {
          /* Try parsing it as an unsigned integer first, and as a
@@ -1074,10 +1091,10 @@ print_header (off_t block_ordinal)
        case CHRTYPE:
        case BLKTYPE:
          strcpy (size,
-                 STRINGIFY_BIGINT (major (current_stat_info.stat.st_rdev), uintbuf));
+                 STRINGIFY_BIGINT (major (st->stat.st_rdev), uintbuf));
          strcat (size, ",");
          strcat (size,
-                 STRINGIFY_BIGINT (minor (current_stat_info.stat.st_rdev), uintbuf));
+                 STRINGIFY_BIGINT (minor (st->stat.st_rdev), uintbuf));
          break;
        case GNUTYPE_SPARSE:
          strcpy (size,
@@ -1087,7 +1104,8 @@ print_header (off_t block_ordinal)
                   uintbuf));
          break;
        default:
-         strcpy (size, STRINGIFY_BIGINT (current_stat_info.stat.st_size, uintbuf));
+         /* st->stat.st_size keeps stored file size */
+         strcpy (size, STRINGIFY_BIGINT (st->archive_file_size, uintbuf));
          break;
        }
 
@@ -1105,11 +1123,11 @@ print_header (off_t block_ordinal)
       switch (current_header->header.typeflag)
        {
        case SYMTYPE:
-         fprintf (stdlis, " -> %s\n", quotearg (current_stat_info.link_name));
+         fprintf (stdlis, " -> %s\n", quotearg (st->link_name));
          break;
 
        case LNKTYPE:
-         fprintf (stdlis, _(" link to %s\n"), quotearg (current_stat_info.link_name));
+         fprintf (stdlis, _(" link to %s\n"), quotearg (st->link_name));
          break;
 
        default:
This page took 0.025674 seconds and 4 git commands to generate.