]> Dogcows Code - chaz/tar/blobdiff - src/buffer.c
Test extracting sparse files over a pipe.
[chaz/tar] / src / buffer.c
index 01f1f7017b3bbc118f8b44a4a68c6066fef81fe3..6390d7db401c0194b2443481cfa57e9df75f78e6 100644 (file)
@@ -177,8 +177,7 @@ static struct zip_magic magic[] = {
 #define compress_option(t) magic[t].option
 #define compress_program(t) magic[t].program
 
-/* Check if the file FD is a compressed archive. FD is guaranteed to
-   represent a local file */
+/* Check if the file ARCHIVE is a compressed archive. */
 enum compress_type 
 check_compressed_archive ()
 {
@@ -200,16 +199,13 @@ check_compressed_archive ()
   read_full_records = sfr;
   reading_from_pipe = srp;
 
-  if (tar_checksum (record_start) == HEADER_SUCCESS)
+  if (tar_checksum (record_start, true) == HEADER_SUCCESS)
     /* Probably a valid header */
     return ct_none;
 
   for (p = magic + 1; p < magic + NMAGIC; p++)
     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 p->type;
   
   return ct_none;
 }
@@ -220,26 +216,29 @@ check_compressed_archive ()
 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;
+  archive = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY,
+                    MODE_RW, rsh_command_option);
+  if (archive == -1)
+    return archive;
 
-  archive = fd;
-  type = check_compressed_archive ();
+  if (!multi_volume_option) 
+    {
+      enum compress_type type = check_compressed_archive ();
   
-  if (type == ct_none)
-    return fd;
+      if (type == ct_none)
+       return archive;
+
+      /* FD is not needed any more */
+      rmtclose (archive);
 
-  /* FD is not needed any more */
-  rmtclose (fd);
+      hit_eof = false; /* It might have been set by find_next_block in
+                         check_compressed_archive */
 
-  /* Open compressed archive */
-  use_compress_program_option = compress_program (type);
-  child_pid = sys_child_open_for_uncompress ();
-  read_full_records = reading_from_pipe = true;
+      /* 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 */
This page took 0.022441 seconds and 4 git commands to generate.