diff options
| author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-09-04 18:28:59 +0200 | 
|---|---|---|
| committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-09-04 18:28:59 +0200 | 
| commit | 3b7f4dbb284462ef7065e19f1725f615973477da (patch) | |
| tree | 2f1da14b33e69f4a73e49abf2fdec2dbd1844f23 /lib/sqfshelper | |
| parent | 407a2baae5622b05f1e9c4137448a973fd648736 (diff) | |
Store number of file blocks in generic inode struct
This simplifies things a little bit.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/sqfshelper')
| -rw-r--r-- | lib/sqfshelper/deserialize_fstree.c | 4 | ||||
| -rw-r--r-- | lib/sqfshelper/serialize_fstree.c | 7 | ||||
| -rw-r--r-- | lib/sqfshelper/tree_node_from_inode.c | 31 | ||||
| -rw-r--r-- | lib/sqfshelper/tree_node_to_inode.c | 5 | 
4 files changed, 18 insertions, 29 deletions
| diff --git a/lib/sqfshelper/deserialize_fstree.c b/lib/sqfshelper/deserialize_fstree.c index 98c59fb..47410b0 100644 --- a/lib/sqfshelper/deserialize_fstree.c +++ b/lib/sqfshelper/deserialize_fstree.c @@ -133,7 +133,7 @@ static int fill_dir(meta_reader_t *ir, meta_reader_t *dr, tree_node_t *root,  			n = tree_node_from_inode(inode, idtbl,  						 (char *)ent->name, -						 super->block_size); +						 fs->block_size);  			if (n == NULL) {  				free(ent); @@ -257,7 +257,7 @@ int deserialize_fstree(fstree_t *out, sqfs_super_t *super, compressor_t *cmp,  	out->defaults.st_mode = 0755;  	out->defaults.st_mtime = super->modification_time; -	out->root = tree_node_from_inode(root, idtbl, "", super->block_size); +	out->root = tree_node_from_inode(root, idtbl, "", out->block_size);  	if (out->root == NULL) {  		free(root); diff --git a/lib/sqfshelper/serialize_fstree.c b/lib/sqfshelper/serialize_fstree.c index f8f3913..8e87354 100644 --- a/lib/sqfshelper/serialize_fstree.c +++ b/lib/sqfshelper/serialize_fstree.c @@ -47,10 +47,10 @@ int sqfs_serialize_fstree(int outfd, sqfs_super_t *super, fstree_t *fs,  	sqfs_inode_generic_t *inode;  	sqfs_dir_writer_t *dirwr;  	meta_writer_t *im, *dm; -	size_t i, count;  	uint32_t offset;  	uint64_t block;  	int ret = -1; +	size_t i;  	im = meta_writer_create(outfd, cmp, false);  	if (im == NULL) @@ -70,8 +70,7 @@ int sqfs_serialize_fstree(int outfd, sqfs_super_t *super, fstree_t *fs,  				goto out;  		} -		inode = tree_node_to_inode(fs, idtbl, fs->inode_table[i], -					   &count); +		inode = tree_node_to_inode(fs, idtbl, fs->inode_table[i]);  		if (inode == NULL)  			goto out; @@ -83,7 +82,7 @@ int sqfs_serialize_fstree(int outfd, sqfs_super_t *super, fstree_t *fs,  		meta_writer_get_position(im, &block, &offset);  		fs->inode_table[i]->inode_ref = (block << 16) | offset; -		if (meta_writer_write_inode(im, inode, count)) { +		if (meta_writer_write_inode(im, inode)) {  			free(inode);  			goto out;  		} diff --git a/lib/sqfshelper/tree_node_from_inode.c b/lib/sqfshelper/tree_node_from_inode.c index e77266a..d8b3361 100644 --- a/lib/sqfshelper/tree_node_from_inode.c +++ b/lib/sqfshelper/tree_node_from_inode.c @@ -12,11 +12,9 @@  #include <string.h>  #include <stdio.h> -static size_t compute_size(sqfs_inode_generic_t *inode, const char *name, -			   size_t block_size) +static size_t compute_size(sqfs_inode_generic_t *inode, const char *name)  {  	size_t size = sizeof(tree_node_t) + strlen(name) + 1; -	size_t block_count = 0;  	switch (inode->base.type) {  	case SQFS_INODE_DIR: @@ -24,16 +22,10 @@ static size_t compute_size(sqfs_inode_generic_t *inode, const char *name,  		size += sizeof(dir_info_t);  		break;  	case SQFS_INODE_FILE: -		size += sizeof(file_info_t); -		block_count = inode->data.file.file_size / block_size; -		if ((inode->data.file.file_size % block_size) != 0) -			++block_count; -		break;  	case SQFS_INODE_EXT_FILE:  		size += sizeof(file_info_t); -		block_count = inode->data.file_ext.file_size / block_size; -		if ((inode->data.file_ext.file_size % block_size) != 0) -			++block_count; +		size += inode->num_file_blocks * +			sizeof(((file_info_t *)0)->blocks[0]);  		break;  	case SQFS_INODE_SLINK:  	case SQFS_INODE_EXT_SLINK: @@ -43,26 +35,25 @@ static size_t compute_size(sqfs_inode_generic_t *inode, const char *name,  		break;  	} -	return size + block_count * sizeof(((file_info_t *)0)->blocks[0]); +	return size;  }  static void copy_block_sizes(sqfs_inode_generic_t *inode, tree_node_t *out,  			     size_t block_size)  { -	size_t i, block_count = out->data.file->size / block_size; +	size_t i;  	if ((out->data.file->size % block_size) != 0) { -		if (out->data.file->fragment == 0xFFFFFFFF || -		    out->data.file->fragment_offset == 0xFFFFFFFF) { -			++block_count; -		} else { +		if (out->data.file->fragment != 0xFFFFFFFF && +		    out->data.file->fragment_offset != 0xFFFFFFFF) {  			out->data.file->flags |= FILE_FLAG_HAS_FRAGMENT;  		}  	} -	out->name += block_count * sizeof(out->data.file->blocks[0]); +	out->name += inode->num_file_blocks * +		sizeof(out->data.file->blocks[0]); -	for (i = 0; i < block_count; ++i) +	for (i = 0; i < inode->num_file_blocks; ++i)  		out->data.file->blocks[i].size = inode->block_sizes[i];  } @@ -73,7 +64,7 @@ tree_node_t *tree_node_from_inode(sqfs_inode_generic_t *inode,  {  	tree_node_t *out; -	out = calloc(1, compute_size(inode, name, block_size)); +	out = calloc(1, compute_size(inode, name));  	if (out == NULL) {  		perror("converting inode to fs tree node");  		return NULL; diff --git a/lib/sqfshelper/tree_node_to_inode.c b/lib/sqfshelper/tree_node_to_inode.c index 21e30dd..d3346e2 100644 --- a/lib/sqfshelper/tree_node_to_inode.c +++ b/lib/sqfshelper/tree_node_to_inode.c @@ -82,8 +82,7 @@ static int get_type(tree_node_t *node)  }  sqfs_inode_generic_t *tree_node_to_inode(fstree_t *fs, id_table_t *idtbl, -					 tree_node_t *node, -					 size_t *file_num_blocks) +					 tree_node_t *node)  {  	size_t i, extra = 0, block_count = 0;  	sqfs_inode_generic_t *inode; @@ -220,7 +219,7 @@ sqfs_inode_generic_t *tree_node_to_inode(fstree_t *fs, id_table_t *idtbl,  		goto fail;  	} -	*file_num_blocks = block_count; +	inode->num_file_blocks = block_count;  	return inode;  fail:  	free(inode); | 
