diff options
author | Colin Cross <ccross@android.com> | 2012-04-24 18:51:42 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2012-07-09 22:09:36 -0700 |
commit | 411619e921904b896eddae81c086c1f687c8304d (patch) | |
tree | d7b7f2f18b42c0aa6974e6d21c38109a01af3a48 /libsparse/sparse.c | |
parent | 28fa5bc347390480fe190294c6c385b6a9f0d68b (diff) |
libsparse: remove static variables
Removes static variables in backed_block.c to allow multiple
sparse files to be open at the same time.
Change-Id: I012d8a424c6e21a7352408416adb7c72ee8add21
Diffstat (limited to 'libsparse/sparse.c')
-rw-r--r-- | libsparse/sparse.c | 26 |
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); |