From: Lennart Poettering Date: Fri, 7 Feb 2025 16:55:08 +0000 (+0100) Subject: dissect: optionally derive loop-ref from image filename X-Git-Tag: v258-rc1~1280^2~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b3fd03eacf146d63815ebe5c08e6737954660ad;p=thirdparty%2Fsystemd.git dissect: optionally derive loop-ref from image filename --- diff --git a/man/systemd-dissect.xml b/man/systemd-dissect.xml index 7c9369e387e..84f4a4ab108 100644 --- a/man/systemd-dissect.xml +++ b/man/systemd-dissect.xml @@ -517,6 +517,15 @@ + + + + Similar to , but automatically derive the reference + string from the specified backing filename, truncating it if necessary. + + + + diff --git a/src/dissect/dissect.c b/src/dissect/dissect.c index 956cac67084..cc538c4b92a 100644 --- a/src/dissect/dissect.c +++ b/src/dissect/dissect.c @@ -94,6 +94,7 @@ static bool arg_rmdir = false; static bool arg_in_memory = false; static char **arg_argv = NULL; static char *arg_loop_ref = NULL; +static bool arg_loop_ref_auto = false; static ImagePolicy *arg_image_policy = NULL; static bool arg_mtree_hash = true; static bool arg_via_service = false; @@ -156,6 +157,7 @@ static int help(void) { " --json=pretty|short|off\n" " Generate JSON output\n" " --loop-ref=NAME Set reference string for loopback device\n" + " --loop-ref-auto Derive reference string from image file name\n" " --mtree-hash=BOOL Whether to include SHA256 hash in the mtree output\n" " --user Discover user images\n" " --system Discover system images\n" @@ -280,6 +282,7 @@ static int parse_argv(int argc, char *argv[]) { ARG_ATTACH, ARG_DETACH, ARG_LOOP_REF, + ARG_LOOP_REF_AUTO, ARG_IMAGE_POLICY, ARG_VALIDATE, ARG_MTREE_HASH, @@ -317,6 +320,7 @@ static int parse_argv(int argc, char *argv[]) { { "json", required_argument, NULL, ARG_JSON }, { "discover", no_argument, NULL, ARG_DISCOVER }, { "loop-ref", required_argument, NULL, ARG_LOOP_REF }, + { "loop-ref-auto", no_argument, NULL, ARG_LOOP_REF_AUTO }, { "image-policy", required_argument, NULL, ARG_IMAGE_POLICY }, { "validate", no_argument, NULL, ARG_VALIDATE }, { "mtree-hash", required_argument, NULL, ARG_MTREE_HASH }, @@ -522,6 +526,7 @@ static int parse_argv(int argc, char *argv[]) { case ARG_LOOP_REF: if (isempty(optarg)) { arg_loop_ref = mfree(arg_loop_ref); + arg_loop_ref_auto = false; break; } @@ -531,6 +536,13 @@ static int parse_argv(int argc, char *argv[]) { r = free_and_strdup_warn(&arg_loop_ref, optarg); if (r < 0) return r; + + arg_loop_ref_auto = false; + break; + + case ARG_LOOP_REF_AUTO: + arg_loop_ref = mfree(arg_loop_ref); + arg_loop_ref_auto = true; break; case ARG_IMAGE_POLICY: @@ -2149,6 +2161,12 @@ static int run(int argc, char *argv[]) { * support */ } + if (!arg_loop_ref && arg_loop_ref_auto) { + r = path_extract_filename(arg_image, &arg_loop_ref); + if (r < 0) + return log_error_errno(r, "Failed to extract file name from image path '%s': %m", arg_image); + } + if (arg_action == ACTION_VALIDATE) return action_validate(); @@ -2214,8 +2232,8 @@ static int run(int argc, char *argv[]) { if (arg_in_memory) return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "--in-memory= not supported when operating via systemd-mountfsd."); - if (arg_loop_ref) - return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "--loop-ref= not supported when operating via systemd-mountfsd."); + if (arg_loop_ref || arg_loop_ref_auto) /* yes, the 2nd check is strictly speaking redundant, given the normalization we did above, but let's be explicit here */ + return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "--loop-ref=/--loop-ref-auto not supported when operating via systemd-mountfsd."); if (verity_settings_set(&arg_verity_settings)) return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Externally configured verity settings not supported when operating via systemd-mountfsd.");