bug-tar
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-tar] Re: tar 1.15 released


From: Sergey Poznyakoff
Subject: [Bug-tar] Re: tar 1.15 released
Date: Tue, 21 Dec 2004 12:02:53 +0200

Ralf S. Engelschall <address@hidden> wrote:

> Here it comes:
[...]

Thank you. Please try the following patch. Does it work for you?

Regards,
Sergey

Index: src/buffer.c
===================================================================
RCS file: /cvsroot/tar/tar/src/buffer.c,v
retrieving revision 1.73
diff -p -u -r1.73 buffer.c
--- src/buffer.c        26 Nov 2004 19:08:58 -0000      1.73
+++ src/buffer.c        21 Dec 2004 09:55:29 -0000
@@ -180,29 +180,21 @@ 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)
+  record_end = record_start; /* set up for 1st record = # 0 */
+  find_next_block ();
+
+  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)
+    if (memcmp (record_start->buffer, p->magic, p->length) == 0)
       return p->type;
   
   return ct_none;
@@ -215,24 +207,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);
@@ -242,6 +227,9 @@ open_compressed_archive ()
   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;
 }
 
@@ -408,6 +396,8 @@ open_archive (enum access_mode wanted_ac
   read_full_records = read_full_records_option;
   reading_from_pipe = false;
   
+  records_read = 0;
+  
   if (use_compress_program_option)
     {
       switch (wanted_access)
@@ -415,6 +405,7 @@ open_archive (enum access_mode wanted_ac
        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 +500,9 @@ open_archive (enum access_mode wanted_ac
     {
     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)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]