sparse: Move main header parsing to a function of its own

The current sparse image format parser is quite tangled, with a lot of
code duplication.

Start refactoring it by moving the header parsing function to a function
of its own.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
Maxime Ripard 2015-10-15 14:34:10 +02:00 committed by Tom Rini
parent 10b6971215
commit bb83c0f35a

View File

@ -41,6 +41,26 @@
#include <part.h>
#include <sparse_format.h>
static sparse_header_t *sparse_parse_header(void **data)
{
/* Read and skip over sparse image header */
sparse_header_t *sparse_header = (sparse_header_t *) *data;
*data += sparse_header->file_hdr_sz;
debug("=== Sparse Image Header ===\n");
debug("magic: 0x%x\n", sparse_header->magic);
debug("major_version: 0x%x\n", sparse_header->major_version);
debug("minor_version: 0x%x\n", sparse_header->minor_version);
debug("file_hdr_sz: %d\n", sparse_header->file_hdr_sz);
debug("chunk_hdr_sz: %d\n", sparse_header->chunk_hdr_sz);
debug("blk_sz: %d\n", sparse_header->blk_sz);
debug("total_blks: %d\n", sparse_header->total_blks);
debug("total_chunks: %d\n", sparse_header->total_chunks);
return sparse_header;
}
void write_sparse_image(block_dev_desc_t *dev_desc,
disk_partition_t *info, const char *part_name,
void *data, unsigned sz)
@ -58,29 +78,12 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
uint32_t total_blocks = 0;
int i;
/* Read and skip over sparse image header */
sparse_header = (sparse_header_t *) data;
data += sparse_header->file_hdr_sz;
if (sparse_header->file_hdr_sz > sizeof(sparse_header_t))
{
/*
* Skip the remaining bytes in a header that is longer than
* we expected.
*/
data += (sparse_header->file_hdr_sz - sizeof(sparse_header_t));
sparse_header = sparse_parse_header(&data);
if (!sparse_header) {
fastboot_fail("sparse header issue\n");
return;
}
debug("=== Sparse Image Header ===\n");
debug("magic: 0x%x\n", sparse_header->magic);
debug("major_version: 0x%x\n", sparse_header->major_version);
debug("minor_version: 0x%x\n", sparse_header->minor_version);
debug("file_hdr_sz: %d\n", sparse_header->file_hdr_sz);
debug("chunk_hdr_sz: %d\n", sparse_header->chunk_hdr_sz);
debug("blk_sz: %d\n", sparse_header->blk_sz);
debug("total_blks: %d\n", sparse_header->total_blks);
debug("total_chunks: %d\n", sparse_header->total_chunks);
/* verify sparse_header->blk_sz is an exact multiple of info->blksz */
if (sparse_header->blk_sz !=
(sparse_header->blk_sz & ~(info->blksz - 1))) {