]> Dogcows Code - chaz/tar/blobdiff - src/delete.c
(sys_child_open_for_uncompress): Minor stylistic fix.
[chaz/tar] / src / delete.c
index bb09af8154bac990a66c358786777e0bb19b2ad4..5d0d4f9f342e0784312918230324021923e72821 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)
        {
@@ -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;
@@ -189,6 +210,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.  */
@@ -212,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.  */
 
@@ -238,8 +260,10 @@ delete_archive_members (void)
 
          if (current_block == record_end)
            flush_archive ();
-         status = read_header (0);
-
+         status = read_header (false);
+         
+         xheader_decode (&current_stat_info);
+         
          if (status == HEADER_ZERO_BLOCK && ignore_zeros_option)
            {
              set_next_block_after (current_header);
@@ -260,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
@@ -347,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.023074 seconds and 4 git commands to generate.