]> Dogcows Code - chaz/tar/blobdiff - src/sparse.c
(tar_sparse_major,tar_sparse_minor): New globals.
[chaz/tar] / src / sparse.c
index a39d0ed424b5d1c176fe1793ab316fd601b8e150..a8192beda8ea5f89a7d5d93d935b381317716787 100644 (file)
@@ -324,6 +324,7 @@ sparse_dump_region (struct tar_sparse_file *file, size_t i)
       memset (blk->buffer + bytes_read, 0, BLOCKSIZE - bytes_read);
       bytes_left -= bytes_read;
       file->dumped_size += bytes_read;
+      mv_size_left (file->stat_info->archive_file_size - file->dumped_size);
       set_next_block_after (blk);
     }
 
@@ -360,6 +361,7 @@ sparse_extract_region (struct tar_sparse_file *file, size_t i)
       count = full_write (file->fd, blk->buffer, wrbytes);
       write_size -= count;
       file->dumped_size += count;
+      mv_size_left (file->stat_info->archive_file_size - file->dumped_size);
       file->offset += count;
       if (count != wrbytes)
        {
@@ -396,8 +398,10 @@ sparse_dump_file (int fd, struct tar_stat_info *st)
        {
          size_t i;
 
+         mv_begin (file.stat_info);
          for (i = 0; rc && i < file.stat_info->sparse_map_avail; i++)
            rc = tar_sparse_dump_region (&file, i);
+         mv_end ();
        }
     }
 
@@ -518,6 +522,8 @@ check_data_region (struct tar_sparse_file *file, size_t i)
   if (!lseek_or_error (file, file->stat_info->sparse_map[i].offset))
     return false;
   size_left = file->stat_info->sparse_map[i].numbytes;
+  mv_size_left (file->stat_info->archive_file_size - file->dumped_size);
+      
   while (size_left > 0)
     {
       size_t bytes_read;
@@ -543,6 +549,7 @@ check_data_region (struct tar_sparse_file *file, size_t i)
        }
       file->dumped_size += bytes_read;
       size_left -= bytes_read;
+      mv_size_left (file->stat_info->archive_file_size - file->dumped_size);
       if (memcmp (blk->buffer, diff_buffer, rdsize))
        {
          report_difference (file->stat_info, _("Contents differ"));
@@ -568,6 +575,7 @@ sparse_diff_file (int fd, struct tar_stat_info *st)
   file.seekable = true; /* File *must* be seekable for compare to work */
   
   rc = tar_sparse_decode_header (&file);
+  mv_begin (st);
   for (i = 0; rc && i < file.stat_info->sparse_map_avail; i++)
     {
       rc = check_sparse_region (&file,
@@ -579,7 +587,8 @@ sparse_diff_file (int fd, struct tar_stat_info *st)
 
   if (!rc)
     skip_file (file.stat_info->archive_file_size - file.dumped_size);
-
+  mv_end ();
+  
   tar_sparse_done (&file);
   return rc;
 }
@@ -877,11 +886,12 @@ pax_dump_header (struct tar_sparse_file *file)
   size_t i;
   char nbuf[UINTMAX_STRSIZE_BOUND];
   struct sp_array *map = file->stat_info->sparse_map;
-    
+  char *save_file_name = NULL;
+  
   /* Store the real file size */
   xheader_store ("GNU.sparse.size", file->stat_info, NULL);
   xheader_store ("GNU.sparse.numblocks", file->stat_info, NULL);
-
+  
   /* FIXME-1.14-1.15.1-1.20: See the comment above.
      Starting with 1.17 this should display a warning about POSIX-incompatible
      keywords being generated. In 1.20, the true branch of the if block below
@@ -898,6 +908,11 @@ pax_dump_header (struct tar_sparse_file *file)
     }
   else
     {
+      xheader_store ("GNU.sparse.name", file->stat_info, NULL);
+      save_file_name = file->stat_info->file_name;
+      file->stat_info->file_name = xheader_format_name (file->stat_info,
+                                              "%d/GNUSparseFile.%p/%f", 0);
+
       xheader_string_begin ();
       for (i = 0; i < file->stat_info->sparse_map_avail; i++)
        {
@@ -913,6 +928,11 @@ pax_dump_header (struct tar_sparse_file *file)
   /* Store the effective (shrunken) file size */
   OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size);
   finish_header (file->stat_info, blk, block_ordinal);
+  if (save_file_name)
+    {
+      free (file->stat_info->file_name);
+      file->stat_info->file_name = save_file_name;
+    }
   return true;
 }
 
This page took 0.026192 seconds and 4 git commands to generate.