File tar-1.27-revert-optimize-c-sparse.patch of Package tar.28079
---
src/sparse.c | 54 ++++++++++++++++++++++++++----------------------------
1 file changed, 26 insertions(+), 28 deletions(-)
--- a/src/sparse.c
+++ b/src/sparse.c
@@ -215,45 +215,43 @@ sparse_scan_file (struct tar_sparse_file
struct tar_stat_info *st = file->stat_info;
int fd = file->fd;
char buffer[BLOCKSIZE];
- size_t count = 0;
+ size_t count;
off_t offset = 0;
struct sp_array sp = {0, 0};
+ if (!lseek_or_error (file, 0))
+ return false;
+
st->archive_file_size = 0;
- if (ST_NBLOCKS (st->stat) == 0)
- offset = st->stat.st_size;
- else
- {
- if (!tar_sparse_scan (file, scan_begin, NULL))
- return false;
+ if (!tar_sparse_scan (file, scan_begin, NULL))
+ return false;
- while ((count = blocking_read (fd, buffer, sizeof buffer)) != 0
- && count != SAFE_READ_ERROR)
+ while ((count = blocking_read (fd, buffer, sizeof buffer)) != 0
+ && count != SAFE_READ_ERROR)
+ {
+ /* Analyze the block. */
+ if (zero_block_p (buffer, count))
{
- /* Analyze the block. */
- if (zero_block_p (buffer, count))
- {
- if (sp.numbytes)
- {
- sparse_add_map (st, &sp);
- sp.numbytes = 0;
- if (!tar_sparse_scan (file, scan_block, NULL))
- return false;
- }
- }
- else
+ if (sp.numbytes)
{
- if (sp.numbytes == 0)
- sp.offset = offset;
- sp.numbytes += count;
- st->archive_file_size += count;
- if (!tar_sparse_scan (file, scan_block, buffer))
+ sparse_add_map (st, &sp);
+ sp.numbytes = 0;
+ if (!tar_sparse_scan (file, scan_block, NULL))
return false;
}
-
- offset += count;
}
+ else
+ {
+ if (sp.numbytes == 0)
+ sp.offset = offset;
+ sp.numbytes += count;
+ st->archive_file_size += count;
+ if (!tar_sparse_scan (file, scan_block, buffer))
+ return false;
+ }
+
+ offset += count;
}
if (sp.numbytes == 0)