diff options
Diffstat (limited to 'lib/sqfshelper')
| -rw-r--r-- | lib/sqfshelper/data_writer.c | 77 | 
1 files changed, 42 insertions, 35 deletions
| diff --git a/lib/sqfshelper/data_writer.c b/lib/sqfshelper/data_writer.c index 3163c4e..5bce527 100644 --- a/lib/sqfshelper/data_writer.c +++ b/lib/sqfshelper/data_writer.c @@ -50,20 +50,52 @@ static int flush_fragment_block(data_writer_t *data)  {  	int ret; -	data->frag_block->index = data->num_fragments++; -  	ret = sqfs_block_processor_enqueue(data->proc, data->frag_block);  	data->frag_block = NULL;  	return ret;  } +static int store_fragment(data_writer_t *data, sqfs_block_t *frag, +			  uint64_t signature) +{ +	size_t new_sz; +	void *new; + +	if (data->frag_list_num == data->frag_list_max) { +		new_sz = data->frag_list_max * 2; +		new = realloc(data->frag_list, +			      sizeof(data->frag_list[0]) * new_sz); + +		if (new == NULL) { +			perror("growing fragment checksum table"); +			return -1; +		} + +		data->frag_list = new; +		data->frag_list_max = new_sz; +	} + +	data->frag_list[data->frag_list_num].index = data->frag_block->index; +	data->frag_list[data->frag_list_num].offset = data->frag_block->size; +	data->frag_list[data->frag_list_num].signature = signature; +	data->frag_list_num += 1; + +	sqfs_inode_set_frag_location(frag->inode, data->frag_block->index, +				     data->frag_block->size); + +	memcpy(data->frag_block->data + data->frag_block->size, +	       frag->data, frag->size); + +	data->frag_block->flags |= (frag->flags & SQFS_BLK_DONT_COMPRESS); +	data->frag_block->size += frag->size; +	return 0; +} +  static int handle_fragment(data_writer_t *data, sqfs_block_t *frag)  { -	size_t i, size, new_sz;  	uint64_t signature; -	void *new; +	size_t i, size; -	frag->checksum = crc32(0, frag->data, frag->size);  	signature = MK_BLK_SIG(frag->checksum, frag->size);  	for (i = 0; i < data->frag_list_num; ++i) { @@ -72,8 +104,6 @@ static int handle_fragment(data_writer_t *data, sqfs_block_t *frag)  						     data->frag_list[i].index,  						     data->frag_list[i].offset);  			free(frag); - -			data->stats.frag_dup += 1;  			return 0;  		}  	} @@ -96,39 +126,14 @@ static int handle_fragment(data_writer_t *data, sqfs_block_t *frag)  			goto fail;  		} +		data->frag_block->index = data->num_fragments++;  		data->frag_block->flags = SQFS_BLK_FRAGMENT_BLOCK;  	} -	if (data->frag_list_num == data->frag_list_max) { -		new_sz = data->frag_list_max * 2; -		new = realloc(data->frag_list, -			      sizeof(data->frag_list[0]) * new_sz); - -		if (new == NULL) { -			perror("growing fragment checksum table"); -			return -1; -		} - -		data->frag_list = new; -		data->frag_list_max = new_sz; -	} - -	data->frag_list[data->frag_list_num].index = data->num_fragments; -	data->frag_list[data->frag_list_num].offset = data->frag_block->size; -	data->frag_list[data->frag_list_num].signature = signature; -	data->frag_list_num += 1; - -	sqfs_inode_set_frag_location(frag->inode, data->num_fragments, -				     data->frag_block->size); +	if (store_fragment(data, frag, signature)) +		goto fail; -	data->frag_block->flags |= (frag->flags & SQFS_BLK_DONT_COMPRESS); -	memcpy(data->frag_block->data + data->frag_block->size, -	       frag->data, frag->size); - -	data->frag_block->size += frag->size;  	free(frag); - -	data->stats.frag_count += 1;  	return 0;  fail:  	free(frag); @@ -220,6 +225,8 @@ int write_data_from_file_condensed(data_writer_t *data, sqfs_file_t *file,  				}  			} +			blk->checksum = crc32(0, blk->data, blk->size); +  			if (handle_fragment(data, blk))  				return -1;  		} else { | 
