70 lines
2.2 KiB
Diff
70 lines
2.2 KiB
Diff
From 7e9b7b16c76785c15fd1465d7985a0919848f786 Mon Sep 17 00:00:00 2001
|
|
From: WangFengTu <wangfengtu@huawei.com>
|
|
Date: Thu, 21 Jan 2021 18:44:52 +0800
|
|
Subject: [PATCH 14/26] adapt for sparse file when tar file
|
|
|
|
archive_read_data_block can not process sparse file
|
|
correctly, use archive_read_data instead.
|
|
|
|
Signed-off-by: WangFengTu <wangfengtu@huawei.com>
|
|
---
|
|
src/utils/tar/util_archive.c | 30 +++++++++++++++++++++---------
|
|
1 file changed, 21 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/src/utils/tar/util_archive.c b/src/utils/tar/util_archive.c
|
|
index 7a28286a..1b9553c9 100644
|
|
--- a/src/utils/tar/util_archive.c
|
|
+++ b/src/utils/tar/util_archive.c
|
|
@@ -699,27 +699,39 @@ out:
|
|
static int copy_data_between_archives(struct archive *ar, struct archive *aw)
|
|
{
|
|
int ret = ARCHIVE_FAILED;
|
|
- const void *buff = NULL;
|
|
- size_t size;
|
|
- int64_t offset;
|
|
+ char *buff = NULL;
|
|
+ ssize_t size = 0;
|
|
+
|
|
+ buff = util_common_calloc_s(ARCHIVE_BLOCK_SIZE);
|
|
+ if (buff == NULL) {
|
|
+ ERROR("out of memory");
|
|
+ fprintf(stderr, "out of memory");
|
|
+ return ARCHIVE_FAILED;
|
|
+ }
|
|
|
|
for (;;) {
|
|
- ret = archive_read_data_block(ar, &buff, &size, &offset);
|
|
- if (ret == ARCHIVE_EOF) {
|
|
- return ARCHIVE_OK;
|
|
+ size = archive_read_data(ar, buff, ARCHIVE_BLOCK_SIZE);
|
|
+ if (size == 0) {
|
|
+ ret = ARCHIVE_OK;
|
|
+ goto out;
|
|
}
|
|
- if (ret < ARCHIVE_OK) {
|
|
+ if (size < 0) {
|
|
ERROR("tar archive read result %d, error: %s", ret, archive_error_string(ar));
|
|
fprintf(stderr, "tar archive read result %d, error: %s", ret, archive_error_string(ar));
|
|
- return ret;
|
|
+ ret = ARCHIVE_FAILED;
|
|
+ goto out;
|
|
}
|
|
ret = archive_write_data(aw, buff, size);
|
|
if (ret < ARCHIVE_OK) {
|
|
ERROR("tar archive write result %d, error: %s", ret, archive_error_string(aw));
|
|
fprintf(stderr, "tar archive write result %d, error: %s", ret, archive_error_string(aw));
|
|
- return ret;
|
|
+ goto out;
|
|
}
|
|
}
|
|
+
|
|
+out:
|
|
+ free(buff);
|
|
+ return ret;
|
|
}
|
|
|
|
int update_entry_for_hardlink(map_t *map_link, struct archive_entry *entry, const char *src_base, const char *dst_base)
|
|
--
|
|
2.25.1
|
|
|