summaryrefslogtreecommitdiff
path: root/src/dissect
diff options
context:
space:
mode:
Diffstat (limited to 'src/dissect')
-rw-r--r--src/dissect/dissect.c25
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,