]> Dogcows Code - chaz/tar/blobdiff - src/delete.c
(delete_archive_members): Bugfix: when
[chaz/tar] / src / delete.c
index b79321ff319b08c3a2d306e4cda2ca3d8eb45189..a98694175aa4888deeff50a8b6699620db6edde3 100644 (file)
    with this program; if not, write to the Free Software Foundation, Inc.,
    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
-#include "system.h"
+#include <system.h>
 
 #include "common.h"
-#include "rmt.h"
+#include <rmt.h>
 
 static union block *new_record;
 static int new_blocks;
@@ -234,7 +234,7 @@ delete_archive_members (void)
   if (logical_status == HEADER_SUCCESS
       || logical_status == HEADER_SUCCESS_EXTENDED)
     {
-      write_archive_to_stdout = 0;
+      write_archive_to_stdout = false;
 
       /* Save away blocks before this one in this record.  */
 
@@ -262,8 +262,7 @@ delete_archive_members (void)
            flush_archive ();
          status = read_header (false);
          
-         if (extended_header.size)
-           xheader_decode (&current_stat_info);
+         xheader_decode (&current_stat_info);
          
          if (status == HEADER_ZERO_BLOCK && ignore_zeros_option)
            {
@@ -360,39 +359,32 @@ delete_archive_members (void)
                write_record (1);
            }
        }
-    }
 
-  if (logical_status == HEADER_END_OF_FILE)
-    {
-      /* Write the end of tape.  FIXME: we can't use write_eot here,
-        as it gets confused when the input is at end of file.  */
+      if (logical_status == HEADER_END_OF_FILE)
+       {
+         /* Write the end of tape.  FIXME: we can't use write_eot here,
+            as it gets confused when the input is at end of file.  */
+
+         int total_zero_blocks = 0;
 
-      int total_zero_blocks = 0;
+         do
+           {
+             int zero_blocks = blocking_factor - new_blocks;
+             memset (new_record + new_blocks, 0, BLOCKSIZE * zero_blocks);
+             total_zero_blocks += zero_blocks;
+             write_record (total_zero_blocks < 2);
+           }
+         while (total_zero_blocks < 2);
+       }
 
-      do
+      if (! acting_as_filter && ! _isrmt (archive))
        {
-         int zero_blocks = blocking_factor - new_blocks;
-         memset (new_record + new_blocks, 0, BLOCKSIZE * zero_blocks);
-         total_zero_blocks += zero_blocks;
-         write_record (total_zero_blocks < 2);
+         if (sys_truncate (archive))
+           truncate_warn (archive_name_array[0]);
        }
-      while (total_zero_blocks < 2);
     }
-
   free (new_record);
 
-  if (! acting_as_filter && ! _isrmt (archive))
-    {
-#if MSDOS
-      int status = write (archive, "", 0);
-#else
-      off_t pos = lseek (archive, (off_t) 0, SEEK_CUR);
-      int status = pos < 0 ? -1 : ftruncate (archive, pos);
-#endif
-      if (status != 0)
-       truncate_warn (archive_name_array[0]);
-    }
-
   close_archive ();
   names_notfound ();
 }
This page took 0.029707 seconds and 4 git commands to generate.