diff options
Diffstat (limited to 'src/dissect')
-rw-r--r-- | src/dissect/dissect.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/dissect/dissect.c b/src/dissect/dissect.c index 6f7b44f0aa..a688e6f32c 100644 --- a/src/dissect/dissect.c +++ b/src/dissect/dissect.c @@ -81,9 +81,11 @@ static bool arg_legend = true; static bool arg_rmdir = false; static bool arg_in_memory = false; static char **arg_argv = NULL; +static char *arg_loop_ref = NULL; STATIC_DESTRUCTOR_REGISTER(arg_verity_settings, verity_settings_done); STATIC_DESTRUCTOR_REGISTER(arg_argv, strv_freep); +STATIC_DESTRUCTOR_REGISTER(arg_loop_ref, freep); static int help(void) { _cleanup_free_ char *link = NULL; @@ -123,6 +125,7 @@ static int help(void) { " not embedded in IMAGE\n" " --json=pretty|short|off\n" " Generate JSON output\n" + " --loop-ref=NAME Set reference string for loopback device\n" "\n%3$sCommands:%4$s\n" " -h --help Show this help\n" " --version Show package version\n" @@ -214,6 +217,7 @@ static int parse_argv(int argc, char *argv[]) { ARG_DISCOVER, ARG_ATTACH, ARG_DETACH, + ARG_LOOP_REF, }; static const struct option options[] = { @@ -242,6 +246,7 @@ static int parse_argv(int argc, char *argv[]) { { "copy-to", no_argument, NULL, 'a' }, { "json", required_argument, NULL, ARG_JSON }, { "discover", no_argument, NULL, ARG_DISCOVER }, + { "loop-ref", required_argument, NULL, ARG_LOOP_REF }, {} }; @@ -435,6 +440,20 @@ static int parse_argv(int argc, char *argv[]) { arg_action = ACTION_DISCOVER; break; + case ARG_LOOP_REF: + if (isempty(optarg)) { + arg_loop_ref = mfree(arg_loop_ref); + break; + } + + if (strlen(optarg) >= sizeof_field(struct loop_info64, lo_file_name)) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Loop device ref string '%s' is too long.", optarg); + + r = free_and_strdup_warn(&arg_loop_ref, optarg); + if (r < 0) + return r; + break; + case '?': return -EINVAL; @@ -1671,6 +1690,12 @@ static int run(int argc, char *argv[]) { if (r < 0) return log_error_errno(r, "Failed to set up loopback device for %s: %m", arg_image); + if (arg_loop_ref) { + r = loop_device_set_filename(d, arg_loop_ref); + if (r < 0) + log_warning_errno(r, "Failed to set loop reference string to '%s', ignoring: %m", arg_loop_ref); + } + r = dissect_loop_device_and_warn( d, &arg_verity_settings, |