]> Dogcows Code - chaz/tar/blobdiff - src/delete.c
Started merging with cpio into paxutils.
[chaz/tar] / src / delete.c
index a854adce3b1299d67dfa7a4ac1a8382031297275..a18f59845fc3d4ee91cfec353e526d64f5326376 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;
@@ -132,6 +132,21 @@ write_recent_blocks (union block *h, size_t blocks)
     }
 }
 
+static void
+write_recent_bytes (char *data, size_t bytes)
+{
+  size_t blocks = bytes / BLOCKSIZE;
+  size_t rest = bytes - blocks * BLOCKSIZE;
+
+  write_recent_blocks ((union block *)data, blocks);
+  memcpy (new_record[new_blocks].buffer, data + blocks * BLOCKSIZE, rest);
+  if (rest < BLOCKSIZE)
+    memset (new_record[new_blocks].buffer + rest, 0, BLOCKSIZE - rest);
+  new_blocks++;
+  if (new_blocks == blocking_factor)
+    write_record (1);
+}
+
 void
 delete_archive_members (void)
 {
@@ -158,12 +173,18 @@ delete_archive_members (void)
          abort ();
 
        case HEADER_SUCCESS:
-         if (name = name_scan (current_stat_info.file_name), !name)
+         if ((name = name_scan (current_stat_info.file_name)) == NULL)
            {
              skip_member ();
              break;
            }
-         name->found = 1;
+         name->found_count++;
+         if (!ISFOUND(name))
+           {
+             skip_member ();
+             break;
+           }
+         
          /* Fall through.  */
        case HEADER_SUCCESS_EXTENDED:
          logical_status = status;
@@ -213,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.  */
 
@@ -240,7 +261,9 @@ delete_archive_members (void)
          if (current_block == record_end)
            flush_archive ();
          status = read_header (false);
-
+         
+         xheader_decode (&current_stat_info);
+         
          if (status == HEADER_ZERO_BLOCK && ignore_zeros_option)
            {
              set_next_block_after (current_header);
@@ -261,27 +284,38 @@ delete_archive_members (void)
 
          /* Found another header.  */
 
-         if (name = name_scan (current_stat_info.file_name), name)
+         if ((name = name_scan (current_stat_info.file_name)) != NULL)
            {
-             name->found = 1;
-           flush_file:
-             set_next_block_after (current_header);
-             blocks_to_skip = (current_stat_info.stat.st_size + BLOCKSIZE - 1) / BLOCKSIZE;
-
-             while (record_end - current_block <= blocks_to_skip)
+             name->found_count++;
+             if (ISFOUND(name))
                {
-                 blocks_to_skip -= (record_end - current_block);
-                 flush_archive ();
+               flush_file:
+                 set_next_block_after (current_header);
+                 blocks_to_skip = (current_stat_info.stat.st_size
+                                   + BLOCKSIZE - 1) / BLOCKSIZE;
+
+                 while (record_end - current_block <= blocks_to_skip)
+                   {
+                     blocks_to_skip -= (record_end - current_block);
+                     flush_archive ();
+                   }
+                 current_block += blocks_to_skip;
+                 blocks_to_skip = 0;
+                 continue;
                }
-             current_block += blocks_to_skip;
-             blocks_to_skip = 0;
-             continue;
            }
-
          /* Copy header.  */
 
-         write_recent_blocks (recent_long_name, recent_long_name_blocks);
-         write_recent_blocks (recent_long_link, recent_long_link_blocks);
+         if (extended_header.size)
+           {
+             write_recent_bytes (extended_header.buffer,
+                                 extended_header.size);
+           }
+         else
+           {
+             write_recent_blocks (recent_long_name, recent_long_name_blocks);
+             write_recent_blocks (recent_long_link, recent_long_link_blocks);
+           }
          new_record[new_blocks] = *current_header;
          new_blocks++;
          blocks_to_keep
@@ -348,13 +382,7 @@ delete_archive_members (void)
 
   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)
+      if (sys_truncate (archive))
        truncate_warn (archive_name_array[0]);
     }
 
This page took 0.023486 seconds and 4 git commands to generate.