From d92e4dc101bcb6f807accff8c8ecad4030f41afb Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Fri, 28 Jun 2019 13:01:17 +0200 Subject: Add support for unpacking sparse files as sparse files Signed-off-by: David Oberhollenzer --- unpack/options.c | 8 +++++++- unpack/rdsquashfs.c | 3 ++- unpack/rdsquashfs.h | 1 + unpack/restore_fstree.c | 3 ++- 4 files changed, 12 insertions(+), 3 deletions(-) (limited to 'unpack') diff --git a/unpack/options.c b/unpack/options.c index 84c17cf..c42f16a 100644 --- a/unpack/options.c +++ b/unpack/options.c @@ -11,6 +11,7 @@ static struct option long_opts[] = { { "no-fifo", no_argument, NULL, 'F' }, { "no-slink", no_argument, NULL, 'L' }, { "no-empty-dir", no_argument, NULL, 'E' }, + { "no-sparse", no_argument, NULL, 'Z' }, { "describe", no_argument, NULL, 'd' }, { "chmod", no_argument, NULL, 'C' }, { "chown", no_argument, NULL, 'O' }, @@ -19,7 +20,7 @@ static struct option long_opts[] = { { "version", no_argument, NULL, 'V' }, }; -static const char *short_opts = "l:c:u:p:DSFLCOEdqhV"; +static const char *short_opts = "l:c:u:p:DSFLCOEZdqhV"; static const char *help_string = "Usage: %s [OPTIONS] \n" @@ -47,6 +48,8 @@ static const char *help_string = " --no-slink, -L Do not unpack symbolic links.\n" " --no-empty-dir, -E Do not unpack directories that would end up\n" " empty after applying the above rules.\n" +" --no-sparse, -Z Do not create sparse files, always write zero\n" +" blocks to disk.\n" " --chmod, -C Change permission flags of unpacked files to\n" " those store in the squashfs image.\n" " --chown, -O Change ownership of unpacked files to the\n" @@ -118,6 +121,9 @@ void process_command_line(options_t *opt, int argc, char **argv) case 'O': opt->flags |= UNPACK_CHOWN; break; + case 'Z': + opt->flags |= UNPACK_NO_SPARSE; + break; case 'c': opt->op = OP_CAT; opt->cmdpath = get_path(opt->cmdpath, optarg); diff --git a/unpack/rdsquashfs.c b/unpack/rdsquashfs.c index fcfc9c9..42bddff 100644 --- a/unpack/rdsquashfs.c +++ b/unpack/rdsquashfs.c @@ -100,7 +100,8 @@ int main(int argc, char **argv) if (data == NULL) goto out_fs; - if (data_reader_dump_file(data, n->data.file, STDOUT_FILENO)) + if (data_reader_dump_file(data, n->data.file, + STDOUT_FILENO, false)) goto out_fs; break; case OP_UNPACK: diff --git a/unpack/rdsquashfs.h b/unpack/rdsquashfs.h index 9d1ab4f..0ee48fa 100644 --- a/unpack/rdsquashfs.h +++ b/unpack/rdsquashfs.h @@ -24,6 +24,7 @@ enum UNPACK_FLAGS { UNPACK_CHMOD = 0x01, UNPACK_CHOWN = 0x02, UNPACK_QUIET = 0x04, + UNPACK_NO_SPARSE = 0x08, }; enum { diff --git a/unpack/restore_fstree.c b/unpack/restore_fstree.c index 976b15c..ab10f5d 100644 --- a/unpack/restore_fstree.c +++ b/unpack/restore_fstree.c @@ -63,7 +63,8 @@ static int create_node(tree_node_t *n, data_reader_t *data, int flags) return -1; } - if (data_reader_dump_file(data, n->data.file, fd)) { + if (data_reader_dump_file(data, n->data.file, fd, + (flags & UNPACK_NO_SPARSE) == 0)) { close(fd); return -1; } -- cgit v1.2.3