summaryrefslogtreecommitdiff
path: root/libsparse/sparse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libsparse/sparse.cpp')
-rw-r--r--libsparse/sparse.cpp37
1 files changed, 30 insertions, 7 deletions
diff --git a/libsparse/sparse.cpp b/libsparse/sparse.cpp
index cb288c555..f5ca9071d 100644
--- a/libsparse/sparse.cpp
+++ b/libsparse/sparse.cpp
@@ -160,7 +160,30 @@ int sparse_file_callback(struct sparse_file* s, bool sparse, bool crc,
struct output_file* out;
chunks = sparse_count_chunks(s);
- out = output_file_open_callback(write, priv, s->block_size, s->len, false, sparse, chunks, crc);
+ out = output_file_open_callback(write, nullptr, nullptr, nullptr, priv, s->block_size, s->len,
+ sparse, chunks, crc);
+
+ if (!out) return -ENOMEM;
+
+ ret = write_all_blocks(s, out);
+
+ output_file_close(out);
+
+ return ret;
+}
+
+int sparse_file_callback_typed(struct sparse_file* s, bool sparse,
+ int (*data_write)(void* priv, const void* data, size_t len),
+ int (*fd_write)(void* priv, int fd, size_t len),
+ int (*fill_write)(void* priv, uint32_t fill_val, size_t len),
+ int (*skip_write)(void* priv, int64_t len), void* priv) {
+ int ret;
+ int chunks;
+ struct output_file* out;
+
+ chunks = sparse_count_chunks(s);
+ out = output_file_open_callback(data_write, fd_write, fill_write, skip_write, priv, s->block_size,
+ s->len, sparse, chunks, false);
if (!out) return -ENOMEM;
@@ -198,8 +221,8 @@ int sparse_file_foreach_chunk(struct sparse_file* s, bool sparse, bool crc,
chk.write = write;
chk.block = chk.nr_blocks = 0;
chunks = sparse_count_chunks(s);
- out = output_file_open_callback(foreach_chunk_write, &chk, s->block_size, s->len, false, sparse,
- chunks, crc);
+ out = output_file_open_callback(foreach_chunk_write, nullptr, nullptr, nullptr, &chk,
+ s->block_size, s->len, sparse, chunks, crc);
if (!out) return -ENOMEM;
@@ -227,8 +250,8 @@ int64_t sparse_file_len(struct sparse_file* s, bool sparse, bool crc) {
int64_t count = 0;
struct output_file* out;
- out = output_file_open_callback(out_counter_write, &count, s->block_size, s->len, false, sparse,
- chunks, crc);
+ out = output_file_open_callback(out_counter_write, nullptr, nullptr, nullptr, &count,
+ s->block_size, s->len, sparse, chunks, crc);
if (!out) {
return -1;
}
@@ -267,8 +290,8 @@ static struct backed_block* move_chunks_up_to_len(struct sparse_file* from, stru
len -= overhead;
start = backed_block_iter_new(from->backed_block_list);
- out_counter = output_file_open_callback(out_counter_write, &count, to->block_size, to->len, false,
- true, 0, false);
+ out_counter = output_file_open_callback(out_counter_write, nullptr, nullptr, nullptr, &count,
+ to->block_size, to->len, true, 0, false);
if (!out_counter) {
return nullptr;
}