}
if (sp.numbytes == 0)
- {
- sp.offset = offset - 1;
- sp.numbytes = 1;
- }
+ sp.offset = offset;
+
sparse_add_map (file, &sp);
file->stat_info->archive_file_size += count;
return tar_sparse_scan (file, scan_end, NULL);
SEEK_SET))
return false;
- do
+ while (bytes_left > 0)
{
size_t bufsize = (bytes_left > BLOCKSIZE) ? BLOCKSIZE : bytes_left;
off_t bytes_read;
file->dumped_size += bytes_read;
set_next_block_after (blk);
}
- while (bytes_left > 0);
+
return true;
}
if (!lseek_or_error (file, file->stat_info->sparse_map[index].offset,
SEEK_SET))
return false;
+
write_size = file->stat_info->sparse_map[index].numbytes;
- while (write_size > 0)
+
+ if (write_size == 0)
+ {
+ /* Last block of the file is a hole */
+ if (sys_truncate (file->fd))
+ truncate_warn (file->stat_info->orig_file_name);
+ }
+ else while (write_size > 0)
{
size_t count;
size_t wrbytes = (write_size > BLOCKSIZE) ? BLOCKSIZE : write_size;