diff options
| author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2021-10-22 17:19:34 +0200 | 
|---|---|---|
| committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2022-03-30 22:31:30 +0200 | 
| commit | 916c8f6e26140cf3c03e58726b57dc4f86e18316 (patch) | |
| tree | 59603136d62ef2b7ca3626e26929e848db7ab3f1 /bin | |
| parent | a0e9956f931e28eeb430bd2459668fd96a69c676 (diff) | |
Cleanup: remove struct stat from libtar
The idea was originally to use struct stat in the libfstree code, so
we can simply hose data read from a directory into the fstree_t. The
struct was then also used with libtar, for simpler interoperation,
but it turned out to introduce a lot of platform quirks and causes
more trouble than it's worth.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'bin')
| -rw-r--r-- | bin/tar2sqfs/process_tarball.c | 33 | 
1 files changed, 20 insertions, 13 deletions
| diff --git a/bin/tar2sqfs/process_tarball.c b/bin/tar2sqfs/process_tarball.c index 8465760..c0ae5a3 100644 --- a/bin/tar2sqfs/process_tarball.c +++ b/bin/tar2sqfs/process_tarball.c @@ -128,6 +128,7 @@ static int create_node_and_repack_data(istream_t *input_file,  				       tar_header_decoded_t *hdr)  {  	tree_node_t *node; +	struct stat sb;  	if (hdr->is_hard_link) {  		node = fstree_add_hard_link(&sqfs->fs, hdr->name, @@ -143,11 +144,19 @@ static int create_node_and_repack_data(istream_t *input_file,  	}  	if (!keep_time) { -		hdr->sb.st_mtime = sqfs->fs.defaults.st_mtime; +		hdr->mtime = sqfs->fs.defaults.st_mtime;  	} +	memset(&sb, 0, sizeof(sb)); +	sb.st_mode = hdr->mode; +	sb.st_uid = hdr->uid; +	sb.st_gid = hdr->gid; +	sb.st_rdev = hdr->devno; +	sb.st_size = hdr->actual_size; +	sb.st_mtime = hdr->mtime; +  	node = fstree_add_generic(&sqfs->fs, hdr->name, -				  &hdr->sb, hdr->link_target); +				  &sb, hdr->link_target);  	if (node == NULL)  		goto fail_errno; @@ -159,9 +168,9 @@ static int create_node_and_repack_data(istream_t *input_file,  			return -1;  	} -	if (S_ISREG(hdr->sb.st_mode)) { +	if (S_ISREG(hdr->mode)) {  		if (write_file(input_file, sqfs, hdr, &node->data.file, -			       hdr->sb.st_size)) { +			       hdr->actual_size)) {  			return -1;  		}  	} @@ -175,17 +184,17 @@ fail_errno:  static int set_root_attribs(sqfs_writer_t *sqfs,  			    const tar_header_decoded_t *hdr)  { -	if (hdr->is_hard_link || !S_ISDIR(hdr->sb.st_mode)) { +	if (hdr->is_hard_link || !S_ISDIR(hdr->mode)) {  		fprintf(stderr, "'%s' is not a directory!\n", hdr->name);  		return -1;  	} -	sqfs->fs.root->uid = hdr->sb.st_uid; -	sqfs->fs.root->gid = hdr->sb.st_gid; -	sqfs->fs.root->mode = hdr->sb.st_mode; +	sqfs->fs.root->uid = hdr->uid; +	sqfs->fs.root->gid = hdr->gid; +	sqfs->fs.root->mode = hdr->mode;  	if (keep_time) -		sqfs->fs.root->mod_time = hdr->sb.st_mtime; +		sqfs->fs.root->mod_time = hdr->mtime;  	if (!cfg.no_xattr) {  		if (copy_xattr(sqfs, sqfs->fs.root, hdr)) @@ -220,8 +229,6 @@ int process_tarball(istream_t *input_file, sqfs_writer_t *sqfs)  		if ((sqfs_u64)hdr.mtime > 0x0FFFFFFFFUL)  			hdr.mtime = 0x0FFFFFFFFUL; -		hdr.sb.st_mtime = hdr.mtime; -  		skip = false;  		is_root = false;  		is_prefixed = true; @@ -276,7 +283,7 @@ int process_tarball(istream_t *input_file, sqfs_writer_t *sqfs)  		}  		if (!is_prefixed) { -			if (skip_entry(input_file, hdr.sb.st_size)) +			if (skip_entry(input_file, hdr.record_size))  				goto fail;  			clear_header(&hdr);  			continue; @@ -319,7 +326,7 @@ int process_tarball(istream_t *input_file, sqfs_writer_t *sqfs)  		if (skip) {  			if (dont_skip)  				goto fail; -			if (skip_entry(input_file, hdr.sb.st_size)) +			if (skip_entry(input_file, hdr.record_size))  				goto fail;  			clear_header(&hdr); | 
