]> Dogcows Code - chaz/tar/commitdiff
Bugfix. Changes introduced 2004-11-26 broke extraction from stdin.
authorSergey Poznyakoff <gray@gnu.org.ua>
Tue, 21 Dec 2004 13:23:46 +0000 (13:23 +0000)
committerSergey Poznyakoff <gray@gnu.org.ua>
Tue, 21 Dec 2004 13:23:46 +0000 (13:23 +0000)
src/buffer.c

index 0d142f7907e29909c7b61718bff8dc4995ee00fa..01f1f7017b3bbc118f8b44a4a68c6066fef81fe3 100644 (file)
@@ -180,30 +180,36 @@ static struct zip_magic magic[] = {
 /* Check if the file FD is a compressed archive. FD is guaranteed to
    represent a local file */
 enum compress_type 
-check_compressed_archive (int fd)
+check_compressed_archive ()
 {
   struct zip_magic *p;
   size_t status;
-  union block buf;
-  
-  status = read (fd, &buf, sizeof buf);
-  if (status != sizeof buf)
-    {
-      archive_read_error ();
-      FATAL_ERROR ((0, 0, _("Quitting now.")));
-    }
-
-  lseek (fd, 0, SEEK_SET); /* This will fail if fd==0, but that does not
-                             matter, since we do not handle compressed
-                             stdin anyway */
-  
-  if (tar_checksum (&buf) == HEADER_SUCCESS)
+  bool sfr, srp;
+
+  /* Prepare global data needed for find_next_block: */
+  record_end = record_start; /* set up for 1st record = # 0 */
+  sfr = read_full_records;
+  read_full_records = true; /* Suppress fatal error on reading a partial
+                              record */
+  srp = reading_from_pipe;
+  reading_from_pipe = true; /* Suppress warning message on reading a partial
+                              record */
+  find_next_block ();
+
+  /* Restore global values */
+  read_full_records = sfr;
+  reading_from_pipe = srp;
+
+  if (tar_checksum (record_start) == HEADER_SUCCESS)
     /* Probably a valid header */
     return ct_none;
 
   for (p = magic + 1; p < magic + NMAGIC; p++)
-    if (memcmp (buf.buffer, p->magic, p->length) == 0)
-      return p->type;
+    if (memcmp (record_start->buffer, p->magic, p->length) == 0)
+      {
+       hit_eof = false; /* It might have been set by find_next_block */
+       return p->type;
+      }
   
   return ct_none;
 }
@@ -215,24 +221,17 @@ int
 open_compressed_archive ()
 {
   enum compress_type type;
+
   int fd = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY,
                    MODE_RW, rsh_command_option);
   if (fd == -1 || _isrmt (fd))
     return fd;
-  
-  type = check_compressed_archive (fd);
+
+  archive = fd;
+  type = check_compressed_archive ();
   
   if (type == ct_none)
-    {
-      if (rmtlseek (fd, (off_t) 0, SEEK_CUR) != 0)
-       {
-         /* Archive may be not seekable. Reopen it. */
-         rmtclose (fd);
-         fd = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY,
-                       MODE_RW, rsh_command_option);
-       }
-      return fd;
-    }
+    return fd;
 
   /* FD is not needed any more */
   rmtclose (fd);
@@ -241,7 +240,10 @@ open_compressed_archive ()
   use_compress_program_option = compress_program (type);
   child_pid = sys_child_open_for_uncompress ();
   read_full_records = reading_from_pipe = true;
-
+  
+  records_read = 0;
+  record_end = record_start; /* set up for 1st record = # 0 */
+  
   return archive;
 }
 \f
@@ -408,6 +410,8 @@ open_archive (enum access_mode wanted_access)
   read_full_records = read_full_records_option;
   reading_from_pipe = false;
   
+  records_read = 0;
+  
   if (use_compress_program_option)
     {
       switch (wanted_access)
@@ -415,6 +419,7 @@ open_archive (enum access_mode wanted_access)
        case ACCESS_READ:
          child_pid = sys_child_open_for_uncompress ();
          read_full_records = reading_from_pipe = true;
+         record_end = record_start; /* set up for 1st record = # 0 */
          break;
 
        case ACCESS_WRITE:
@@ -509,9 +514,9 @@ open_archive (enum access_mode wanted_access)
     {
     case ACCESS_UPDATE:
       records_written = 0;
-    case ACCESS_READ:
-      records_read = 0;
       record_end = record_start; /* set up for 1st record = # 0 */
+
+    case ACCESS_READ:
       find_next_block ();      /* read it in, check for EOF */
 
       if (volume_label_option)
This page took 0.036711 seconds and 4 git commands to generate.