]> Dogcows Code - chaz/tar/blobdiff - src/list.c
Fix improper use of 'path' word
[chaz/tar] / src / list.c
index 77dce5507215fc6875c0de0e047045bc362f85d3..cb207a982b9633eec275daf8ca8fa287139f3002 100644 (file)
@@ -1,7 +1,7 @@
 /* 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 Free Software Foundation, Inc.
+   2001, 2003, 2004 Free Software Foundation, Inc.
 
    Written by John Gilmore, on 1985-08-26.
 
@@ -78,7 +78,7 @@ read_and (void (*do_something) (void))
       prev_status = status;
       tar_stat_destroy (&current_stat_info);
       xheader_destroy (&extended_header);
-      
+
       status = read_header (false);
       switch (status)
        {
@@ -92,12 +92,17 @@ read_and (void (*do_something) (void))
             Ensure incoming names are null terminated.  */
 
          if (! name_match (current_stat_info.file_name)
-             || (newer_mtime_option != TYPE_MINIMUM (time_t)
+             || (NEWER_OPTION_INITIALIZED (newer_mtime_option)
                  /* FIXME: We get mtime now, and again later; this causes
                     duplicate diagnostics if header.mtime is bogus.  */
                  && ((current_stat_info.stat.st_mtime
-                      = TIME_FROM_HEADER (current_header->header.mtime))
-                     < newer_mtime_option))
+                      = TIME_FROM_HEADER (current_header->header.mtime)),
+#ifdef ST_MTIM_NSEC
+                     /* FIXME: Grab fractional time stamps from
+                        extended header.  */
+                     current_stat_info.stat.st_mtim.ST_MTIM_NSEC = 0,
+#endif
+                     OLDER_STAT_TIME (current_stat_info.stat, m)))
              || excluded_name (current_stat_info.file_name))
            {
              switch (current_header->header.typeflag)
@@ -130,10 +135,20 @@ 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)));
+             break;
+           }
          status = prev_status;
-         if (ignore_zeros_option)
-           continue;
-         break;
+         continue;
 
        case HEADER_END_OF_FILE:
          if (block_number_option)
@@ -156,6 +171,15 @@ read_and (void (*do_something) (void))
 
            case HEADER_ZERO_BLOCK:
            case HEADER_SUCCESS:
+             if (block_number_option)
+               {
+                 char buf[UINTMAX_STRSIZE_BOUND];
+                 off_t block_ordinal = current_block_ordinal ();
+                 block_ordinal -= recent_long_name_blocks;
+                 block_ordinal -= recent_long_link_blocks;
+                 fprintf (stdlis, _("block %s: "),
+                          STRINGIFY_BIGINT (block_ordinal, buf));
+               }
              ERROR ((0, 0, _("Skipping to next header")));
              break;
 
@@ -346,7 +370,7 @@ read_header (bool raw_extended_headers)
                xalloc_die ();
 
              header_copy = xmalloc (size + 1);
-             
+
              if (header->header.typeflag == GNUTYPE_LONGNAME)
                {
                  if (next_long_name)
@@ -361,7 +385,7 @@ read_header (bool raw_extended_headers)
                  next_long_link = header_copy;
                  next_long_link_blocks = size / BLOCKSIZE;
                }
-             
+
              set_next_block_after (header);
              *header_copy = *header;
              bp = header_copy->buffer + BLOCKSIZE;
@@ -377,7 +401,7 @@ read_header (bool raw_extended_headers)
                  written = available_space_after (data_block);
                  if (written > size)
                    written = size;
-                 
+
                  memcpy (bp, data_block->buffer, written);
                  bp += written;
                  set_next_block_after ((union block *)
@@ -386,10 +410,14 @@ 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!  */
 
        }
@@ -506,7 +534,7 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
   assign_string (&stat_info->gname, header->header.gname);
   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;
 
@@ -545,12 +573,13 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
              || !gname_to_gid (header->header.gname, &stat_info->stat.st_gid))
            stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
        }
-      
+
       switch (header->header.typeflag)
        {
        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:
@@ -558,9 +587,14 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
        }
     }
 
-  current_stat_info.archive_file_size = current_stat_info.stat.st_size;
-  if (extended_header.size)
-    xheader_decode (stat_info);
+  stat_info->archive_file_size = stat_info->stat.st_size;
+  xheader_decode (stat_info);
+
+  if (sparse_member_p (stat_info))
+    {
+      sparse_fixup_header (stat_info);
+      stat_info->is_sparse = true;
+    }
 }
 
 /* Convert buffer at WHERE0 of size DIGS from external format to
@@ -887,7 +921,7 @@ tartime (time_t t)
 #else
   /* Use ISO 8610 format.  See:
      http://www.cl.cam.ac.uk/~mgk25/iso-time.html  */
-  struct tm *tm = localtime (&t);
+  struct tm *tm = utc_option ? gmtime (&t) : localtime (&t);
   if (tm)
     {
       sprintf (buffer, "%04ld-%02d-%02d %02d:%02d:%02d",
@@ -941,7 +975,7 @@ print_header (struct tar_stat_info *st, off_t block_ordinal)
   char modes[11];
   char const *time_stamp;
   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];
   char *user, *group;
@@ -1088,16 +1122,10 @@ print_header (struct tar_stat_info *st, off_t block_ordinal)
          strcat (size,
                  STRINGIFY_BIGINT (minor (st->stat.st_rdev), uintbuf));
          break;
-       case GNUTYPE_SPARSE:
-         strcpy (size,
-                 STRINGIFY_BIGINT
-                 (UINTMAX_FROM_HEADER (current_header
-                                       ->oldgnu_header.realsize),
-                  uintbuf));
-         break;
+
        default:
          /* st->stat.st_size keeps stored file size */
-         strcpy (size, STRINGIFY_BIGINT (st->archive_file_size, uintbuf));
+         strcpy (size, STRINGIFY_BIGINT (st->stat.st_size, uintbuf));
          break;
        }
 
@@ -1174,7 +1202,7 @@ print_header (struct tar_stat_info *st, off_t block_ordinal)
 
 /* Print a similar line when we make a directory automatically.  */
 void
-print_for_mkdir (char *pathname, int length, mode_t mode)
+print_for_mkdir (char *dirname, int length, mode_t mode)
 {
   char modes[11];
 
@@ -1193,7 +1221,7 @@ print_for_mkdir (char *pathname, int length, mode_t mode)
        }
 
       fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + DATEWIDTH,
-              _("Creating directory:"), length, quotearg (pathname));
+              _("Creating directory:"), length, quotearg (dirname));
     }
 }
 
@@ -1229,20 +1257,10 @@ skip_member (void)
   char save_typeflag = current_header->header.typeflag;
   set_next_block_after (current_header);
 
-  if (current_format == OLDGNU_FORMAT
-      && current_header->oldgnu_header.isextended)
-    {
-      union block *exhdr;
-      do
-       {
-         exhdr = find_next_block ();
-         if (!exhdr)
-           FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
-         set_next_block_after (exhdr);
-       }
-      while (exhdr->sparse_header.isextended);
-    }
+  assign_string (&save_name, current_stat_info.file_name);
 
-  if (save_typeflag != DIRTYPE)
+  if (sparse_member_p (&current_stat_info))
+    sparse_skip_file (&current_stat_info);
+  else if (save_typeflag != DIRTYPE)
     skip_file (current_stat_info.stat.st_size);
 }
This page took 0.029808 seconds and 4 git commands to generate.