iSulad/0014-adapt-for-sparse-file-when-tar-file.patch
haozi007 e72b756384 iSulad: sync with upstream iSulad
Signed-off-by: haozi007 <liuhao27@huawei.com>
2021-03-23 09:50:40 +08:00

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/53] 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