summaryrefslogtreecommitdiff
path: root/unpack/rdsquashfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'unpack/rdsquashfs.c')
-rw-r--r--unpack/rdsquashfs.c62
1 files changed, 32 insertions, 30 deletions
diff --git a/unpack/rdsquashfs.c b/unpack/rdsquashfs.c
index 4b3a573..deba5be 100644
--- a/unpack/rdsquashfs.c
+++ b/unpack/rdsquashfs.c
@@ -112,15 +112,16 @@ static char *get_path(char *old, const char *arg)
int main(int argc, char **argv)
{
- int i, fd, status = EXIT_FAILURE, op = OP_NONE, unpack_flags = 0;
+ int i, status = EXIT_FAILURE, op = OP_NONE;
const char *unpack_root = NULL;
- frag_reader_t *frag = NULL;
char *cmdpath = NULL;
+ unsqfs_info_t info;
sqfs_super_t super;
- compressor_t *cmp;
tree_node_t *n;
fstree_t fs;
+ memset(&info, 0, sizeof(info));
+
for (;;) {
i = getopt_long(argc, argv, short_opts, long_opts, NULL);
if (i == -1)
@@ -128,25 +129,25 @@ int main(int argc, char **argv)
switch (i) {
case 'D':
- unpack_flags |= UNPACK_NO_DEVICES;
+ info.flags |= UNPACK_NO_DEVICES;
break;
case 'S':
- unpack_flags |= UNPACK_NO_SOCKETS;
+ info.flags |= UNPACK_NO_SOCKETS;
break;
case 'F':
- unpack_flags |= UNPACK_NO_FIFO;
+ info.flags |= UNPACK_NO_FIFO;
break;
case 'L':
- unpack_flags |= UNPACK_NO_SLINKS;
+ info.flags |= UNPACK_NO_SLINKS;
break;
case 'C':
- unpack_flags |= UNPACK_CHMOD;
+ info.flags |= UNPACK_CHMOD;
break;
case 'O':
- unpack_flags |= UNPACK_CHOWN;
+ info.flags |= UNPACK_CHOWN;
break;
case 'E':
- unpack_flags |= UNPACK_NO_EMPTY;
+ info.flags |= UNPACK_NO_EMPTY;
break;
case 'c':
op = OP_CAT;
@@ -186,13 +187,13 @@ int main(int argc, char **argv)
goto fail_arg;
}
- fd = open(argv[optind], O_RDONLY);
- if (fd < 0) {
+ info.sqfsfd = open(argv[optind], O_RDONLY);
+ if (info.sqfsfd < 0) {
perror(argv[optind]);
goto out_cmd;
}
- if (sqfs_super_read(&super, fd))
+ if (sqfs_super_read(&super, info.sqfsfd))
goto out_fd;
if ((super.version_major != SQFS_VERSION_MAJOR) ||
@@ -218,13 +219,16 @@ int main(int argc, char **argv)
goto out_fd;
}
- cmp = compressor_create(super.compression_id, false, super.block_size);
- if (cmp == NULL)
+ info.cmp = compressor_create(super.compression_id, false,
+ super.block_size);
+ if (info.cmp == NULL)
goto out_fd;
- if (read_fstree(&fs, fd, &super, cmp, unpack_flags))
+ if (read_fstree(&fs, &super, &info))
goto out_cmp;
+ info.block_size = super.block_size;
+
switch (op) {
case OP_LS:
n = find_node(fs.root, cmdpath);
@@ -250,15 +254,14 @@ int main(int argc, char **argv)
if (super.fragment_entry_count > 0 &&
super.fragment_table_start < super.bytes_used &&
!(super.flags & SQFS_FLAG_NO_FRAGMENTS)) {
- frag = frag_reader_create(&super, fd, cmp);
- if (frag == NULL)
+ info.frag = frag_reader_create(&super, info.sqfsfd,
+ info.cmp);
+ if (info.frag == NULL)
goto out_fs;
}
- if (extract_file(n->data.file, cmp, super.block_size,
- frag, fd, STDOUT_FILENO)) {
+ if (extract_file(n->data.file, &info, STDOUT_FILENO))
goto out_fs;
- }
break;
case OP_UNPACK:
if (cmdpath == NULL) {
@@ -274,27 +277,26 @@ int main(int argc, char **argv)
if (super.fragment_entry_count > 0 &&
super.fragment_table_start < super.bytes_used &&
!(super.flags & SQFS_FLAG_NO_FRAGMENTS)) {
- frag = frag_reader_create(&super, fd, cmp);
- if (frag == NULL)
+ info.frag = frag_reader_create(&super, info.sqfsfd,
+ info.cmp);
+ if (info.frag == NULL)
goto out_fs;
}
- if (restore_fstree(unpack_root, n, cmp, super.block_size,
- frag, fd, unpack_flags)) {
+ if (restore_fstree(unpack_root, n, &info))
goto out_fs;
- }
break;
}
status = EXIT_SUCCESS;
out_fs:
- if (frag != NULL)
- frag_reader_destroy(frag);
+ if (info.frag != NULL)
+ frag_reader_destroy(info.frag);
fstree_cleanup(&fs);
out_cmp:
- cmp->destroy(cmp);
+ info.cmp->destroy(info.cmp);
out_fd:
- close(fd);
+ close(info.sqfsfd);
out_cmd:
free(cmdpath);
return status;