diff options
| author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-10-06 19:01:11 +0200 | 
|---|---|---|
| committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-10-06 19:08:01 +0200 | 
| commit | 41ddda0c732d916a6962c54a3a974a8b753f194b (patch) | |
| tree | 5ea74ef79c89d41e936dfbb8dc4d65ddbcde1a7d /tar | |
| parent | 19b7609586aac382f21bdc5c7369c56417775d6d (diff) | |
Improve error reporting for sqfs2tar, rdsquashfs, sqfsdiff
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'tar')
| -rw-r--r-- | tar/sqfs2tar.c | 90 | 
1 files changed, 61 insertions, 29 deletions
diff --git a/tar/sqfs2tar.c b/tar/sqfs2tar.c index cfc3b7f..7b306f9 100644 --- a/tar/sqfs2tar.c +++ b/tar/sqfs2tar.c @@ -10,6 +10,7 @@  #include "sqfs/compressor.h"  #include "sqfs/data_reader.h"  #include "sqfs/xattr_reader.h" +#include "sqfs/error.h"  #include "highlevel.h"  #include "util.h"  #include "tar.h" @@ -184,7 +185,8 @@ static int terminate_archive(void)  			  buffer, sizeof(buffer));  } -static int get_xattrs(const sqfs_inode_generic_t *inode, tar_xattr_t **out) +static int get_xattrs(const char *name, const sqfs_inode_generic_t *inode, +		      tar_xattr_t **out)  {  	tar_xattr_t *list = NULL, *ent;  	sqfs_xattr_value_t *value; @@ -192,6 +194,7 @@ static int get_xattrs(const sqfs_inode_generic_t *inode, tar_xattr_t **out)  	sqfs_xattr_id_t desc;  	sqfs_u32 index;  	size_t i; +	int ret;  	if (xr == NULL)  		return 0; @@ -201,24 +204,28 @@ static int get_xattrs(const sqfs_inode_generic_t *inode, tar_xattr_t **out)  	if (index == 0xFFFFFFFF)  		return 0; -	if (sqfs_xattr_reader_get_desc(xr, index, &desc)) { -		fputs("Error resolving xattr index\n", stderr); +	ret = sqfs_xattr_reader_get_desc(xr, index, &desc); +	if (ret) { +		sqfs_perror(name, "resolving xattr index", ret);  		return -1;  	} -	if (sqfs_xattr_reader_seek_kv(xr, &desc)) { -		fputs("Error locating xattr key-value pairs\n", stderr); +	ret = sqfs_xattr_reader_seek_kv(xr, &desc); +	if (ret) { +		sqfs_perror(name, "locating xattr key-value pairs", ret);  		return -1;  	}  	for (i = 0; i < desc.count; ++i) { -		if (sqfs_xattr_reader_read_key(xr, &key)) { -			fputs("Error reading xattr key\n", stderr); +		ret = sqfs_xattr_reader_read_key(xr, &key); +		if (ret) { +			sqfs_perror(name, "reading xattr key", ret);  			goto fail;  		} -		if (sqfs_xattr_reader_read_value(xr, key, &value)) { -			fputs("Error reading xattr value\n", stderr); +		ret = sqfs_xattr_reader_read_value(xr, key, &value); +		if (ret) { +			sqfs_perror(name, "reading xattr value", ret);  			free(key);  			goto fail;  		} @@ -278,7 +285,7 @@ static int write_tree_dfs(const sqfs_tree_node_t *n)  	inode_stat(n, &sb);  	if (!no_xattr) { -		if (get_xattrs(n->inode, &xattr)) { +		if (get_xattrs(name, n->inode, &xattr)) {  			free(name);  			return -1;  		} @@ -297,18 +304,25 @@ static int write_tree_dfs(const sqfs_tree_node_t *n)  	if (ret > 0)  		goto out_skip; -	free(name); -	if (ret < 0) +	if (ret < 0) { +		free(name);  		return -1; +	}  	if (S_ISREG(sb.st_mode)) { -		if (sqfs_data_reader_dump(data, n->inode, STDOUT_FILENO, -					  super.block_size, false)) +		if (sqfs_data_reader_dump(name, data, n->inode, STDOUT_FILENO, +					  super.block_size, false)) { +			free(name);  			return -1; +		} -		if (padd_file(STDOUT_FILENO, sb.st_size, 512)) +		if (padd_file(STDOUT_FILENO, sb.st_size, 512)) { +			free(name);  			return -1; +		}  	} + +	free(name);  skip_hdr:  	for (n = n->children; n != NULL; n = n->next) {  		if (write_tree_dfs(n)) @@ -384,8 +398,9 @@ int main(int argc, char **argv)  		goto out_dirs;  	} -	if (sqfs_super_read(&super, file)) { -		fprintf(stderr, "%s: error reading super block.\n", filename); +	ret = sqfs_super_read(&super, file); +	if (ret) { +		sqfs_perror(filename, "reading super block", ret);  		goto out_fd;  	} @@ -399,12 +414,18 @@ int main(int argc, char **argv)  				    SQFS_COMP_FLAG_UNCOMPRESS);  	cmp = sqfs_compressor_create(&cfg); -	if (cmp == NULL) +	if (cmp == NULL) { +		fputs("Error creating compressor.\n", stderr);  		goto out_fd; +	}  	if (super.flags & SQFS_FLAG_COMPRESSOR_OPTIONS) { -		if (cmp->read_options(cmp, file)) +		ret = cmp->read_options(cmp, file); +		if (ret) { +			sqfs_perror(filename, "reading compressor options", +				    ret);  			goto out_cmp; +		}  	}  	idtbl = sqfs_id_table_create(); @@ -414,32 +435,43 @@ int main(int argc, char **argv)  		goto out_cmp;  	} -	if (sqfs_id_table_read(idtbl, file, &super, cmp)) { -		fputs("error loading ID table\n", stderr); +	ret = sqfs_id_table_read(idtbl, file, &super, cmp); +	if (ret) { +		sqfs_perror(filename, "loading ID table", ret);  		goto out_id;  	}  	data = sqfs_data_reader_create(file, super.block_size, cmp); -	if (data == NULL) +	if (data == NULL) { +		sqfs_perror(filename, "creating data reader", +			    SQFS_ERROR_ALLOC);  		goto out_id; +	} -	if (sqfs_data_reader_load_fragment_table(data, &super)) +	ret = sqfs_data_reader_load_fragment_table(data, &super); +	if (ret) { +		sqfs_perror(filename, "loading fragment table", ret);  		goto out_data; +	}  	dr = sqfs_dir_reader_create(&super, cmp, file);  	if (dr == NULL) { -		perror("creating dir reader"); +		sqfs_perror(filename, "creating dir reader", +			    SQFS_ERROR_ALLOC);  		goto out_data;  	}  	if (!no_xattr && !(super.flags & SQFS_FLAG_NO_XATTRS)) {  		xr = sqfs_xattr_reader_create(file, &super, cmp);  		if (xr == NULL) { +			sqfs_perror(filename, "creating xattr reader", +				    SQFS_ERROR_ALLOC);  			goto out_dr;  		} -		if (sqfs_xattr_reader_load_locations(xr)) { -			fputs("error loading xattr table\n", stderr); +		ret = sqfs_xattr_reader_load_locations(xr); +		if (ret) { +			sqfs_perror(filename, "loading xattr table", ret);  			goto out_xr;  		}  	} @@ -448,7 +480,7 @@ int main(int argc, char **argv)  		ret = sqfs_dir_reader_get_full_hierarchy(dr, idtbl, NULL,  							 0, &root);  		if (ret) { -			fputs("error loading file system tree", stderr); +			sqfs_perror(filename, "loading filesystem tree", ret);  			goto out;  		}  	} else { @@ -463,8 +495,8 @@ int main(int argc, char **argv)  								 flags,  								 &subtree);  			if (ret) { -				fprintf(stderr, "error loading '%s'\n", -					subdirs[i]); +				sqfs_perror(subdirs[i], "loading filesystem " +					    "tree", ret);  				goto out;  			}  | 
