aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/tar2sqfs.19
-rw-r--r--tar/tar2sqfs.c43
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 <name>
+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 <options>
+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 <fcntl.h>
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...] <sqfsfile>\n"
@@ -35,6 +37,11 @@ static const char *usagestr =
"\n"
"Possible options:\n"
"\n"
+" --compressor, -c <name> Select the compressor to use.\n"
+" A list of available compressors is below.\n"
+" --comp-extra, -X <options> 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;