X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fsparse.c;h=30bf03157c962c09f51fc8b8be07eb6f287e1000;hb=a183d6f7f5006794d7b039289a5bcdd04ef50ede;hp=a39d0ed424b5d1c176fe1793ab316fd601b8e150;hpb=1b9c48d934b83a36f1192c5bfc2940870e19dd7c;p=chaz%2Ftar diff --git a/src/sparse.c b/src/sparse.c index a39d0ed..30bf031 100644 --- a/src/sparse.c +++ b/src/sparse.c @@ -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; }