diff options
Diffstat (limited to 'tar')
| -rw-r--r-- | tar/sqfs2tar.c | 56 | 
1 files changed, 50 insertions, 6 deletions
| diff --git a/tar/sqfs2tar.c b/tar/sqfs2tar.c index a330681..c38342c 100644 --- a/tar/sqfs2tar.c +++ b/tar/sqfs2tar.c @@ -303,8 +303,13 @@ skip_hdr:  int main(int argc, char **argv)  {  	int rdtree_flags = 0, status = EXIT_FAILURE; -	sqfs_reader_t sqfs; +	sqfs_compressor_config_t cfg; +	sqfs_compressor_t *cmp; +	data_reader_t *data; +	sqfs_file_t *file; +	sqfs_super_t super;  	tree_node_t *root; +	fstree_t fs;  	size_t i;  	process_args(argc, argv); @@ -312,11 +317,46 @@ int main(int argc, char **argv)  	if (!no_xattr)  		rdtree_flags |= RDTREE_READ_XATTR; -	if (sqfs_reader_open(&sqfs, filename, rdtree_flags)) +	file = sqfs_open_file(filename, SQFS_FILE_OPEN_READ_ONLY); +	if (file == NULL) { +		perror(filename);  		goto out_dirs; +	} + +	if (sqfs_super_read(&super, file)) { +		fprintf(stderr, "%s: error reading super block.\n", filename); +		goto out_fd; +	} + +	if (!sqfs_compressor_exists(super.compression_id)) { +		fprintf(stderr, "%s: unknown compressor used.\n", filename); +		goto out_fd; +	} + +	sqfs_compressor_config_init(&cfg, super.compression_id, +				    super.block_size, +				    SQFS_COMP_FLAG_UNCOMPRESS); + +	cmp = sqfs_compressor_create(&cfg); +	if (cmp == NULL) +		goto out_fd; + +	if (super.flags & SQFS_FLAG_COMPRESSOR_OPTIONS) { +		if (cmp->read_options(cmp, file)) +			goto out_cmp; +	} + +	if (deserialize_fstree(&fs, &super, cmp, file, rdtree_flags)) +		goto out_cmp; + +	fstree_gen_file_list(&fs); + +	data = data_reader_create(file, &super, cmp); +	if (data == NULL) +		goto out;  	for (i = 0; i < num_subdirs; ++i) { -		root = fstree_node_from_path(&sqfs.fs, subdirs[i]); +		root = fstree_node_from_path(&fs, subdirs[i]);  		if (root == NULL) {  			perror(subdirs[i]);  			goto out; @@ -329,14 +369,14 @@ int main(int argc, char **argv)  		current_subdir = subdirs[i]; -		if (write_tree_dfs(&sqfs.fs, root, sqfs.data)) +		if (write_tree_dfs(&fs, root, data))  			goto out;  	}  	current_subdir = NULL;  	if (num_subdirs == 0) { -		if (write_tree_dfs(&sqfs.fs, sqfs.fs.root, sqfs.data)) +		if (write_tree_dfs(&fs, fs.root, data))  			goto out;  	} @@ -345,7 +385,11 @@ int main(int argc, char **argv)  	status = EXIT_SUCCESS;  out: -	sqfs_reader_close(&sqfs); +	fstree_cleanup(&fs); +out_cmp: +	cmp->destroy(cmp); +out_fd: +	file->destroy(file);  out_dirs:  	for (i = 0; i < num_subdirs; ++i)  		free(subdirs[i]); | 
