]> Dogcows Code - chaz/tar/blobdiff - src/list.c
(utc_option): new global
[chaz/tar] / src / list.c
index 0c8095e4d991dcd426c221c52eba8c2a72e8f769..3e2d127c606f87704e4a49073004b96b98c4fa33 100644 (file)
@@ -130,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)
@@ -386,9 +395,13 @@ read_header (bool raw_extended_headers)
 
              *bp = '\0';
            }
-         else if (header->header.typeflag == XHDTYPE
-                  || header->header.typeflag == XGLTYPE)
+         else if (header->header.typeflag == XHDTYPE)
            xheader_read (header, OFF_FROM_HEADER (header->header.size));
+         else if (header->header.typeflag == XGLTYPE)
+           {
+             xheader_read (header, OFF_FROM_HEADER (header->header.size));
+             xheader_decode_global ();
+           }
       
          /* Loop!  */
 
@@ -489,8 +502,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;
@@ -548,7 +563,8 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
        {
        case BLKTYPE:
        case CHRTYPE:
-         stat_info->stat.st_rdev = makedev (stat_info->devmajor, stat_info->devminor);
+         stat_info->stat.st_rdev = makedev (stat_info->devmajor,
+                                            stat_info->devminor);
          break;
 
        default:
@@ -556,8 +572,8 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
        }
     }
 
-  if (extended_header.size)
-    xheader_decode (stat_info);
+  xheader_decode (stat_info);
+  current_stat_info.archive_file_size = current_stat_info.stat.st_size;
 }
 
 /* Convert buffer at WHERE0 of size DIGS from external format to
@@ -1093,7 +1109,8 @@ print_header (struct tar_stat_info *st, off_t block_ordinal)
                   uintbuf));
          break;
        default:
-         strcpy (size, STRINGIFY_BIGINT (st->stat.st_size, uintbuf));
+         /* st->stat.st_size keeps stored file size */
+         strcpy (size, STRINGIFY_BIGINT (st->archive_file_size, uintbuf));
          break;
        }
 
This page took 0.025579 seconds and 4 git commands to generate.