summaryrefslogtreecommitdiff
path: root/libsparse/sparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsparse/sparse.c')
-rw-r--r--libsparse/sparse.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/libsparse/sparse.c b/libsparse/sparse.c
index d6f556114..a6134c9d2 100644
--- a/libsparse/sparse.c
+++ b/libsparse/sparse.c
@@ -32,7 +32,11 @@ struct sparse_file *sparse_file_new(unsigned int block_size, int64_t len)
return NULL;
}
- /* TODO: allocate backed block list */
+ s->backed_block_list = backed_block_list_new();
+ if (!s->backed_block_list) {
+ free(s);
+ return NULL;
+ }
s->block_size = block_size;
s->len = len;
@@ -42,14 +46,14 @@ struct sparse_file *sparse_file_new(unsigned int block_size, int64_t len)
void sparse_file_destroy(struct sparse_file *s)
{
- free_data_blocks();
+ backed_block_list_destroy(s->backed_block_list);
free(s);
}
int sparse_file_add_data(struct sparse_file *s,
void *data, unsigned int len, unsigned int block)
{
- queue_data_block(data, len, block);
+ queue_data_block(s->backed_block_list, data, len, block);
return 0;
}
@@ -57,7 +61,7 @@ int sparse_file_add_data(struct sparse_file *s,
int sparse_file_add_fill(struct sparse_file *s,
uint32_t fill_val, unsigned int len, unsigned int block)
{
- queue_fill_block(fill_val, len, block);
+ queue_fill_block(s->backed_block_list, fill_val, len, block);
return 0;
}
@@ -66,7 +70,7 @@ int sparse_file_add_file(struct sparse_file *s,
const char *filename, int64_t file_offset, unsigned int len,
unsigned int block)
{
- queue_data_file(filename, file_offset, len, block);
+ queue_data_file(s->backed_block_list, filename, file_offset, len, block);
return 0;
}
@@ -105,11 +109,13 @@ static void count_file_block(void *priv, int64_t off, const char *file,
count_chunks->chunks++;
}
-static int count_sparse_chunks(unsigned int block_size, int64_t len)
+static int count_sparse_chunks(struct backed_block_list *b,
+ unsigned int block_size, int64_t len)
{
struct count_chunks count_chunks = {0, 0, block_size};
- for_each_data_block(count_data_block, count_file_block, count_fill_block, &count_chunks, block_size);
+ for_each_data_block(b, count_data_block, count_file_block,
+ count_fill_block, &count_chunks, block_size);
if (count_chunks.cur_ptr != len)
count_chunks.chunks++;
@@ -136,14 +142,16 @@ static void ext4_write_data_file(void *priv, int64_t off, const char *file,
int sparse_file_write(struct sparse_file *s, int fd, bool gz, bool sparse,
bool crc)
{
- int chunks = count_sparse_chunks(s->block_size, s->len);
+ int chunks = count_sparse_chunks(s->backed_block_list, s->block_size,
+ s->len);
struct output_file *out = open_output_fd(fd, s->block_size, s->len,
gz, sparse, chunks, crc);
if (!out)
return -ENOMEM;
- for_each_data_block(ext4_write_data_block, ext4_write_data_file, ext4_write_fill_block, out, s->block_size);
+ for_each_data_block(s->backed_block_list, ext4_write_data_block,
+ ext4_write_data_file, ext4_write_fill_block, out, s->block_size);
if (s->len)
pad_output_file(out, s->len);