diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2023-02-07 19:59:08 +0100 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2023-02-08 08:31:45 +0100 |
commit | d8aba88445b3ca51f1e2b45d12688378d69745e9 (patch) | |
tree | 59b134ae5b566789d6498a65b22e322450dbcf7e | |
parent | 1be51b107dd08a9575cb07a0a71d459927a85494 (diff) |
tar2sqfs: Use tar istream splice
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r-- | bin/tar2sqfs/src/process_tarball.c | 69 |
1 files changed, 14 insertions, 55 deletions
diff --git a/bin/tar2sqfs/src/process_tarball.c b/bin/tar2sqfs/src/process_tarball.c index 6aaa24b..fa1181f 100644 --- a/bin/tar2sqfs/src/process_tarball.c +++ b/bin/tar2sqfs/src/process_tarball.c @@ -7,16 +7,13 @@ #include "tar2sqfs.h" static int write_file(istream_t *input_file, sqfs_writer_t *sqfs, - const tar_header_decoded_t *hdr, - file_info_t *fi, sqfs_u64 filesize) + const tar_header_decoded_t *hdr, file_info_t *fi) { - const sparse_map_t *list; int flags = 0, ret = 0; - sqfs_u64 offset, diff; - bool sparse_region; ostream_t *out; + istream_t *in; - if (no_tail_pack && filesize > cfg.block_size) + if (no_tail_pack && hdr->actual_size > cfg.block_size) flags |= SQFS_BLK_DONT_FRAGMENT; out = data_writer_ostream_create(hdr->name, sqfs->data, &fi->inode, @@ -25,60 +22,24 @@ static int write_file(istream_t *input_file, sqfs_writer_t *sqfs, if (out == NULL) return -1; - list = hdr->sparse; - - for (offset = 0; offset < filesize; offset += diff) { - if (hdr->sparse != NULL) { - if (list == NULL) { - sparse_region = true; - diff = filesize - offset; - } else if (offset < list->offset) { - sparse_region = true; - diff = list->offset - offset; - } else if (offset - list->offset >= list->count) { - list = list->next; - diff = 0; - continue; - } else { - sparse_region = false; - diff = list->count - (offset - list->offset); - } - } else { - sparse_region = false; - diff = filesize - offset; - } - - if (diff > 0x7FFFFFFFUL) - diff = 0x7FFFFFFFUL; - - if (sparse_region) { - ret = ostream_append_sparse(out, diff); - } else { - ret = ostream_append_from_istream(out, input_file, - diff); - - if (ret == 0) { - fprintf(stderr, "%s: unexpected end-of-file\n", - hdr->name); - ret = -1; - } else if (ret > 0) { - diff = ret; - ret = 0; - } - } - - if (ret < 0) - break; + in = tar_record_istream_create(input_file, hdr); + if (in == NULL) { + sqfs_drop(out); + return -1; } + do { + ret = ostream_append_from_istream(out, in, cfg.block_size); + } while (ret > 0); + ostream_flush(out); sqfs_drop(out); + sqfs_drop(in); if (ret) return -1; - return skip_padding(input_file, hdr->sparse == NULL ? - filesize : hdr->record_size); + return skip_padding(input_file, hdr->record_size); } static int copy_xattr(sqfs_writer_t *sqfs, tree_node_t *node, @@ -169,10 +130,8 @@ static int create_node_and_repack_data(istream_t *input_file, } if (S_ISREG(hdr->mode)) { - if (write_file(input_file, sqfs, hdr, &node->data.file, - hdr->actual_size)) { + if (write_file(input_file, sqfs, hdr, &node->data.file)) return -1; - } } return 0; |