]> Dogcows Code - chaz/tar/blobdiff - src/delete.c
Updated
[chaz/tar] / src / delete.c
index bb09af8154bac990a66c358786777e0bb19b2ad4..8b4c1b225c027860b538997edb0859f47c94fd4b 100644 (file)
@@ -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)
 {
@@ -150,7 +165,7 @@ delete_archive_members (void)
 
   do
     {
-      enum read_header status = read_header (1);
+      enum read_header status = read_header (true);
 
       switch (status)
        {
@@ -189,6 +204,7 @@ delete_archive_members (void)
              /* Fall through.  */
 
            case HEADER_SUCCESS:
+           case HEADER_SUCCESS_EXTENDED:
            case HEADER_ZERO_BLOCK:
              ERROR ((0, 0, _("Skipping to next header")));
              /* Fall through.  */
@@ -238,8 +254,11 @@ delete_archive_members (void)
 
          if (current_block == record_end)
            flush_archive ();
-         status = read_header (0);
-
+         status = read_header (false);
+         
+         if (extended_header.size)
+           xheader_decode (&current_stat_info);
+         
          if (status == HEADER_ZERO_BLOCK && ignore_zeros_option)
            {
              set_next_block_after (current_header);
@@ -279,8 +298,16 @@ delete_archive_members (void)
 
          /* 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
This page took 0.021272 seconds and 4 git commands to generate.