From 69529ef26159748011ef27cddc17aa78a2ac8f3e Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sun, 23 Jun 2019 02:36:24 +0200 Subject: Add compressor options to tar2sqfs Signed-off-by: David Oberhollenzer --- doc/tar2sqfs.1 | 9 +++++++++ tar/tar2sqfs.c | 43 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/doc/tar2sqfs.1 b/doc/tar2sqfs.1 index d2688a6..ef9511b 100644 --- a/doc/tar2sqfs.1 +++ b/doc/tar2sqfs.1 @@ -14,6 +14,15 @@ squashfs. .PP Possible options: .TP +\fB\-\-compressor\fR, \fB\-c\fR +Select the compressor to use. +Run \fBtar2sqfs \-\-help\fR to get a list of all available compressors +and the default selection. +.TP +\fB\-\-comp\-extra\fR, \fB\-X\fR +A comma seperated list of extra options for the selected compressor. Specify +\fBhelp\fR to get a list of available options. +.TP \fB\-\-force\fR, \fB\-f\fR Overwrite the output file if it exists. .TP diff --git a/tar/tar2sqfs.c b/tar/tar2sqfs.c index c3fdb45..48ca2f1 100644 --- a/tar/tar2sqfs.c +++ b/tar/tar2sqfs.c @@ -19,13 +19,15 @@ #include static struct option long_opts[] = { + { "compressor", required_argument, NULL, 'c' }, + { "comp-extra", required_argument, NULL, 'X' }, { "force", no_argument, NULL, 'f' }, { "quiet", no_argument, NULL, 'q' }, { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'V' }, }; -static const char *short_opts = "fqhV"; +static const char *short_opts = "c:X:fqhV"; static const char *usagestr = "Usage: tar2sqfs [OPTIONS...] \n" @@ -35,6 +37,11 @@ static const char *usagestr = "\n" "Possible options:\n" "\n" +" --compressor, -c Select the compressor to use.\n" +" A list of available compressors is below.\n" +" --comp-extra, -X A comma seperated list of extra options for\n" +" the selected compressor. Specify 'help' to\n" +" get a list of available options.\n" " --force, -f Overwrite the output file if it exists.\n" " --quiet, -q Do not print out progress reports.\n" " --help, -h Print help text and exit.\n" @@ -52,17 +59,40 @@ static int block_size = SQFS_DEFAULT_BLOCK_SIZE; static size_t devblksize = SQFS_DEVBLK_SIZE; static bool quiet = false; static int outmode = O_WRONLY | O_CREAT | O_EXCL; +static E_SQFS_COMPRESSOR comp_id; +static char *comp_extra = NULL; static void process_args(int argc, char **argv) { + bool have_compressor; int i; + comp_id = compressor_get_default(); + for (;;) { i = getopt_long(argc, argv, short_opts, long_opts, NULL); if (i == -1) break; switch (i) { + case 'c': + have_compressor = true; + + if (compressor_id_from_name(optarg, &comp_id)) + have_compressor = false; + + if (!compressor_exists(comp_id)) + have_compressor = false; + + if (!have_compressor) { + fprintf(stderr, "Unsupported compressor '%s'\n", + optarg); + exit(EXIT_FAILURE); + } + break; + case 'X': + comp_extra = optarg; + break; case 'f': outmode = O_WRONLY | O_CREAT | O_TRUNC; break; @@ -71,6 +101,7 @@ static void process_args(int argc, char **argv) break; case 'h': fputs(usagestr, stdout); + compressor_print_available(); exit(EXIT_SUCCESS); case 'V': print_version(); @@ -80,6 +111,11 @@ static void process_args(int argc, char **argv) } } + if (comp_extra != NULL && strcmp(comp_extra, "help") == 0) { + compressor_print_help(comp_id); + exit(EXIT_SUCCESS); + } + if (optind >= argc) { fputs("Missing argument: squashfs image\n", stderr); goto fail_arg; @@ -168,7 +204,6 @@ fail: int main(int argc, char **argv) { int outfd, status = EXIT_SUCCESS; - E_SQFS_COMPRESSOR comp_id; data_writer_t *data; sqfs_super_t super; compressor_t *cmp; @@ -187,9 +222,7 @@ int main(int argc, char **argv) if (fstree_init(&fs, block_size, NULL)) goto out_fd; - comp_id = compressor_get_default(); - - cmp = compressor_create(comp_id, true, block_size, NULL); + cmp = compressor_create(comp_id, true, block_size, comp_extra); if (cmp == NULL) { fputs("Error creating compressor\n", stderr); goto out_fs; -- cgit v1.2.3