diff options
author | Colin Cross <ccross@android.com> | 2012-05-24 17:15:43 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2012-07-09 22:09:37 -0700 |
commit | 317a09e2d47257df5e0972c85f14c2a6ffdbbfd2 (patch) | |
tree | 1d16d24323042aa16d0994c05de22e2e043f6668 /libsparse | |
parent | bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2 (diff) | |
download | core-317a09e2d47257df5e0972c85f14c2a6ffdbbfd2.tar.gz core-317a09e2d47257df5e0972c85f14c2a6ffdbbfd2.tar.bz2 core-317a09e2d47257df5e0972c85f14c2a6ffdbbfd2.zip |
libsparse: add sparse_file_len
Add sparse_file_len, which will compute the size of data that would
be produced if sparse_file_write was called. Useful combined with
sparse_file_callback.
Change-Id: I1a156d1071760f5559483954a5c62ffc20298703
Diffstat (limited to 'libsparse')
-rw-r--r-- | libsparse/include/sparse/sparse.h | 14 | ||||
-rw-r--r-- | libsparse/sparse.c | 24 |
2 files changed, 38 insertions, 0 deletions
diff --git a/libsparse/include/sparse/sparse.h b/libsparse/include/sparse/sparse.h index fe003f61b..17d085ca4 100644 --- a/libsparse/include/sparse/sparse.h +++ b/libsparse/include/sparse/sparse.h @@ -158,6 +158,20 @@ int sparse_file_write(struct sparse_file *s, int fd, bool gz, bool sparse, bool crc); /** + * sparse_file_len - return the length of a sparse file if written to disk + * + * @s - sparse file cookie + * @sparse - write in the Android sparse file format + * @crc - append a crc chunk + * + * Returns the size a sparse file would be on disk if it were written in the + * specified format. If sparse is true, this is the size of the data in the + * sparse format. If sparse is false, this is the size of the normal + * non-sparse file. + */ +int64_t sparse_file_len(struct sparse_file *s, bool sparse, bool crc); + +/** * sparse_file_callback - call a callback for blocks in sparse file * * @s - sparse file cookie diff --git a/libsparse/sparse.c b/libsparse/sparse.c index 77f02fc49..f04f687b9 100644 --- a/libsparse/sparse.c +++ b/libsparse/sparse.c @@ -196,6 +196,30 @@ static int out_counter_write(void *priv, const void *data, int len) return 0; } +int64_t sparse_file_len(struct sparse_file *s, bool sparse, bool crc) +{ + int ret; + int chunks = sparse_count_chunks(s); + int64_t count = 0; + struct output_file *out; + + out = open_output_callback(out_counter_write, &count, + s->block_size, s->len, false, sparse, chunks, crc); + if (!out) { + return -1; + } + + ret = write_all_blocks(s, out); + + close_output_file(out); + + if (ret < 0) { + return -1; + } + + return count; +} + static struct backed_block *move_chunks_up_to_len(struct sparse_file *from, struct sparse_file *to, unsigned int len) { |