From: Lennart Poettering Date: Wed, 29 Jan 2020 18:15:47 +0000 (+0100) Subject: dissect: add --fsck= option to systemd-dissect tool X-Git-Tag: v245-rc1~46^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e475f72977ba62c2d61e91b7e61165a0acc108a3;p=thirdparty%2Fsystemd.git dissect: add --fsck= option to systemd-dissect tool Let's expose this fsck behaviour directly. --- diff --git a/src/dissect/dissect.c b/src/dissect/dissect.c index 2fef95aa027..e1418419f7b 100644 --- a/src/dissect/dissect.c +++ b/src/dissect/dissect.c @@ -11,6 +11,7 @@ #include "log.h" #include "loop-util.h" #include "main-func.h" +#include "parse-util.h" #include "string-util.h" #include "strv.h" #include "user-util.h" @@ -22,7 +23,7 @@ static enum { } arg_action = ACTION_DISSECT; static const char *arg_image = NULL; static const char *arg_path = NULL; -static DissectImageFlags arg_flags = DISSECT_IMAGE_REQUIRE_ROOT|DISSECT_IMAGE_DISCARD_ON_LOOP|DISSECT_IMAGE_RELAX_VAR_CHECK; +static DissectImageFlags arg_flags = DISSECT_IMAGE_REQUIRE_ROOT|DISSECT_IMAGE_DISCARD_ON_LOOP|DISSECT_IMAGE_RELAX_VAR_CHECK|DISSECT_IMAGE_FSCK; static void *arg_root_hash = NULL; static size_t arg_root_hash_size = 0; @@ -36,6 +37,7 @@ static void help(void) { " --version Show package version\n" " -m --mount Mount the image to the specified directory\n" " -r --read-only Mount read-only\n" + " --fsck=BOOL Run fsck before mounting\n" " --discard=MODE Choose 'discard' mode (disabled, loop, all, crypto)\n" " --root-hash=HASH Specify root hash for verity\n", program_invocation_short_name, @@ -48,6 +50,7 @@ static int parse_argv(int argc, char *argv[]) { ARG_VERSION = 0x100, ARG_DISCARD, ARG_ROOT_HASH, + ARG_FSCK, }; static const struct option options[] = { @@ -57,6 +60,7 @@ static int parse_argv(int argc, char *argv[]) { { "read-only", no_argument, NULL, 'r' }, { "discard", required_argument, NULL, ARG_DISCARD }, { "root-hash", required_argument, NULL, ARG_ROOT_HASH }, + { "fsck", required_argument, NULL, ARG_FSCK }, {} }; @@ -123,6 +127,14 @@ static int parse_argv(int argc, char *argv[]) { break; } + case ARG_FSCK: + r = parse_boolean(optarg); + if (r < 0) + return log_error_errno(r, "Failed to parse --fsck= parameter: %s", optarg); + + SET_FLAG(arg_flags, DISSECT_IMAGE_FSCK, r); + break; + case '?': return -EINVAL; @@ -261,6 +273,8 @@ static int run(int argc, char *argv[]) { return r; r = dissected_image_mount(m, arg_path, UID_INVALID, arg_flags); + if (r == -EUCLEAN) + return log_error_errno(r, "File system check on image failed: %m"); if (r < 0) return log_error_errno(r, "Failed to mount image: %m");