diff options
author | Luca Boccassi <bluca@debian.org> | 2023-09-27 14:31:11 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-27 14:31:11 +0200 |
commit | 578840bdf95e1c542c2d646bb03415a2e07cb613 (patch) | |
tree | 66308660ffbad0dbb985c07710d7176915a8a6a7 /src/cryptsetup | |
parent | units/blockdev@.target: conflict with umount.target (diff) | |
parent | man: rename systemd-cryptsetup@.service → systemd-cryptsetup (diff) | |
download | systemd-578840bdf95e1c542c2d646bb03415a2e07cb613.tar.xz systemd-578840bdf95e1c542c2d646bb03415a2e07cb613.zip |
Merge pull request #29296 from keszybz/make-cryptsetup-offical-and-add-docs
Make cryptsetup offical and add docs
Diffstat (limited to 'src/cryptsetup')
-rw-r--r-- | src/cryptsetup/cryptsetup.c | 100 | ||||
-rw-r--r-- | src/cryptsetup/meson.build | 10 |
2 files changed, 81 insertions, 29 deletions
diff --git a/src/cryptsetup/cryptsetup.c b/src/cryptsetup/cryptsetup.c index 4fb5fe89ef..a7577d8113 100644 --- a/src/cryptsetup/cryptsetup.c +++ b/src/cryptsetup/cryptsetup.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include <errno.h> +#include <getopt.h> #include <mntent.h> #include <sys/mman.h> #include <sys/stat.h> @@ -12,6 +13,7 @@ #include "alloc-util.h" #include "ask-password-api.h" +#include "build.h" #include "cryptsetup-fido2.h" #include "cryptsetup-keyfile.h" #include "cryptsetup-pkcs11.h" @@ -127,7 +129,6 @@ PassphraseType passphrase_type_from_string(const char *s); DEFINE_STRING_TABLE_LOOKUP(passphrase_type, PassphraseType); /* Options Debian's crypttab knows we don't: - check= checkargs= noearly @@ -501,7 +502,7 @@ static int parse_one_option(const char *option) { return 0; } -static int parse_options(const char *options) { +static int parse_crypt_config(const char *options) { assert(options); for (;;) { @@ -2025,21 +2026,62 @@ static int help(void) { _cleanup_free_ char *link = NULL; int r; - r = terminal_urlify_man("systemd-cryptsetup@.service", "8", &link); + r = terminal_urlify_man("systemd-cryptsetup", "8", &link); if (r < 0) return log_oom(); - printf("%s attach VOLUME SOURCEDEVICE [KEY-FILE] [OPTIONS]\n" - "%s detach VOLUME\n\n" - "Attaches or detaches an encrypted block device.\n" - "\nSee the %s for details.\n", - program_invocation_short_name, + printf("%1$s attach VOLUME SOURCE-DEVICE [KEY-FILE] [CONFIG]\n" + "%1$s detach VOLUME\n\n" + "%2$sAttach or detach an encrypted block device.%3$s\n\n" + " -h --help Show this help\n" + " --version Show package version\n" + "\nSee the %4$s for details.\n", program_invocation_short_name, + ansi_highlight(), + ansi_normal(), link); return 0; } +static int parse_argv(int argc, char *argv[]) { + enum { + ARG_VERSION = 0x100, + }; + + static const struct option options[] = { + { "help", no_argument, NULL, 'h' }, + { "version", no_argument, NULL, ARG_VERSION }, + {} + }; + + int c; + + assert(argc >= 0); + assert(argv); + + if (argv_looks_like_help(argc, argv)) + return help(); + + while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) + switch (c) { + + case 'h': + return help(); + + case ARG_VERSION: + return version(); + + case '?': + return -EINVAL; + + default: + assert_not_reached(); + } + + return 1; +} + static uint32_t determine_flags(void) { uint32_t flags = 0; @@ -2086,25 +2128,24 @@ static int run(int argc, char *argv[]) { const char *verb; int r; - if (argv_looks_like_help(argc, argv)) - return help(); + log_setup(); - if (argc < 3) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "This program requires at least two arguments."); + umask(0022); - log_setup(); + r = parse_argv(argc, argv); + if (r <= 0) + return r; cryptsetup_enable_logging(NULL); - umask(0022); - - verb = argv[1]; + if (argc - optind < 2) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + "This program requires at least two arguments."); + verb = ASSERT_PTR(argv[optind]); if (streq(verb, "attach")) { _unused_ _cleanup_(remove_and_erasep) const char *destroy_key_file = NULL; _cleanup_(erase_and_freep) void *key_data = NULL; - const char *volume, *source, *key_file, *options; crypt_status_info status; size_t key_data_size = 0; uint32_t flags = 0; @@ -2112,15 +2153,17 @@ static int run(int argc, char *argv[]) { usec_t until; PassphraseType passphrase_type = PASSPHRASE_NONE; - /* Arguments: systemd-cryptsetup attach VOLUME SOURCE-DEVICE [KEY-FILE] [OPTIONS] */ + /* Arguments: systemd-cryptsetup attach VOLUME SOURCE-DEVICE [KEY-FILE] [CONFIG] */ - if (argc < 4) + if (argc - optind < 3) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "attach requires at least two arguments."); + if (argc - optind >= 6) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "attach does not accept more than four arguments."); - volume = argv[2]; - source = argv[3]; - key_file = mangle_none(argc >= 5 ? argv[4] : NULL); - options = mangle_none(argc >= 6 ? argv[5] : NULL); + const char *volume = ASSERT_PTR(argv[optind + 1]), + *source = ASSERT_PTR(argv[optind + 2]), + *key_file = argc - optind >= 4 ? mangle_none(argv[optind + 3]) : NULL, + *config = argc - optind >= 5 ? mangle_none(argv[optind + 4]) : NULL; if (!filename_is_valid(volume)) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Volume name '%s' is not valid.", volume); @@ -2130,8 +2173,8 @@ static int run(int argc, char *argv[]) { key_file = NULL; } - if (options) { - r = parse_options(options); + if (config) { + r = parse_crypt_config(config); if (r < 0) return r; } @@ -2313,9 +2356,10 @@ static int run(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EPERM), "Too many attempts to activate; giving up."); } else if (streq(verb, "detach")) { - const char *volume; + const char *volume = ASSERT_PTR(argv[optind + 1]); - volume = argv[2]; + if (argc - optind >= 3) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "attach does not accept more than one argument."); if (!filename_is_valid(volume)) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Volume name '%s' is not valid.", volume); diff --git a/src/cryptsetup/meson.build b/src/cryptsetup/meson.build index 6f7aa3c796..e034cb7d24 100644 --- a/src/cryptsetup/meson.build +++ b/src/cryptsetup/meson.build @@ -16,8 +16,9 @@ if conf.get('HAVE_TPM2') == 1 endif executables += [ - libexec_template + { + executable_template + { 'name' : 'systemd-cryptsetup', + 'public' : true, 'conditions' : ['HAVE_LIBCRYPTSETUP'], 'sources' : systemd_cryptsetup_sources, 'dependencies' : [ @@ -32,3 +33,10 @@ executables += [ 'sources' : files('cryptsetup-generator.c'), }, ] + +if conf.get('HAVE_LIBCRYPTSETUP') == 1 + # symlink for backwards compatibility after rename + meson.add_install_script(sh, '-c', + ln_s.format(bindir / 'systemd-cryptsetup', + libexecdir / 'systemd-cryptsetup')) +endif |