tree-wide: change option_parse() to return option and arg via internal state

It was requested to make the 'c', 'opt', and 'arg' params the same, i.e.
defined through the FOREACH_OPTION macro. But we can't do that easily,
because 'c' was defined in the for loop definition, and we can only
define variables of the same type in that way. Also, in some cases we
need only 'c', in other cases with need 'c' and 'arg, in some cases 'c'
and 'opt', and in other cases all three. We'd need to either
conditionalize or mark those variables with _unused_ to deal with
compiler warnings. But a different approach works quite nicely: add
state.opt and state.arg to show the current option and it's argument.
(The short names are picked on purpose to reduce verbosity since those
are used a lot.)
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2026-04-27 11:33:10 +02:00
parent d92b511e4a
commit 5ff0ccaf8b
92 changed files with 1271 additions and 1368 deletions
+3 -4
View File
@@ -41,10 +41,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
@@ -61,7 +60,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
} }
if (option_parser_get_n_args(&state) > 0) if (option_parser_get_n_args(&opts) > 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes no arguments."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes no arguments.");
return 1; return 1;
+13 -14
View File
@@ -73,10 +73,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
@@ -85,13 +84,13 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
OPTION_LONG("icon", "NAME", "Icon name"): OPTION_LONG("icon", "NAME", "Icon name"):
arg_icon = arg; arg_icon = opts.arg;
break; break;
OPTION_LONG("timeout", "SEC", "Timeout in seconds"): OPTION_LONG("timeout", "SEC", "Timeout in seconds"):
r = parse_sec(arg, &arg_timeout); r = parse_sec(opts.arg, &arg_timeout);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --timeout= parameter: %s", arg); return log_error_errno(r, "Failed to parse --timeout= parameter: %s", opts.arg);
break; break;
/* Note the asymmetry: the long option --echo= allows an optional argument, /* Note the asymmetry: the long option --echo= allows an optional argument,
@@ -99,15 +98,15 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "echo", "yes|no|masked", OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "echo", "yes|no|masked",
"Control whether to show password while typing"): {} "Control whether to show password while typing"): {}
OPTION('e', "echo", NULL, "Equivalent to --echo=yes"): OPTION('e', "echo", NULL, "Equivalent to --echo=yes"):
if (!arg) { if (!opts.arg) {
/* Short option -e is used, or no argument to long option --echo= */ /* Short option -e is used, or no argument to long option --echo= */
arg_flags |= ASK_PASSWORD_ECHO; arg_flags |= ASK_PASSWORD_ECHO;
arg_flags &= ~ASK_PASSWORD_SILENT; arg_flags &= ~ASK_PASSWORD_SILENT;
} else if (isempty(arg) || streq(arg, "masked")) } else if (isempty(opts.arg) || streq(opts.arg, "masked"))
/* Empty argument or explicit string "masked" for default behaviour. */ /* Empty argument or explicit string "masked" for default behaviour. */
arg_flags &= ~(ASK_PASSWORD_ECHO|ASK_PASSWORD_SILENT); arg_flags &= ~(ASK_PASSWORD_ECHO|ASK_PASSWORD_SILENT);
else { else {
r = parse_boolean_argument("--echo=", arg, NULL); r = parse_boolean_argument("--echo=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
@@ -117,7 +116,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("emoji", "yes|no|auto", "Show a lock and key emoji"): OPTION_LONG("emoji", "yes|no|auto", "Show a lock and key emoji"):
emoji = arg; emoji = opts.arg;
break; break;
OPTION_LONG("no-tty", NULL, "Ask question via agent even on TTY"): OPTION_LONG("no-tty", NULL, "Ask question via agent even on TTY"):
@@ -133,11 +132,11 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("id", "ID", "Query identifier (e.g. \"cryptsetup:/dev/sda5\")"): OPTION_LONG("id", "ID", "Query identifier (e.g. \"cryptsetup:/dev/sda5\")"):
arg_id = arg; arg_id = opts.arg;
break; break;
OPTION_LONG("keyname", "NAME", "Kernel key name for caching passwords"): OPTION_LONG("keyname", "NAME", "Kernel key name for caching passwords"):
arg_key_name = arg; arg_key_name = opts.arg;
break; break;
OPTION_LONG("no-output", NULL, "Do not print password to standard output"): OPTION_LONG("no-output", NULL, "Do not print password to standard output"):
@@ -146,7 +145,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("credential", "NAME", OPTION_LONG("credential", "NAME",
"Credential name for ImportCredential=, LoadCredential= or SetCredential= credentials"): "Credential name for ImportCredential=, LoadCredential= or SetCredential= credentials"):
arg_credential_name = arg; arg_credential_name = opts.arg;
break; break;
OPTION_LONG("user", NULL, "Ask only our own user's agents"): OPTION_LONG("user", NULL, "Ask only our own user's agents"):
@@ -172,7 +171,7 @@ static int parse_argv(int argc, char *argv[]) {
SET_FLAG(arg_flags, ASK_PASSWORD_HIDE_EMOJI, !r); SET_FLAG(arg_flags, ASK_PASSWORD_HIDE_EMOJI, !r);
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (!strv_isempty(args)) { if (!strv_isempty(args)) {
arg_message = strv_join(args, " "); arg_message = strv_join(args, " ");
+3 -3
View File
@@ -81,9 +81,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
FOREACH_OPTION(&state, c, /* ret_a= */ NULL, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -93,7 +93,7 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
} }
if (option_parser_get_n_args(&state) != 0) if (option_parser_get_n_args(&opts) != 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"%s takes no argument.", "%s takes no argument.",
program_invocation_short_name); program_invocation_short_name);
+3 -4
View File
@@ -139,10 +139,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
@@ -167,7 +166,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if ((arg_unregister || arg_cat_flags != CAT_CONFIG_OFF) && !strv_isempty(args)) if ((arg_unregister || arg_cat_flags != CAT_CONFIG_OFF) && !strv_isempty(args))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+4 -5
View File
@@ -79,10 +79,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
@@ -91,13 +90,13 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return version(); return version();
OPTION_LONG("path", "PATH", "Path to the $BOOT partition (may be used multiple times)"): OPTION_LONG("path", "PATH", "Path to the $BOOT partition (may be used multiple times)"):
r = strv_extend(&arg_path, arg); r = strv_extend(&arg_path, opts.arg);
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
break; break;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+2 -2
View File
@@ -44,9 +44,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
FOREACH_OPTION(&state, c, /* ret_a= */ NULL, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
+28 -29
View File
@@ -416,10 +416,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_GROUP("Block Device Discovery Commands"): {} OPTION_GROUP("Block Device Discovery Commands"): {}
@@ -464,53 +463,53 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("esp-path", "PATH", "Path to the EFI System Partition (ESP)"): {} OPTION_LONG("esp-path", "PATH", "Path to the EFI System Partition (ESP)"): {}
OPTION_LONG("path", "PATH", /* help= */ NULL): /* Compatibility alias */ OPTION_LONG("path", "PATH", /* help= */ NULL): /* Compatibility alias */
r = free_and_strdup(&arg_esp_path, arg); r = free_and_strdup(&arg_esp_path, opts.arg);
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
break; break;
OPTION_LONG("boot-path", "PATH", "Path to the $BOOT partition"): OPTION_LONG("boot-path", "PATH", "Path to the $BOOT partition"):
r = free_and_strdup(&arg_xbootldr_path, arg); r = free_and_strdup(&arg_xbootldr_path, opts.arg);
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
break; break;
OPTION_LONG("root", "PATH", "Operate on an alternate filesystem root"): OPTION_LONG("root", "PATH", "Operate on an alternate filesystem root"):
r = parse_path_argument(arg, /* suppress_root= */ true, &arg_root); r = parse_path_argument(opts.arg, /* suppress_root= */ true, &arg_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("image", "PATH", "Operate on disk image as filesystem root"): OPTION_LONG("image", "PATH", "Operate on disk image as filesystem root"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_image); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_image);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("image-policy", "POLICY", "Specify disk image dissection policy"): OPTION_LONG("image-policy", "POLICY", "Specify disk image dissection policy"):
r = parse_image_policy_argument(arg, &arg_image_policy); r = parse_image_policy_argument(opts.arg, &arg_image_policy);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("install-source", "SOURCE", OPTION_LONG("install-source", "SOURCE",
"Where to pick files when using --root=/--image= (auto, image, host)"): { "Where to pick files when using --root=/--image= (auto, image, host)"): {
InstallSource is = install_source_from_string(arg); InstallSource is = install_source_from_string(opts.arg);
if (is < 0) if (is < 0)
return log_error_errno(is, "Unexpected parameter for --install-source=: %s", arg); return log_error_errno(is, "Unexpected parameter for --install-source=: %s", opts.arg);
arg_install_source = is; arg_install_source = is;
break; break;
} }
OPTION_LONG("variables", "BOOL", "Whether to modify EFI variables"): OPTION_LONG("variables", "BOOL", "Whether to modify EFI variables"):
r = parse_tristate_argument_with_auto("--variables=", arg, &arg_touch_variables); r = parse_tristate_argument_with_auto("--variables=", opts.arg, &arg_touch_variables);
if (r < 0) if (r < 0)
return r; return r;
#if !ENABLE_EFI #if !ENABLE_EFI
if (arg_touch_variables > 0) if (arg_touch_variables > 0)
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
"Compiled without support for EFI, --variables=%s cannot be specified.", arg); "Compiled without support for EFI, --variables=%s cannot be specified.", opts.arg);
#endif #endif
break; break;
@@ -519,7 +518,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("random-seed", "BOOL", "Whether to create random-seed file during install"): OPTION_LONG("random-seed", "BOOL", "Whether to create random-seed file during install"):
r = parse_boolean_argument("--random-seed=", arg, &arg_install_random_seed); r = parse_boolean_argument("--random-seed=", opts.arg, &arg_install_random_seed);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -540,17 +539,17 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("entry-token", "TOKEN", OPTION_LONG("entry-token", "TOKEN",
"Entry token to use for this installation" "Entry token to use for this installation"
" (machine-id, os-id, os-image-id, auto, literal:…)"): " (machine-id, os-id, os-image-id, auto, literal:…)"):
r = parse_boot_entry_token_type(arg, &arg_entry_token_type, &arg_entry_token); r = parse_boot_entry_token_type(opts.arg, &arg_entry_token_type, &arg_entry_token);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("make-entry-directory", "yes|no|auto", "Create $BOOT/ENTRY-TOKEN/ directory"): {} OPTION_LONG("make-entry-directory", "yes|no|auto", "Create $BOOT/ENTRY-TOKEN/ directory"): {}
OPTION_LONG("make-machine-id-directory", "BOOL", /* help= */ NULL): /* Compatibility alias */ OPTION_LONG("make-machine-id-directory", "BOOL", /* help= */ NULL): /* Compatibility alias */
if (streq(arg, "auto")) /* retained for backwards compatibility */ if (streq(opts.arg, "auto")) /* retained for backwards compatibility */
arg_make_entry_directory = -1; /* yes if machine-id is permanent */ arg_make_entry_directory = -1; /* yes if machine-id is permanent */
else { else {
r = parse_boolean_argument("--make-entry-directory=", arg, NULL); r = parse_boolean_argument("--make-entry-directory=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
@@ -559,7 +558,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_COMMON_JSON: OPTION_COMMON_JSON:
r = parse_json_argument(arg, &arg_json_format_flags); r = parse_json_argument(opts.arg, &arg_json_format_flags);
if (r <= 0) if (r <= 0)
return r; return r;
break; break;
@@ -570,23 +569,23 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("efi-boot-option-description", "DESCRIPTION", OPTION_LONG("efi-boot-option-description", "DESCRIPTION",
"Description of the entry in the boot option list"): "Description of the entry in the boot option list"):
if (!string_is_safe(arg, STRING_ALLOW_BACKSLASHES|STRING_ALLOW_QUOTES|STRING_ALLOW_GLOBS)) { if (!string_is_safe(opts.arg, STRING_ALLOW_BACKSLASHES|STRING_ALLOW_QUOTES|STRING_ALLOW_GLOBS)) {
_cleanup_free_ char *escaped = cescape(arg); _cleanup_free_ char *escaped = cescape(opts.arg);
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Invalid --efi-boot-option-description=: %s", strna(escaped)); "Invalid --efi-boot-option-description=: %s", strna(escaped));
} }
if (strlen(arg) > EFI_BOOT_OPTION_DESCRIPTION_MAX) if (strlen(opts.arg) > EFI_BOOT_OPTION_DESCRIPTION_MAX)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"--efi-boot-option-description= too long: %zu > %zu", "--efi-boot-option-description= too long: %zu > %zu",
strlen(arg), EFI_BOOT_OPTION_DESCRIPTION_MAX); strlen(opts.arg), EFI_BOOT_OPTION_DESCRIPTION_MAX);
r = free_and_strdup_warn(&arg_efi_boot_option_description, arg); r = free_and_strdup_warn(&arg_efi_boot_option_description, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("efi-boot-option-description-with-device", "BOOL", OPTION_LONG("efi-boot-option-description-with-device", "BOOL",
"Suffix description with disk vendor/model/serial"): "Suffix description with disk vendor/model/serial"):
r = parse_boolean_argument("--efi-boot-option-description-with-device=", arg, r = parse_boolean_argument("--efi-boot-option-description-with-device=", opts.arg,
&arg_efi_boot_option_description_with_device); &arg_efi_boot_option_description_with_device);
if (r < 0) if (r < 0)
return r; return r;
@@ -597,20 +596,20 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("secure-boot-auto-enroll", "BOOL", "Set up secure boot auto-enrollment"): OPTION_LONG("secure-boot-auto-enroll", "BOOL", "Set up secure boot auto-enrollment"):
r = parse_boolean_argument("--secure-boot-auto-enroll=", arg, r = parse_boolean_argument("--secure-boot-auto-enroll=", opts.arg,
&arg_secure_boot_auto_enroll); &arg_secure_boot_auto_enroll);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_COMMON_PRIVATE_KEY("Private key for Secure Boot auto-enrollment"): OPTION_COMMON_PRIVATE_KEY("Private key for Secure Boot auto-enrollment"):
r = free_and_strdup_warn(&arg_private_key, arg); r = free_and_strdup_warn(&arg_private_key, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_COMMON_PRIVATE_KEY_SOURCE: OPTION_COMMON_PRIVATE_KEY_SOURCE:
r = parse_openssl_key_source_argument(arg, r = parse_openssl_key_source_argument(opts.arg,
&arg_private_key_source, &arg_private_key_source,
&arg_private_key_source_type); &arg_private_key_source_type);
if (r < 0) if (r < 0)
@@ -618,13 +617,13 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_COMMON_CERTIFICATE("PEM certificate to use when setting up Secure Boot auto-enrollment"): OPTION_COMMON_CERTIFICATE("PEM certificate to use when setting up Secure Boot auto-enrollment"):
r = free_and_strdup_warn(&arg_certificate, arg); r = free_and_strdup_warn(&arg_certificate, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_COMMON_CERTIFICATE_SOURCE: OPTION_COMMON_CERTIFICATE_SOURCE:
r = parse_openssl_certificate_source_argument(arg, r = parse_openssl_certificate_source_argument(opts.arg,
&arg_certificate_source, &arg_certificate_source,
&arg_certificate_source_type); &arg_certificate_source_type);
if (r < 0) if (r < 0)
@@ -632,7 +631,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (!!arg_print_esp_path + !!arg_print_dollar_boot_path + (arg_print_root_device > 0) + arg_print_loader_path + arg_print_stub_path + arg_print_efi_architecture > 1) if (!!arg_print_esp_path + !!arg_print_dollar_boot_path + (arg_print_root_device > 0) + arg_print_loader_path + arg_print_stub_path + arg_print_efi_architecture > 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+13 -14
View File
@@ -69,11 +69,10 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 1); assert(argc >= 1);
assert(argv); assert(argv);
OptionParser state = { argc, argv, OPTION_PARSER_RETURN_POSITIONAL_ARGS }; OptionParser opts = { argc, argv, OPTION_PARSER_RETURN_POSITIONAL_ARGS };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -97,7 +96,7 @@ static int parse_argv(int argc, char *argv[]) {
"Cannot combine --unit with --user-unit."); "Cannot combine --unit with --user-unit.");
arg_show_unit = SHOW_UNIT_SYSTEM; arg_show_unit = SHOW_UNIT_SYSTEM;
if (strv_extend(&arg_names, arg) < 0) /* push arg if not empty */ if (strv_extend(&arg_names, opts.arg) < 0) /* push arg if not empty */
return log_oom(); return log_oom();
break; break;
@@ -108,17 +107,17 @@ static int parse_argv(int argc, char *argv[]) {
"Cannot combine --user-unit with --unit."); "Cannot combine --user-unit with --unit.");
arg_show_unit = SHOW_UNIT_USER; arg_show_unit = SHOW_UNIT_USER;
if (strv_extend(&arg_names, arg) < 0) /* push arg if not empty */ if (strv_extend(&arg_names, opts.arg) < 0) /* push arg if not empty */
return log_oom(); return log_oom();
break; break;
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "xattr", "BOOL", OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "xattr", "BOOL",
"Show cgroup extended attributes"): {} "Show cgroup extended attributes"): {}
OPTION_SHORT('x', NULL, "Same as --xattr=true"): OPTION_SHORT('x', NULL, "Same as --xattr=true"):
if (arg) { if (opts.arg) {
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --xattr= value: %s", arg); return log_error_errno(r, "Failed to parse --xattr= value: %s", opts.arg);
} else } else
r = true; r = true;
@@ -128,10 +127,10 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "cgroup-id", "BOOL", OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "cgroup-id", "BOOL",
"Show cgroup ID"): {} "Show cgroup ID"): {}
OPTION_SHORT('c', NULL, "Same as --cgroup-id=true"): OPTION_SHORT('c', NULL, "Same as --cgroup-id=true"):
if (arg) { if (opts.arg) {
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --cgroup-id= value: %s", arg); return log_error_errno(r, "Failed to parse --cgroup-id= value: %s", opts.arg);
} else } else
r = true; r = true;
@@ -147,11 +146,11 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_COMMON_MACHINE: OPTION_COMMON_MACHINE:
arg_machine = arg; arg_machine = opts.arg;
break; break;
OPTION_POSITIONAL: OPTION_POSITIONAL:
if (strv_extend(&arg_names, arg) < 0) /* push arg */ if (strv_extend(&arg_names, opts.arg) < 0) /* push arg */
return log_oom(); return log_oom();
break; break;
} }
@@ -160,7 +159,7 @@ static int parse_argv(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Cannot combine --unit or --user-unit with --machine=."); "Cannot combine --unit or --user-unit with --machine=.");
assert(option_parser_get_n_args(&state) == 0); assert(option_parser_get_n_args(&opts) == 0);
return 1; return 1;
} }
+18 -19
View File
@@ -719,11 +719,10 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 1); assert(argc >= 1);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -734,11 +733,11 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("order", "PROPERTY", OPTION_LONG("order", "PROPERTY",
"Order by specified property (path, tasks, cpu, memory, io)"): "Order by specified property (path, tasks, cpu, memory, io)"):
arg_order = order_from_string(arg); arg_order = order_from_string(opts.arg);
if (arg_order < 0) if (arg_order < 0)
return log_error_errno(arg_order, return log_error_errno(arg_order,
"Invalid argument to --order=: %s", "Invalid argument to --order=: %s",
arg); opts.arg);
break; break;
OPTION_SHORT('p', NULL, "Same as --order=path, order by path"): OPTION_SHORT('p', NULL, "Same as --order=path, order by path"):
@@ -767,12 +766,12 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "cpu", "percentage|time", OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "cpu", "percentage|time",
"Show CPU usage as percentage (default) or time"): "Show CPU usage as percentage (default) or time"):
if (arg) { if (opts.arg) {
arg_cpu_type = cpu_type_from_string(arg); arg_cpu_type = cpu_type_from_string(opts.arg);
if (arg_cpu_type < 0) if (arg_cpu_type < 0)
return log_error_errno(arg_cpu_type, return log_error_errno(arg_cpu_type,
"Unknown argument to --cpu=: %s", "Unknown argument to --cpu=: %s",
arg); opts.arg);
} else } else
arg_cpu_type = CPU_TIME; arg_cpu_type = CPU_TIME;
break; break;
@@ -786,7 +785,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("recursive", "BOOL", "Sum up process count recursively"): OPTION_LONG("recursive", "BOOL", "Sum up process count recursively"):
r = parse_boolean_argument("--recursive=", arg, &arg_recursive); r = parse_boolean_argument("--recursive=", opts.arg, &arg_recursive);
if (r < 0) if (r < 0)
return r; return r;
@@ -794,19 +793,19 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION('d', "delay", "DELAY", "Delay between updates"): OPTION('d', "delay", "DELAY", "Delay between updates"):
r = parse_sec(arg, &arg_delay); r = parse_sec(opts.arg, &arg_delay);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse delay parameter '%s': %m", arg); return log_error_errno(r, "Failed to parse delay parameter '%s': %m", opts.arg);
if (arg_delay <= 0) if (arg_delay <= 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Invalid delay parameter '%s'", "Invalid delay parameter '%s'",
arg); opts.arg);
break; break;
OPTION('n', "iterations", "N", "Run for N iterations before exiting"): OPTION('n', "iterations", "N", "Run for N iterations before exiting"):
r = safe_atou(arg, &arg_iterations); r = safe_atou(opts.arg, &arg_iterations);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse iterations parameter '%s': %m", arg); return log_error_errno(r, "Failed to parse iterations parameter '%s': %m", opts.arg);
break; break;
OPTION_SHORT('1', NULL, "Shortcut for --iterations=1"): OPTION_SHORT('1', NULL, "Shortcut for --iterations=1"):
@@ -819,22 +818,22 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("depth", "DEPTH", OPTION_LONG("depth", "DEPTH",
"Maximum traversal depth (default: "STRINGIFY(DEFAULT_MAXIMUM_DEPTH)")"): "Maximum traversal depth (default: "STRINGIFY(DEFAULT_MAXIMUM_DEPTH)")"):
r = safe_atou(arg, &arg_depth); r = safe_atou(opts.arg, &arg_depth);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse depth parameter '%s': %m", arg); return log_error_errno(r, "Failed to parse depth parameter '%s': %m", opts.arg);
break; break;
OPTION_COMMON_MACHINE: OPTION_COMMON_MACHINE:
arg_machine = arg; arg_machine = opts.arg;
break; break;
} }
size_t n_args = option_parser_get_n_args(&state); size_t n_args = option_parser_get_n_args(&opts);
if (n_args > 1) if (n_args > 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Too many arguments."); "Too many arguments.");
if (n_args == 1) if (n_args == 1)
arg_root = option_parser_get_args(&state)[0]; arg_root = option_parser_get_args(&opts)[0];
return 1; return 1;
} }
+14 -15
View File
@@ -62,10 +62,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -75,39 +74,39 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
OPTION_COMMON_LOG_LEVEL: OPTION_COMMON_LOG_LEVEL:
r = log_set_max_level_from_string(arg); r = log_set_max_level_from_string(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse log level \"%s\": %m", arg); return log_error_errno(r, "Failed to parse log level \"%s\": %m", opts.arg);
break; break;
OPTION_COMMON_LOG_TARGET: OPTION_COMMON_LOG_TARGET:
r = log_set_target_from_string(arg); r = log_set_target_from_string(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse log target \"%s\": %m", arg); return log_error_errno(r, "Failed to parse log target \"%s\": %m", opts.arg);
break; break;
OPTION_COMMON_LOG_COLOR: OPTION_COMMON_LOG_COLOR:
r = log_show_color_from_string(arg); r = log_show_color_from_string(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse log color setting \"%s\": %m", arg); return log_error_errno(r, "Failed to parse log color setting \"%s\": %m", opts.arg);
break; break;
OPTION_COMMON_LOG_LOCATION: OPTION_COMMON_LOG_LOCATION:
r = log_show_location_from_string(arg); r = log_show_location_from_string(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse log location setting \"%s\": %m", arg); return log_error_errno(r, "Failed to parse log location setting \"%s\": %m", opts.arg);
break; break;
OPTION_COMMON_LOG_TIME: OPTION_COMMON_LOG_TIME:
r = log_show_time_from_string(arg); r = log_show_time_from_string(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse log time setting \"%s\": %m", arg); return log_error_errno(r, "Failed to parse log time setting \"%s\": %m", opts.arg);
break; break;
OPTION_LONG("deserialize", "FD", "Deserialize process config from FD"): { OPTION_LONG("deserialize", "FD", "Deserialize process config from FD"): {
int fd = parse_fd(arg); int fd = parse_fd(opts.arg);
if (fd < 0) if (fd < 0)
return log_error_errno(fd, "Failed to parse serialization fd \"%s\": %m", arg); return log_error_errno(fd, "Failed to parse serialization fd \"%s\": %m", opts.arg);
/* Set O_CLOEXEC and as a side effect, verify that the fd is valid. */ /* Set O_CLOEXEC and as a side effect, verify that the fd is valid. */
r = fd_cloexec(fd, /* cloexec= */ true); r = fd_cloexec(fd, /* cloexec= */ true);
+29 -30
View File
@@ -823,11 +823,10 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -845,7 +844,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_COMMON_JSON: OPTION_COMMON_JSON:
r = parse_json_argument(arg, &arg_json_format_flags); r = parse_json_argument(opts.arg, &arg_json_format_flags);
if (r <= 0) if (r <= 0)
return r; return r;
break; break;
@@ -856,19 +855,19 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("transcode", "METHOD", OPTION_LONG("transcode", "METHOD",
"Transcode credential data (base64, unbase64, hex, unhex)"): "Transcode credential data (base64, unbase64, hex, unhex)"):
if (streq(arg, "help")) { if (streq(opts.arg, "help")) {
if (arg_legend) if (arg_legend)
puts("Supported transcode types:"); puts("Supported transcode types:");
return DUMP_STRING_TABLE(transcode_mode, TranscodeMode, _TRANSCODE_MAX); return DUMP_STRING_TABLE(transcode_mode, TranscodeMode, _TRANSCODE_MAX);
} }
if (parse_boolean(arg) == 0) /* If specified as "false", turn transcoding off */ if (parse_boolean(opts.arg) == 0) /* If specified as "false", turn transcoding off */
arg_transcode = TRANSCODE_OFF; arg_transcode = TRANSCODE_OFF;
else { else {
TranscodeMode m; TranscodeMode m;
m = transcode_mode_from_string(arg); m = transcode_mode_from_string(opts.arg);
if (m < 0) if (m < 0)
return log_error_errno(m, "Failed to parse transcode mode: %m"); return log_error_errno(m, "Failed to parse transcode mode: %m");
@@ -877,7 +876,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("newline", "auto|yes|no", "Suffix output with newline"): OPTION_LONG("newline", "auto|yes|no", "Suffix output with newline"):
r = parse_tristate_argument_with_auto("--newline=", arg, &arg_newline); r = parse_tristate_argument_with_auto("--newline=", opts.arg, &arg_newline);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -888,45 +887,45 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("name", "NAME", OPTION_LONG("name", "NAME",
"Override filename included in encrypted credential"): "Override filename included in encrypted credential"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_name = NULL; arg_name = NULL;
arg_name_any = true; arg_name_any = true;
break; break;
} }
if (!credential_name_valid(arg)) if (!credential_name_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid credential name: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid credential name: %s", opts.arg);
arg_name = arg; arg_name = opts.arg;
arg_name_any = false; arg_name_any = false;
break; break;
OPTION_LONG("timestamp", "TIME", OPTION_LONG("timestamp", "TIME",
"Include specified timestamp in encrypted credential"): "Include specified timestamp in encrypted credential"):
r = parse_timestamp(arg, &arg_timestamp); r = parse_timestamp(opts.arg, &arg_timestamp);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse timestamp: %s", arg); return log_error_errno(r, "Failed to parse timestamp: %s", opts.arg);
break; break;
OPTION_LONG("not-after", "TIME", OPTION_LONG("not-after", "TIME",
"Include specified invalidation time in encrypted credential"): "Include specified invalidation time in encrypted credential"):
r = parse_timestamp(arg, &arg_not_after); r = parse_timestamp(opts.arg, &arg_not_after);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --not-after= timestamp: %s", arg); return log_error_errno(r, "Failed to parse --not-after= timestamp: %s", opts.arg);
break; break;
OPTION_LONG("with-key", "KEY", OPTION_LONG("with-key", "KEY",
"Which keys to encrypt with (host, tpm2, host+tpm2, null, auto, auto-initrd)"): "Which keys to encrypt with (host, tpm2, host+tpm2, null, auto, auto-initrd)"):
if (streq(arg, "help")) { if (streq(opts.arg, "help")) {
if (arg_legend) if (arg_legend)
puts("Supported key types:"); puts("Supported key types:");
return DUMP_STRING_TABLE(cred_key_type, CredKeyType, _CRED_KEY_TYPE_MAX); return DUMP_STRING_TABLE(cred_key_type, CredKeyType, _CRED_KEY_TYPE_MAX);
} }
if (isempty(arg)) if (isempty(opts.arg))
arg_with_key = _CRED_AUTO; arg_with_key = _CRED_AUTO;
else { else {
CredKeyType t = cred_key_type_from_string(arg); CredKeyType t = cred_key_type_from_string(opts.arg);
if (t < 0) if (t < 0)
return log_error_errno(t, "Failed to parse key type: %m"); return log_error_errno(t, "Failed to parse key type: %m");
@@ -943,23 +942,23 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("tpm2-device", "PATH", "Pick TPM2 device"): OPTION_LONG("tpm2-device", "PATH", "Pick TPM2 device"):
if (streq(arg, "list")) if (streq(opts.arg, "list"))
return tpm2_list_devices(arg_legend, arg_quiet); return tpm2_list_devices(arg_legend, arg_quiet);
arg_tpm2_device = streq(arg, "auto") ? NULL : arg; arg_tpm2_device = streq(opts.arg, "auto") ? NULL : opts.arg;
break; break;
OPTION_LONG("tpm2-pcrs", "PCR1+PCR2+PCR3+…", OPTION_LONG("tpm2-pcrs", "PCR1+PCR2+PCR3+…",
"Specify TPM2 PCRs to seal against (fixed hash)"): "Specify TPM2 PCRs to seal against (fixed hash)"):
/* For fixed hash PCR policies only */ /* For fixed hash PCR policies only */
r = tpm2_parse_pcr_argument_to_mask(arg, &arg_tpm2_pcr_mask); r = tpm2_parse_pcr_argument_to_mask(opts.arg, &arg_tpm2_pcr_mask);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("tpm2-public-key", "PATH", OPTION_LONG("tpm2-public-key", "PATH",
"Specify PEM certificate to seal against"): "Specify PEM certificate to seal against"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_tpm2_public_key); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_tpm2_public_key);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -967,14 +966,14 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("tpm2-public-key-pcrs", "PCR1+PCR2+…", OPTION_LONG("tpm2-public-key-pcrs", "PCR1+PCR2+…",
"Specify TPM2 PCRs to seal against (public key)"): "Specify TPM2 PCRs to seal against (public key)"):
/* For public key PCR policies only */ /* For public key PCR policies only */
r = tpm2_parse_pcr_argument_to_mask(arg, &arg_tpm2_public_key_pcr_mask); r = tpm2_parse_pcr_argument_to_mask(opts.arg, &arg_tpm2_public_key_pcr_mask);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("tpm2-signature", "PATH", OPTION_LONG("tpm2-signature", "PATH",
"Specify signature for public key PCR policy"): "Specify signature for public key PCR policy"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_tpm2_signature); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_tpm2_signature);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -985,12 +984,12 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("uid", "UID", "Select user for scoped credentials"): OPTION_LONG("uid", "UID", "Select user for scoped credentials"):
if (isempty(arg)) if (isempty(opts.arg))
arg_uid = UID_INVALID; arg_uid = UID_INVALID;
else if (streq(arg, "self")) else if (streq(opts.arg, "self"))
arg_uid = getuid(); arg_uid = getuid();
else { else {
const char *name = arg; const char *name = opts.arg;
r = get_user_creds( r = get_user_creds(
&name, &name,
@@ -1001,7 +1000,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
/* flags= */ 0); /* flags= */ 0);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to resolve user '%s': %s", return log_error_errno(r, "Failed to resolve user '%s': %s",
arg, STRERROR_USER(r)); opts.arg, STRERROR_USER(r));
} }
break; break;
@@ -1053,7 +1052,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return log_error_errno(r, "Failed to check if invoked in Varlink mode: %m"); return log_error_errno(r, "Failed to check if invoked in Varlink mode: %m");
arg_varlink = r; arg_varlink = r;
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+37 -38
View File
@@ -276,11 +276,10 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -301,7 +300,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("wipe-slot", "SLOT1,SLOT2,…", OPTION_LONG("wipe-slot", "SLOT1,SLOT2,…",
"Wipe specified slots"): "Wipe specified slots"):
r = parse_wipe_slot(arg); r = parse_wipe_slot(opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -314,7 +313,7 @@ static int parse_argv(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Multiple unlock methods specified at once, refusing."); "Multiple unlock methods specified at once, refusing.");
r = parse_path_argument(arg, /* suppress_root= */ true, &arg_unlock_keyfile); r = parse_path_argument(opts.arg, /* suppress_root= */ true, &arg_unlock_keyfile);
if (r < 0) if (r < 0)
return r; return r;
@@ -331,8 +330,8 @@ static int parse_argv(int argc, char *argv[]) {
assert(!arg_unlock_fido2_device); assert(!arg_unlock_fido2_device);
if (!streq(arg, "auto")) { if (!streq(opts.arg, "auto")) {
device = strdup(arg); device = strdup(opts.arg);
if (!device) if (!device)
return log_oom(); return log_oom();
} }
@@ -352,8 +351,8 @@ static int parse_argv(int argc, char *argv[]) {
assert(!arg_unlock_tpm2_device); assert(!arg_unlock_tpm2_device);
if (!streq(arg, "auto")) { if (!streq(opts.arg, "auto")) {
device = strdup(arg); device = strdup(opts.arg);
if (!device) if (!device)
return log_oom(); return log_oom();
} }
@@ -389,22 +388,22 @@ static int parse_argv(int argc, char *argv[]) {
"Enroll a PKCS#11 security token or list them"): { "Enroll a PKCS#11 security token or list them"): {
_cleanup_free_ char *uri = NULL; _cleanup_free_ char *uri = NULL;
if (streq(arg, "list")) if (streq(opts.arg, "list"))
return pkcs11_list_tokens(); return pkcs11_list_tokens();
if (arg_enroll_type >= 0 || arg_pkcs11_token_uri) if (arg_enroll_type >= 0 || arg_pkcs11_token_uri)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Multiple operations specified at once, refusing."); "Multiple operations specified at once, refusing.");
if (streq(arg, "auto")) { if (streq(opts.arg, "auto")) {
r = pkcs11_find_token_auto(&uri); r = pkcs11_find_token_auto(&uri);
if (r < 0) if (r < 0)
return r; return r;
} else { } else {
if (!pkcs11_uri_valid(arg)) if (!pkcs11_uri_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Not a valid PKCS#11 URI: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Not a valid PKCS#11 URI: %s", opts.arg);
uri = strdup(arg); uri = strdup(opts.arg);
if (!uri) if (!uri)
return log_oom(); return log_oom();
} }
@@ -420,15 +419,15 @@ static int parse_argv(int argc, char *argv[]) {
"Enroll a FIDO2-HMAC security token or list them"): { "Enroll a FIDO2-HMAC security token or list them"): {
_cleanup_free_ char *device = NULL; _cleanup_free_ char *device = NULL;
if (streq(arg, "list")) if (streq(opts.arg, "list"))
return fido2_list_devices(); return fido2_list_devices();
if (arg_enroll_type >= 0 || arg_fido2_device) if (arg_enroll_type >= 0 || arg_fido2_device)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Multiple operations specified at once, refusing."); "Multiple operations specified at once, refusing.");
if (!streq(arg, "auto")) { if (!streq(opts.arg, "auto")) {
device = strdup(arg); device = strdup(opts.arg);
if (!device) if (!device)
return log_oom(); return log_oom();
} }
@@ -440,28 +439,28 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("fido2-salt-file", "PATH", OPTION_LONG("fido2-salt-file", "PATH",
"Use salt from a file instead of generating one"): "Use salt from a file instead of generating one"):
r = parse_path_argument(arg, /* suppress_root= */ true, &arg_fido2_salt_file); r = parse_path_argument(opts.arg, /* suppress_root= */ true, &arg_fido2_salt_file);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("fido2-parameters-in-header", "BOOL", OPTION_LONG("fido2-parameters-in-header", "BOOL",
"Whether to store FIDO2 parameters in the LUKS2 header"): "Whether to store FIDO2 parameters in the LUKS2 header"):
r = parse_boolean_argument("--fido2-parameters-in-header=", arg, &arg_fido2_parameters_in_header); r = parse_boolean_argument("--fido2-parameters-in-header=", opts.arg, &arg_fido2_parameters_in_header);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("fido2-credential-algorithm", "STRING", OPTION_LONG("fido2-credential-algorithm", "STRING",
"Specify COSE algorithm for FIDO2 credential"): "Specify COSE algorithm for FIDO2 credential"):
r = parse_fido2_algorithm(arg, &arg_fido2_cred_alg); r = parse_fido2_algorithm(opts.arg, &arg_fido2_cred_alg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse COSE algorithm: %s", arg); return log_error_errno(r, "Failed to parse COSE algorithm: %s", opts.arg);
break; break;
OPTION_LONG("fido2-with-client-pin", "BOOL", OPTION_LONG("fido2-with-client-pin", "BOOL",
"Whether to require entering a PIN to unlock the volume"): "Whether to require entering a PIN to unlock the volume"):
r = parse_boolean_argument("--fido2-with-client-pin=", arg, NULL); r = parse_boolean_argument("--fido2-with-client-pin=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
SET_FLAG(arg_fido2_lock_with, FIDO2ENROLL_PIN, r); SET_FLAG(arg_fido2_lock_with, FIDO2ENROLL_PIN, r);
@@ -469,7 +468,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("fido2-with-user-presence", "BOOL", OPTION_LONG("fido2-with-user-presence", "BOOL",
"Whether to require user presence to unlock the volume"): "Whether to require user presence to unlock the volume"):
r = parse_boolean_argument("--fido2-with-user-presence=", arg, NULL); r = parse_boolean_argument("--fido2-with-user-presence=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
SET_FLAG(arg_fido2_lock_with, FIDO2ENROLL_UP, r); SET_FLAG(arg_fido2_lock_with, FIDO2ENROLL_UP, r);
@@ -477,7 +476,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("fido2-with-user-verification", "BOOL", OPTION_LONG("fido2-with-user-verification", "BOOL",
"Whether to require user verification to unlock the volume"): "Whether to require user verification to unlock the volume"):
r = parse_boolean_argument("--fido2-with-user-verification=", arg, NULL); r = parse_boolean_argument("--fido2-with-user-verification=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
SET_FLAG(arg_fido2_lock_with, FIDO2ENROLL_UV, r); SET_FLAG(arg_fido2_lock_with, FIDO2ENROLL_UV, r);
@@ -489,15 +488,15 @@ static int parse_argv(int argc, char *argv[]) {
"Enroll a TPM2 device or list them"): { "Enroll a TPM2 device or list them"): {
_cleanup_free_ char *device = NULL; _cleanup_free_ char *device = NULL;
if (streq(arg, "list")) if (streq(opts.arg, "list"))
return tpm2_list_devices(/* legend= */ true, /* quiet= */ false); return tpm2_list_devices(/* legend= */ true, /* quiet= */ false);
if (arg_enroll_type >= 0 || arg_tpm2_device) if (arg_enroll_type >= 0 || arg_tpm2_device)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Multiple operations specified at once, refusing."); "Multiple operations specified at once, refusing.");
if (!streq(arg, "auto")) { if (!streq(opts.arg, "auto")) {
device = strdup(arg); device = strdup(opts.arg);
if (!device) if (!device)
return log_oom(); return log_oom();
} }
@@ -513,7 +512,7 @@ static int parse_argv(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Multiple operations specified at once, refusing."); "Multiple operations specified at once, refusing.");
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_tpm2_device_key); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_tpm2_device_key);
if (r < 0) if (r < 0)
return r; return r;
@@ -522,14 +521,14 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("tpm2-seal-key-handle", "HANDLE", OPTION_LONG("tpm2-seal-key-handle", "HANDLE",
"Specify handle of key to use for sealing"): "Specify handle of key to use for sealing"):
r = safe_atou32_full(arg, 16, &arg_tpm2_seal_key_handle); r = safe_atou32_full(opts.arg, 16, &arg_tpm2_seal_key_handle);
if (r < 0) if (r < 0)
return log_error_errno(r, "Could not parse TPM2 seal key handle index '%s': %m", arg); return log_error_errno(r, "Could not parse TPM2 seal key handle index '%s': %m", opts.arg);
break; break;
OPTION_LONG("tpm2-pcrs", "PCR1+PCR2+PCR3+…", OPTION_LONG("tpm2-pcrs", "PCR1+PCR2+PCR3+…",
"Specify TPM2 PCRs to seal against"): "Specify TPM2 PCRs to seal against"):
r = tpm2_parse_pcr_argument_append(arg, &arg_tpm2_hash_pcr_values, &arg_tpm2_n_hash_pcr_values); r = tpm2_parse_pcr_argument_append(opts.arg, &arg_tpm2_hash_pcr_values, &arg_tpm2_n_hash_pcr_values);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -537,13 +536,13 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("tpm2-public-key", "PATH", OPTION_LONG("tpm2-public-key", "PATH",
"Enroll signed TPM2 PCR policy against PEM public key"): "Enroll signed TPM2 PCR policy against PEM public key"):
/* an empty argument disables loading a public key */ /* an empty argument disables loading a public key */
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_tpm2_load_public_key = false; arg_tpm2_load_public_key = false;
arg_tpm2_public_key = mfree(arg_tpm2_public_key); arg_tpm2_public_key = mfree(arg_tpm2_public_key);
break; break;
} }
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_tpm2_public_key); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_tpm2_public_key);
if (r < 0) if (r < 0)
return r; return r;
arg_tpm2_load_public_key = true; arg_tpm2_load_public_key = true;
@@ -552,21 +551,21 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("tpm2-public-key-pcrs", "PCR1+PCR2+PCR3+…", OPTION_LONG("tpm2-public-key-pcrs", "PCR1+PCR2+PCR3+…",
"Enroll signed TPM2 PCR policy for specified TPM2 PCRs"): "Enroll signed TPM2 PCR policy for specified TPM2 PCRs"):
auto_public_key_pcr_mask = false; auto_public_key_pcr_mask = false;
r = tpm2_parse_pcr_argument_to_mask(arg, &arg_tpm2_public_key_pcr_mask); r = tpm2_parse_pcr_argument_to_mask(opts.arg, &arg_tpm2_public_key_pcr_mask);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("tpm2-signature", "PATH", OPTION_LONG("tpm2-signature", "PATH",
"Validate public key enrollment works with JSON signature file"): "Validate public key enrollment works with JSON signature file"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_tpm2_signature); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_tpm2_signature);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("tpm2-pcrlock", "PATH", OPTION_LONG("tpm2-pcrlock", "PATH",
"Specify pcrlock policy to lock against"): "Specify pcrlock policy to lock against"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_tpm2_pcrlock); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_tpm2_pcrlock);
if (r < 0) if (r < 0)
return r; return r;
auto_pcrlock = false; auto_pcrlock = false;
@@ -574,13 +573,13 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("tpm2-with-pin", "BOOL", OPTION_LONG("tpm2-with-pin", "BOOL",
"Whether to require entering a PIN to unlock the volume"): "Whether to require entering a PIN to unlock the volume"):
r = parse_boolean_argument("--tpm2-with-pin=", arg, &arg_tpm2_pin); r = parse_boolean_argument("--tpm2-with-pin=", opts.arg, &arg_tpm2_pin);
if (r < 0) if (r < 0)
return r; return r;
break; break;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (strv_length(args) > 1) if (strv_length(args) > 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+3 -4
View File
@@ -2505,10 +2505,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -2518,7 +2517,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return version(); return version();
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+5 -6
View File
@@ -517,11 +517,10 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -535,7 +534,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION('t', "type", "TYPE...", "Only display a selected set of override types"): OPTION('t', "type", "TYPE...", "Only display a selected set of override types"):
r = parse_flags(arg, arg_flags); r = parse_flags(opts.arg, arg_flags);
if (r < 0) if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Failed to parse flags field."); "Failed to parse flags field.");
@@ -544,14 +543,14 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "diff", "yes|no", OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "diff", "yes|no",
"Show a diff when overridden files differ"): "Show a diff when overridden files differ"):
r = parse_boolean_argument("--diff", arg, NULL); r = parse_boolean_argument("--diff", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
arg_diff = r; arg_diff = r;
break; break;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+3 -4
View File
@@ -53,10 +53,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
@@ -95,7 +94,7 @@ static int parse_argv(int argc, char *argv[]) {
return DUMP_STRING_TABLE(confidential_virtualization, ConfidentialVirtualization, _CONFIDENTIAL_VIRTUALIZATION_MAX); return DUMP_STRING_TABLE(confidential_virtualization, ConfidentialVirtualization, _CONFIDENTIAL_VIRTUALIZATION_MAX);
} }
if (option_parser_get_n_args(&state) > 0) if (option_parser_get_n_args(&opts) > 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"%s takes no arguments.", "%s takes no arguments.",
program_invocation_short_name); program_invocation_short_name);
+33 -35
View File
@@ -230,11 +230,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const Option *current;
const char *arg;
FOREACH_OPTION_FULL(&state, c, &current, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_NO_PAGER: OPTION_COMMON_NO_PAGER:
@@ -260,15 +258,15 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("discard", "MODE", "Choose discard mode (disabled, loop, all, crypto)"): { OPTION_LONG("discard", "MODE", "Choose discard mode (disabled, loop, all, crypto)"): {
DissectImageFlags flags; DissectImageFlags flags;
if (streq(arg, "disabled")) if (streq(opts.arg, "disabled"))
flags = 0; flags = 0;
else if (streq(arg, "loop")) else if (streq(opts.arg, "loop"))
flags = DISSECT_IMAGE_DISCARD_ON_LOOP; flags = DISSECT_IMAGE_DISCARD_ON_LOOP;
else if (streq(arg, "all")) else if (streq(opts.arg, "all"))
flags = DISSECT_IMAGE_DISCARD_ON_LOOP | DISSECT_IMAGE_DISCARD; flags = DISSECT_IMAGE_DISCARD_ON_LOOP | DISSECT_IMAGE_DISCARD;
else if (streq(arg, "crypt")) else if (streq(opts.arg, "crypt"))
flags = DISSECT_IMAGE_DISCARD_ANY; flags = DISSECT_IMAGE_DISCARD_ANY;
else if (streq(arg, "list")) { else if (streq(opts.arg, "list")) {
puts("disabled\n" puts("disabled\n"
"all\n" "all\n"
"crypt\n" "crypt\n"
@@ -276,7 +274,7 @@ static int parse_argv(int argc, char *argv[]) {
return 0; return 0;
} else } else
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Unknown --discard= parameter: %s", arg); "Unknown --discard= parameter: %s", opts.arg);
arg_flags = (arg_flags & ~DISSECT_IMAGE_DISCARD_ANY) | flags; arg_flags = (arg_flags & ~DISSECT_IMAGE_DISCARD_ANY) | flags;
break; break;
@@ -290,18 +288,18 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("usr-hash", "HASH", "Same, but for the usr partition"): { OPTION_LONG("usr-hash", "HASH", "Same, but for the usr partition"): {
_cleanup_(iovec_done) struct iovec roothash = {}; _cleanup_(iovec_done) struct iovec roothash = {};
PartitionDesignator d = streq(current->long_code, "root-hash") ? PARTITION_ROOT : PARTITION_USR; PartitionDesignator d = streq(opts.opt->long_code, "root-hash") ? PARTITION_ROOT : PARTITION_USR;
if (arg_verity_settings.designator >= 0 && if (arg_verity_settings.designator >= 0 &&
arg_verity_settings.designator != d) arg_verity_settings.designator != d)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Cannot combine --root-hash=/--root-hash-sig= and --usr-hash=/--usr-hash-sig= options."); "Cannot combine --root-hash=/--root-hash-sig= and --usr-hash=/--usr-hash-sig= options.");
r = unhexmem(arg, &roothash.iov_base, &roothash.iov_len); r = unhexmem(opts.arg, &roothash.iov_base, &roothash.iov_len);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse root hash '%s': %m", arg); return log_error_errno(r, "Failed to parse root hash '%s': %m", opts.arg);
if (roothash.iov_len < sizeof(sd_id128_t)) if (roothash.iov_len < sizeof(sd_id128_t))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Root hash must be at least 128-bit long: %s", arg); "Root hash must be at least 128-bit long: %s", opts.arg);
iovec_done(&arg_verity_settings.root_hash); iovec_done(&arg_verity_settings.root_hash);
arg_verity_settings.root_hash = TAKE_STRUCT(roothash); arg_verity_settings.root_hash = TAKE_STRUCT(roothash);
@@ -317,20 +315,20 @@ static int parse_argv(int argc, char *argv[]) {
const char *value; const char *value;
_cleanup_(iovec_done) struct iovec sig = {}; _cleanup_(iovec_done) struct iovec sig = {};
PartitionDesignator d = streq(current->long_code, "root-hash-sig") ? PARTITION_ROOT : PARTITION_USR; PartitionDesignator d = streq(opts.opt->long_code, "root-hash-sig") ? PARTITION_ROOT : PARTITION_USR;
if (arg_verity_settings.designator >= 0 && if (arg_verity_settings.designator >= 0 &&
arg_verity_settings.designator != d) arg_verity_settings.designator != d)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Cannot combine --root-hash=/--root-hash-sig= and --usr-hash=/--usr-hash-sig= options."); "Cannot combine --root-hash=/--root-hash-sig= and --usr-hash=/--usr-hash-sig= options.");
if ((value = startswith(arg, "base64:"))) { if ((value = startswith(opts.arg, "base64:"))) {
r = unbase64mem(value, &sig.iov_base, &sig.iov_len); r = unbase64mem(value, &sig.iov_base, &sig.iov_len);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse root hash signature '%s': %m", arg); return log_error_errno(r, "Failed to parse root hash signature '%s': %m", opts.arg);
} else { } else {
r = read_full_file(arg, (char**) &sig.iov_base, &sig.iov_len); r = read_full_file(opts.arg, (char**) &sig.iov_base, &sig.iov_len);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to read root hash signature file '%s': %m", arg); return log_error_errno(r, "Failed to read root hash signature file '%s': %m", opts.arg);
} }
iovec_done(&arg_verity_settings.root_hash_sig); iovec_done(&arg_verity_settings.root_hash_sig);
@@ -341,44 +339,44 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("verity-data", "PATH", OPTION_LONG("verity-data", "PATH",
"Specify data file with hash tree for verity if it is not embedded in IMAGE"): "Specify data file with hash tree for verity if it is not embedded in IMAGE"):
r = parse_path_argument(arg, false, &arg_verity_settings.data_path); r = parse_path_argument(opts.arg, false, &arg_verity_settings.data_path);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("fsck", "BOOL", "Run fsck before mounting"): OPTION_LONG("fsck", "BOOL", "Run fsck before mounting"):
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --fsck= parameter: %s", arg); return log_error_errno(r, "Failed to parse --fsck= parameter: %s", opts.arg);
SET_FLAG(arg_flags, DISSECT_IMAGE_FSCK, r); SET_FLAG(arg_flags, DISSECT_IMAGE_FSCK, r);
break; break;
OPTION_LONG("growfs", "BOOL", "Grow file system to partition size, if marked"): OPTION_LONG("growfs", "BOOL", "Grow file system to partition size, if marked"):
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --growfs= parameter: %s", arg); return log_error_errno(r, "Failed to parse --growfs= parameter: %s", opts.arg);
SET_FLAG(arg_flags, DISSECT_IMAGE_GROWFS, r); SET_FLAG(arg_flags, DISSECT_IMAGE_GROWFS, r);
break; break;
OPTION_COMMON_JSON: OPTION_COMMON_JSON:
r = parse_json_argument(arg, &arg_json_format_flags); r = parse_json_argument(opts.arg, &arg_json_format_flags);
if (r <= 0) if (r <= 0)
return r; return r;
break; break;
OPTION_LONG("loop-ref", "NAME", "Set reference string for loopback device"): OPTION_LONG("loop-ref", "NAME", "Set reference string for loopback device"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_loop_ref = mfree(arg_loop_ref); arg_loop_ref = mfree(arg_loop_ref);
arg_loop_ref_auto = false; arg_loop_ref_auto = false;
break; break;
} }
if (strlen(arg) >= sizeof_field(struct loop_info64, lo_file_name)) if (strlen(opts.arg) >= sizeof_field(struct loop_info64, lo_file_name))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Loop device ref string '%s' is too long.", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Loop device ref string '%s' is too long.", opts.arg);
r = free_and_strdup_warn(&arg_loop_ref, arg); r = free_and_strdup_warn(&arg_loop_ref, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
@@ -391,13 +389,13 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("image-policy", "POLICY", "Specify image dissection policy"): OPTION_LONG("image-policy", "POLICY", "Specify image dissection policy"):
r = parse_image_policy_argument(arg, &arg_image_policy); r = parse_image_policy_argument(opts.arg, &arg_image_policy);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("mtree-hash", "BOOL", "Whether to include SHA256 hash in the mtree output"): OPTION_LONG("mtree-hash", "BOOL", "Whether to include SHA256 hash in the mtree output"):
r = parse_boolean_argument("--mtree-hash=", arg, &arg_mtree_hash); r = parse_boolean_argument("--mtree-hash=", opts.arg, &arg_mtree_hash);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -420,9 +418,9 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("image-filter", "FILTER", "Specify image dissection filter"): { OPTION_LONG("image-filter", "FILTER", "Specify image dissection filter"): {
_cleanup_(image_filter_freep) ImageFilter *f = NULL; _cleanup_(image_filter_freep) ImageFilter *f = NULL;
r = image_filter_parse(arg, &f); r = image_filter_parse(opts.arg, &f);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse image filter expression: %s", arg); return log_error_errno(r, "Failed to parse image filter expression: %s", opts.arg);
image_filter_free(arg_image_filter); image_filter_free(arg_image_filter);
arg_image_filter = TAKE_PTR(f); arg_image_filter = TAKE_PTR(f);
@@ -430,7 +428,7 @@ static int parse_argv(int argc, char *argv[]) {
} }
OPTION_LONG("copy-ownership", "BOOL", "Whether to copy ownership when copying files"): OPTION_LONG("copy-ownership", "BOOL", "Whether to copy ownership when copying files"):
r = parse_tristate_argument_with_auto("--copy-ownership=", arg, &arg_copy_ownership); r = parse_tristate_argument_with_auto("--copy-ownership=", opts.arg, &arg_copy_ownership);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -518,7 +516,7 @@ static int parse_argv(int argc, char *argv[]) {
arg_runtime_scope = system_scope_requested && user_scope_requested ? _RUNTIME_SCOPE_INVALID : arg_runtime_scope = system_scope_requested && user_scope_requested ? _RUNTIME_SCOPE_INVALID :
system_scope_requested ? RUNTIME_SCOPE_SYSTEM : RUNTIME_SCOPE_USER; system_scope_requested ? RUNTIME_SCOPE_SYSTEM : RUNTIME_SCOPE_USER;
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
switch (arg_action) { switch (arg_action) {
+10 -11
View File
@@ -56,10 +56,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -69,20 +68,20 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return version(); return version();
OPTION_LONG("suffix", "SUFFIX", "Unit suffix to append to escaped strings"): { OPTION_LONG("suffix", "SUFFIX", "Unit suffix to append to escaped strings"): {
UnitType t = unit_type_from_string(arg); UnitType t = unit_type_from_string(opts.arg);
if (t < 0) if (t < 0)
return log_error_errno(t, "Invalid unit suffix type \"%s\".", arg); return log_error_errno(t, "Invalid unit suffix type \"%s\".", opts.arg);
arg_suffix = arg; arg_suffix = opts.arg;
break; break;
} }
OPTION_LONG("template", "TEMPLATE", "Insert strings as instance into template"): OPTION_LONG("template", "TEMPLATE", "Insert strings as instance into template"):
if (!unit_name_is_valid(arg, UNIT_NAME_TEMPLATE)) if (!unit_name_is_valid(opts.arg, UNIT_NAME_TEMPLATE))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Template name %s is not valid.", arg); "Template name %s is not valid.", opts.arg);
arg_template = arg; arg_template = opts.arg;
break; break;
OPTION_LONG("instance", NULL, "With --unescape, show just the instance part"): OPTION_LONG("instance", NULL, "With --unescape, show just the instance part"):
@@ -103,7 +102,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
} }
if (option_parser_get_n_args(&state) == 0) if (option_parser_get_n_args(&opts) == 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Not enough arguments."); "Not enough arguments.");
@@ -131,7 +130,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"--instance may not be combined with --template."); "--instance may not be combined with --template.");
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+3 -4
View File
@@ -70,10 +70,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
@@ -96,7 +95,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
if (r > 0) if (r > 0)
arg_varlink = true; arg_varlink = true;
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+27 -28
View File
@@ -1267,11 +1267,10 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -1281,61 +1280,61 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
OPTION_LONG("root", "PATH", "Operate on an alternate filesystem root"): OPTION_LONG("root", "PATH", "Operate on an alternate filesystem root"):
r = parse_path_argument(arg, true, &arg_root); r = parse_path_argument(opts.arg, true, &arg_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("image", "PATH", "Operate on disk image as filesystem root"): OPTION_LONG("image", "PATH", "Operate on disk image as filesystem root"):
r = parse_path_argument(arg, false, &arg_image); r = parse_path_argument(opts.arg, false, &arg_image);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("image-policy", "POLICY", "Specify disk image dissection policy"): OPTION_LONG("image-policy", "POLICY", "Specify disk image dissection policy"):
r = parse_image_policy_argument(arg, &arg_image_policy); r = parse_image_policy_argument(opts.arg, &arg_image_policy);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("locale", "LOCALE", "Set primary locale (LANG=)"): OPTION_LONG("locale", "LOCALE", "Set primary locale (LANG=)"):
r = free_and_strdup_warn(&arg_locale, arg); r = free_and_strdup_warn(&arg_locale, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("locale-messages", "LOCALE", "Set message locale (LC_MESSAGES=)"): OPTION_LONG("locale-messages", "LOCALE", "Set message locale (LC_MESSAGES=)"):
r = free_and_strdup_warn(&arg_locale_messages, arg); r = free_and_strdup_warn(&arg_locale_messages, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("keymap", "KEYMAP", "Set keymap"): OPTION_LONG("keymap", "KEYMAP", "Set keymap"):
if (!keymap_is_valid(arg)) if (!keymap_is_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Keymap %s is not valid.", arg); "Keymap %s is not valid.", opts.arg);
r = free_and_strdup_warn(&arg_keymap, arg); r = free_and_strdup_warn(&arg_keymap, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("timezone", "TIMEZONE", "Set timezone"): OPTION_LONG("timezone", "TIMEZONE", "Set timezone"):
if (!timezone_is_valid(arg, LOG_ERR)) if (!timezone_is_valid(opts.arg, LOG_ERR))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Timezone %s is not valid.", arg); "Timezone %s is not valid.", opts.arg);
r = free_and_strdup_warn(&arg_timezone, arg); r = free_and_strdup_warn(&arg_timezone, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("hostname", "NAME", "Set hostname"): OPTION_LONG("hostname", "NAME", "Set hostname"):
if (!hostname_is_valid(arg, VALID_HOSTNAME_TRAILING_DOT|VALID_HOSTNAME_QUESTION_MARK)) if (!hostname_is_valid(opts.arg, VALID_HOSTNAME_TRAILING_DOT|VALID_HOSTNAME_QUESTION_MARK))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Host name %s is not valid.", arg); "Host name %s is not valid.", opts.arg);
r = free_and_strdup_warn(&arg_hostname, arg); r = free_and_strdup_warn(&arg_hostname, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
@@ -1349,13 +1348,13 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("machine-id", "ID", "Set specified machine ID"): OPTION_LONG("machine-id", "ID", "Set specified machine ID"):
r = sd_id128_from_string(arg, &arg_machine_id); r = sd_id128_from_string(opts.arg, &arg_machine_id);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse machine id %s.", arg); return log_error_errno(r, "Failed to parse machine id %s.", opts.arg);
break; break;
OPTION_LONG("root-password", "PASSWORD", "Set root password from plaintext password"): OPTION_LONG("root-password", "PASSWORD", "Set root password from plaintext password"):
r = free_and_strdup_warn(&arg_root_password, arg); r = free_and_strdup_warn(&arg_root_password, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
@@ -1365,15 +1364,15 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("root-password-file", "FILE", "Set root password from file"): OPTION_LONG("root-password-file", "FILE", "Set root password from file"):
arg_root_password = mfree(arg_root_password); arg_root_password = mfree(arg_root_password);
r = read_one_line_file(arg, &arg_root_password); r = read_one_line_file(opts.arg, &arg_root_password);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to read %s: %m", arg); return log_error_errno(r, "Failed to read %s: %m", opts.arg);
arg_root_password_is_hashed = false; arg_root_password_is_hashed = false;
break; break;
OPTION_LONG("root-password-hashed", "HASH", "Set root password from hashed password"): OPTION_LONG("root-password-hashed", "HASH", "Set root password from hashed password"):
r = free_and_strdup_warn(&arg_root_password, arg); r = free_and_strdup_warn(&arg_root_password, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
@@ -1381,13 +1380,13 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("root-shell", "SHELL", "Set root shell"): OPTION_LONG("root-shell", "SHELL", "Set root shell"):
r = free_and_strdup_warn(&arg_root_shell, arg); r = free_and_strdup_warn(&arg_root_shell, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("kernel-command-line", "CMDLINE", "Set kernel command line"): OPTION_LONG("kernel-command-line", "CMDLINE", "Set kernel command line"):
r = free_and_strdup_warn(&arg_kernel_cmdline, arg); r = free_and_strdup_warn(&arg_kernel_cmdline, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -1462,21 +1461,21 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("welcome", "BOOL", "Whether to show the welcome text"): OPTION_LONG("welcome", "BOOL", "Whether to show the welcome text"):
r = parse_boolean_argument("--welcome=", arg, &arg_welcome); r = parse_boolean_argument("--welcome=", opts.arg, &arg_welcome);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("chrome", "BOOL", OPTION_LONG("chrome", "BOOL",
"Whether to show a color bar at top and bottom of terminal"): "Whether to show a color bar at top and bottom of terminal"):
r = parse_boolean_argument("--chrome=", arg, &arg_chrome); r = parse_boolean_argument("--chrome=", opts.arg, &arg_chrome);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("mute-console", "BOOL", OPTION_LONG("mute-console", "BOOL",
"Whether to disallow kernel/PID 1 writes to the console while running"): "Whether to disallow kernel/PID 1 writes to the console while running"):
r = parse_boolean_argument("--mute-console=", arg, &arg_mute_console); r = parse_boolean_argument("--mute-console=", opts.arg, &arg_mute_console);
if (r < 0) if (r < 0)
return r; return r;
break; break;
+4 -5
View File
@@ -160,10 +160,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -177,12 +176,12 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
} }
if (option_parser_get_n_args(&state) != 1) if (option_parser_get_n_args(&opts) != 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"%s expects exactly one argument (the mount point).", "%s expects exactly one argument (the mount point).",
program_invocation_short_name); program_invocation_short_name);
arg_target = option_parser_get_args(&state)[0]; arg_target = option_parser_get_args(&opts)[0];
return 1; return 1;
} }
+4 -5
View File
@@ -55,10 +55,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -73,11 +72,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
} }
if (option_parser_get_n_args(&state) > 0 && arg_clear) if (option_parser_get_n_args(&opts) > 0 && arg_clear)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Extraneous arguments specified with --clear, refusing."); "Extraneous arguments specified with --clear, refusing.");
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+6 -7
View File
@@ -765,10 +765,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
@@ -782,11 +781,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_COMMON_HOST: OPTION_COMMON_HOST:
arg_transport = BUS_TRANSPORT_REMOTE; arg_transport = BUS_TRANSPORT_REMOTE;
arg_host = arg; arg_host = opts.arg;
break; break;
OPTION_COMMON_MACHINE: OPTION_COMMON_MACHINE:
r = parse_machine_argument(arg, &arg_host, &arg_transport); r = parse_machine_argument(opts.arg, &arg_host, &arg_transport);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -804,7 +803,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_COMMON_JSON: OPTION_COMMON_JSON:
r = parse_json_argument(arg, &arg_json_format_flags); r = parse_json_argument(opts.arg, &arg_json_format_flags);
if (r <= 0) if (r <= 0)
return r; return r;
break; break;
@@ -814,7 +813,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+4 -5
View File
@@ -81,10 +81,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -99,7 +98,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION('r', "root", "PATH", "Alternative root path in the filesystem"): OPTION('r', "root", "PATH", "Alternative root path in the filesystem"):
arg_root = arg; arg_root = opts.arg;
break; break;
OPTION_LONG("usr", NULL, OPTION_LONG("usr", NULL,
@@ -108,7 +107,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+6 -7
View File
@@ -237,10 +237,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
@@ -258,7 +257,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("json", "FORMAT", OPTION_LONG("json", "FORMAT",
"Output inspection data in JSON (takes one of pretty, short, off)"): "Output inspection data in JSON (takes one of pretty, short, off)"):
r = parse_json_argument(arg, &arg_json_format_flags); r = parse_json_argument(opts.arg, &arg_json_format_flags);
if (r <= 0) if (r <= 0)
return r; return r;
break; break;
@@ -279,11 +278,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION('a', "app-specific", "ID", "Generate app-specific IDs"): OPTION('a', "app-specific", "ID", "Generate app-specific IDs"):
r = id128_from_string_nonzero(arg, &arg_app); r = id128_from_string_nonzero(opts.arg, &arg_app);
if (r == -ENXIO) if (r == -ENXIO)
return log_error_errno(r, "Application ID cannot be all zeros."); return log_error_errno(r, "Application ID cannot be all zeros.");
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse \"%s\" as application ID: %m", arg); return log_error_errno(r, "Failed to parse \"%s\" as application ID: %m", opts.arg);
break; break;
OPTION('u', "uuid", NULL, "Output in UUID format"): OPTION('u', "uuid", NULL, "Output in UUID format"):
@@ -291,7 +290,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+12 -13
View File
@@ -82,10 +82,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -98,32 +97,32 @@ static int parse_argv(int argc, char *argv[]) {
"Select well-known key/base, one of:" "Select well-known key/base, one of:"
" hostname, region, zone, ipv4-public, ipv6-public, ssh-key," " hostname, region, zone, ipv4-public, ipv6-public, ssh-key,"
" userdata, userdata-base, userdata-base64"): { " userdata, userdata-base, userdata-base64"): {
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_well_known = _IMDS_WELL_KNOWN_INVALID; arg_well_known = _IMDS_WELL_KNOWN_INVALID;
break; break;
} }
if (streq(arg, "help")) if (streq(opts.arg, "help"))
return DUMP_STRING_TABLE(imds_well_known, ImdsWellKnown, _IMDS_WELL_KNOWN_MAX); return DUMP_STRING_TABLE(imds_well_known, ImdsWellKnown, _IMDS_WELL_KNOWN_MAX);
ImdsWellKnown wk = imds_well_known_from_string(arg); ImdsWellKnown wk = imds_well_known_from_string(opts.arg);
if (wk < 0) if (wk < 0)
return log_error_errno(wk, "Failed to parse --well-known= argument: %s", arg); return log_error_errno(wk, "Failed to parse --well-known= argument: %s", opts.arg);
arg_well_known = wk; arg_well_known = wk;
break; break;
} }
OPTION_LONG("refresh", "SEC", "Set minimum freshness time for returned data"): { OPTION_LONG("refresh", "SEC", "Set minimum freshness time for returned data"): {
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_refresh_usec_set = false; arg_refresh_usec_set = false;
break; break;
} }
usec_t t; usec_t t;
r = parse_sec(arg, &t); r = parse_sec(opts.arg, &t);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse refresh timeout: %s", arg); return log_error_errno(r, "Failed to parse refresh timeout: %s", opts.arg);
arg_refresh_usec = t; arg_refresh_usec = t;
arg_refresh_usec_set = true; arg_refresh_usec_set = true;
@@ -131,7 +130,7 @@ static int parse_argv(int argc, char *argv[]) {
} }
OPTION_LONG("cache", "BOOL", "Control cache use"): OPTION_LONG("cache", "BOOL", "Control cache use"):
r = parse_tristate_argument_with_auto("--cache=", arg, &arg_cache); r = parse_tristate_argument_with_auto("--cache=", opts.arg, &arg_cache);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -147,8 +146,8 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
size_t n_args = option_parser_get_n_args(&state); size_t n_args = option_parser_get_n_args(&opts);
if (IN_SET(arg_action, ACTION_USERDATA, ACTION_IMPORT)) { if (IN_SET(arg_action, ACTION_USERDATA, ACTION_IMPORT)) {
if (n_args != 0) if (n_args != 0)
+54 -55
View File
@@ -2249,10 +2249,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -2262,30 +2261,30 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
OPTION('i', "interface", "INTERFACE", "Use the specified interface"): OPTION('i', "interface", "INTERFACE", "Use the specified interface"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_ifname = mfree(arg_ifname); arg_ifname = mfree(arg_ifname);
break; break;
} }
if (!ifname_valid_full(arg, IFNAME_VALID_ALTERNATIVE|IFNAME_VALID_NUMERIC)) if (!ifname_valid_full(opts.arg, IFNAME_VALID_ALTERNATIVE|IFNAME_VALID_NUMERIC))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Interface name '%s' is not valid.", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Interface name '%s' is not valid.", opts.arg);
r = free_and_strdup_warn(&arg_ifname, arg); r = free_and_strdup_warn(&arg_ifname, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("refresh", "SEC", "Set token refresh time"): { OPTION_LONG("refresh", "SEC", "Set token refresh time"): {
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_refresh_usec = REFRESH_USEC_DEFAULT; arg_refresh_usec = REFRESH_USEC_DEFAULT;
break; break;
} }
usec_t t; usec_t t;
r = parse_sec(arg, &t); r = parse_sec(opts.arg, &t);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse refresh timeout: %s", arg); return log_error_errno(r, "Failed to parse refresh timeout: %s", opts.arg);
if (t < REFRESH_USEC_MIN) { if (t < REFRESH_USEC_MIN) {
log_warning("Increasing specified refresh time to %s, lower values are not supported.", FORMAT_TIMESPAN(REFRESH_USEC_MIN, 0)); log_warning("Increasing specified refresh time to %s, lower values are not supported.", FORMAT_TIMESPAN(REFRESH_USEC_MIN, 0));
arg_refresh_usec = REFRESH_USEC_MIN; arg_refresh_usec = REFRESH_USEC_MIN;
@@ -2295,32 +2294,32 @@ static int parse_argv(int argc, char *argv[]) {
} }
OPTION_LONG("fwmark", "INTEGER", "Choose firewall mark for HTTP traffic"): OPTION_LONG("fwmark", "INTEGER", "Choose firewall mark for HTTP traffic"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_fwmark_set = false; arg_fwmark_set = false;
break; break;
} }
if (streq(arg, "default")) { if (streq(opts.arg, "default")) {
arg_fwmark = FWMARK_DEFAULT; arg_fwmark = FWMARK_DEFAULT;
arg_fwmark_set = true; arg_fwmark_set = true;
break; break;
} }
r = safe_atou32(arg, &arg_fwmark); r = safe_atou32(opts.arg, &arg_fwmark);
if (r < 0) if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to parse --fwmark= parameter: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to parse --fwmark= parameter: %s", opts.arg);
arg_fwmark_set = true; arg_fwmark_set = true;
break; break;
OPTION_LONG("cache", "BOOL", "Enable/disable cache use"): OPTION_LONG("cache", "BOOL", "Enable/disable cache use"):
r = parse_boolean_argument("--cache", arg, &arg_cache); r = parse_boolean_argument("--cache", opts.arg, &arg_cache);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("wait", "BOOL", "Whether to wait for connectivity"): OPTION_LONG("wait", "BOOL", "Whether to wait for connectivity"):
r = parse_boolean_argument("--wait", arg, &arg_wait); r = parse_boolean_argument("--wait", opts.arg, &arg_wait);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -2330,12 +2329,12 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION('K', "well-known", "KEY", "Select well-known key"): { OPTION('K', "well-known", "KEY", "Select well-known key"): {
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_well_known = _IMDS_WELL_KNOWN_INVALID; arg_well_known = _IMDS_WELL_KNOWN_INVALID;
break; break;
} }
ImdsWellKnown wk = imds_well_known_from_string(arg); ImdsWellKnown wk = imds_well_known_from_string(opts.arg);
if (wk < 0) if (wk < 0)
return log_error_errno(wk, "Failed to parse --well-known= parameter: %m"); return log_error_errno(wk, "Failed to parse --well-known= parameter: %m");
@@ -2351,139 +2350,139 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_GROUP("Manual Endpoint Configuration"): {} OPTION_GROUP("Manual Endpoint Configuration"): {}
OPTION_LONG("vendor", "VENDOR", "Specify IMDS vendor literally"): OPTION_LONG("vendor", "VENDOR", "Specify IMDS vendor literally"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_vendor = mfree(arg_vendor); arg_vendor = mfree(arg_vendor);
break; break;
} }
r = free_and_strdup_warn(&arg_vendor, arg); r = free_and_strdup_warn(&arg_vendor, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("token-url", "URL", "URL for acquiring token"): OPTION_LONG("token-url", "URL", "URL for acquiring token"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_token_url = mfree(arg_token_url); arg_token_url = mfree(arg_token_url);
break; break;
} }
if (!http_url_is_valid(arg)) if (!http_url_is_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid URL: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid URL: %s", opts.arg);
r = free_and_strdup_warn(&arg_token_url, arg); r = free_and_strdup_warn(&arg_token_url, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("refresh-header-name", "NAME", "Header name for passing refresh time"): OPTION_LONG("refresh-header-name", "NAME", "Header name for passing refresh time"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_refresh_header_name = mfree(arg_refresh_header_name); arg_refresh_header_name = mfree(arg_refresh_header_name);
break; break;
} }
if (!http_header_name_valid(arg)) if (!http_header_name_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid HTTP header name: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid HTTP header name: %s", opts.arg);
r = free_and_strdup_warn(&arg_refresh_header_name, arg); r = free_and_strdup_warn(&arg_refresh_header_name, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("data-url", "URL", "Base URL for acquiring data"): OPTION_LONG("data-url", "URL", "Base URL for acquiring data"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_data_url = mfree(arg_data_url); arg_data_url = mfree(arg_data_url);
break; break;
} }
if (!http_url_is_valid(arg)) if (!http_url_is_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid URL: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid URL: %s", opts.arg);
r = free_and_strdup_warn(&arg_data_url, arg); r = free_and_strdup_warn(&arg_data_url, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("data-url-suffix", "STRING", "Suffix to append to data URL"): OPTION_LONG("data-url-suffix", "STRING", "Suffix to append to data URL"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_data_url_suffix = mfree(arg_data_url_suffix); arg_data_url_suffix = mfree(arg_data_url_suffix);
break; break;
} }
if (!ascii_is_valid(arg) || string_has_cc(arg, /* ok= */ NULL)) if (!ascii_is_valid(opts.arg) || string_has_cc(opts.arg, /* ok= */ NULL))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid URL suffix: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid URL suffix: %s", opts.arg);
r = free_and_strdup_warn(&arg_data_url_suffix, arg); r = free_and_strdup_warn(&arg_data_url_suffix, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("token-header-name", "NAME", "Header name for passing token string"): OPTION_LONG("token-header-name", "NAME", "Header name for passing token string"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_token_header_name = mfree(arg_token_header_name); arg_token_header_name = mfree(arg_token_header_name);
break; break;
} }
if (!http_header_name_valid(arg)) if (!http_header_name_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid HTTP header name: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid HTTP header name: %s", opts.arg);
r = free_and_strdup_warn(&arg_token_header_name, arg); r = free_and_strdup_warn(&arg_token_header_name, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("extra-header", "NAME: VALUE", "Additional header to pass to data transfer"): OPTION_LONG("extra-header", "NAME: VALUE", "Additional header to pass to data transfer"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_extra_header = strv_free(arg_extra_header); arg_extra_header = strv_free(arg_extra_header);
break; break;
} }
if (!http_header_valid(arg)) if (!http_header_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid HTTP header: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid HTTP header: %s", opts.arg);
if (strv_extend(&arg_extra_header, arg) < 0) if (strv_extend(&arg_extra_header, opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
OPTION_LONG("address-ipv4", "ADDRESS", "Configure IPv4 address of the IMDS server"): { OPTION_LONG("address-ipv4", "ADDRESS", "Configure IPv4 address of the IMDS server"): {
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_address_ipv4 = (struct in_addr) {}; arg_address_ipv4 = (struct in_addr) {};
break; break;
} }
union in_addr_union u; union in_addr_union u;
r = in_addr_from_string(AF_INET, arg, &u); r = in_addr_from_string(AF_INET, opts.arg, &u);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse IPv4 address: %s", arg); return log_error_errno(r, "Failed to parse IPv4 address: %s", opts.arg);
arg_address_ipv4 = u.in; arg_address_ipv4 = u.in;
break; break;
} }
OPTION_LONG("address-ipv6", "ADDRESS", "Configure IPv6 address of the IMDS server"): { OPTION_LONG("address-ipv6", "ADDRESS", "Configure IPv6 address of the IMDS server"): {
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_address_ipv6 = (struct in6_addr) {}; arg_address_ipv6 = (struct in6_addr) {};
break; break;
} }
union in_addr_union u; union in_addr_union u;
r = in_addr_from_string(AF_INET6, arg, &u); r = in_addr_from_string(AF_INET6, opts.arg, &u);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse IPv6 address: %s", arg); return log_error_errno(r, "Failed to parse IPv6 address: %s", opts.arg);
arg_address_ipv6 = u.in6; arg_address_ipv6 = u.in6;
break; break;
} }
OPTION_LONG("well-known-key", "NAME:KEY", "Configure the location of well-known keys"): { OPTION_LONG("well-known-key", "NAME:KEY", "Configure the location of well-known keys"): {
if (isempty(arg)) { if (isempty(opts.arg)) {
for (ImdsWellKnown wk = 0; wk < _IMDS_WELL_KNOWN_MAX; wk++) for (ImdsWellKnown wk = 0; wk < _IMDS_WELL_KNOWN_MAX; wk++)
arg_well_known_key[wk] = mfree(arg_well_known_key[wk]); arg_well_known_key[wk] = mfree(arg_well_known_key[wk]);
break; break;
} }
const char *e = strchr(arg, ':'); const char *e = strchr(opts.arg, ':');
if (!e) if (!e)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--well-known-key= expects colon separated name and key pairs."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--well-known-key= expects colon separated name and key pairs.");
_cleanup_free_ char *name = strndup(arg, e - arg); _cleanup_free_ char *name = strndup(opts.arg, e - opts.arg);
if (!name) if (!name)
return log_oom(); return log_oom();
@@ -2512,8 +2511,8 @@ static int parse_argv(int argc, char *argv[]) {
arg_varlink = r; arg_varlink = r;
if (!arg_varlink) { if (!arg_varlink) {
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
size_t n_args = option_parser_get_n_args(&state); size_t n_args = option_parser_get_n_args(&opts);
if (arg_setup_network) { if (arg_setup_network) {
if (n_args != 0) if (n_args != 0)
+7 -8
View File
@@ -238,10 +238,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -251,17 +250,17 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return version(); return version();
OPTION_LONG("format", "FORMAT", "Select format"): OPTION_LONG("format", "FORMAT", "Select format"):
arg_compress = compression_from_string_harder(arg); arg_compress = compression_from_string_harder(opts.arg);
if (arg_compress < 0) if (arg_compress < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Unknown format: %s", arg); "Unknown format: %s", opts.arg);
break; break;
OPTION_LONG("class", "CLASS", OPTION_LONG("class", "CLASS",
"Select image class (machine, sysext, confext, portable)"): "Select image class (machine, sysext, confext, portable)"):
arg_class = image_class_from_string(arg); arg_class = image_class_from_string(opts.arg);
if (arg_class < 0) if (arg_class < 0)
return log_error_errno(arg_class, "Failed to parse --class= argument: %s", arg); return log_error_errno(arg_class, "Failed to parse --class= argument: %s", opts.arg);
break; break;
OPTION_LONG("system", NULL, "Operate in per-system mode"): OPTION_LONG("system", NULL, "Operate in per-system mode"):
@@ -276,7 +275,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
if (arg_runtime_scope == RUNTIME_SCOPE_USER) if (arg_runtime_scope == RUNTIME_SCOPE_USER)
arg_import_flags |= IMPORT_FOREIGN_UID; arg_import_flags |= IMPORT_FOREIGN_UID;
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+9 -10
View File
@@ -313,11 +313,10 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -331,7 +330,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("image-root", "PATH", "Image root directory"): OPTION_LONG("image-root", "PATH", "Image root directory"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_image_root); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_image_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -346,29 +345,29 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("btrfs-subvol", "BOOL", OPTION_LONG("btrfs-subvol", "BOOL",
"Controls whether to create a btrfs subvolume instead of a directory"): "Controls whether to create a btrfs subvolume instead of a directory"):
r = parse_boolean_argument("--btrfs-subvol=", arg, &arg_btrfs_subvol); r = parse_boolean_argument("--btrfs-subvol=", opts.arg, &arg_btrfs_subvol);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("btrfs-quota", "BOOL", OPTION_LONG("btrfs-quota", "BOOL",
"Controls whether to set up quota for btrfs subvolume"): "Controls whether to set up quota for btrfs subvolume"):
r = parse_boolean_argument("--btrfs-quota=", arg, &arg_btrfs_quota); r = parse_boolean_argument("--btrfs-quota=", opts.arg, &arg_btrfs_quota);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("sync", "BOOL", "Controls whether to sync() before completing"): OPTION_LONG("sync", "BOOL", "Controls whether to sync() before completing"):
r = parse_boolean_argument("--sync=", arg, &arg_sync); r = parse_boolean_argument("--sync=", opts.arg, &arg_sync);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("class", "CLASS", OPTION_LONG("class", "CLASS",
"Select image class (machine, sysext, confext, portable)"): "Select image class (machine, sysext, confext, portable)"):
arg_class = image_class_from_string(arg); arg_class = image_class_from_string(opts.arg);
if (arg_class < 0) if (arg_class < 0)
return log_error_errno(arg_class, "Failed to parse --class= argument: %s", arg); return log_error_errno(arg_class, "Failed to parse --class= argument: %s", opts.arg);
break; break;
OPTION_LONG("system", NULL, "Operate in per-system mode"): OPTION_LONG("system", NULL, "Operate in per-system mode"):
@@ -386,7 +385,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return log_error_errno(r, "Failed to pick image root: %m"); return log_error_errno(r, "Failed to pick image root: %m");
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+16 -17
View File
@@ -317,10 +317,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -334,7 +333,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("image-root", "PATH", "Image root directory"): OPTION_LONG("image-root", "PATH", "Image root directory"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_image_root); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_image_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -349,7 +348,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("btrfs-subvol", "BOOL", OPTION_LONG("btrfs-subvol", "BOOL",
"Controls whether to create a btrfs subvolume instead of a directory"): "Controls whether to create a btrfs subvolume instead of a directory"):
r = parse_boolean_argument("--btrfs-subvol=", arg, NULL); r = parse_boolean_argument("--btrfs-subvol=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
SET_FLAG(arg_import_flags, IMPORT_BTRFS_SUBVOL, r); SET_FLAG(arg_import_flags, IMPORT_BTRFS_SUBVOL, r);
@@ -357,7 +356,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("btrfs-quota", "BOOL", OPTION_LONG("btrfs-quota", "BOOL",
"Controls whether to set up quota for btrfs subvolume"): "Controls whether to set up quota for btrfs subvolume"):
r = parse_boolean_argument("--btrfs-quota=", arg, NULL); r = parse_boolean_argument("--btrfs-quota=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
SET_FLAG(arg_import_flags, IMPORT_BTRFS_QUOTA, r); SET_FLAG(arg_import_flags, IMPORT_BTRFS_QUOTA, r);
@@ -365,14 +364,14 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("convert-qcow2", "BOOL", OPTION_LONG("convert-qcow2", "BOOL",
"Controls whether to convert QCOW2 images to regular disk images"): "Controls whether to convert QCOW2 images to regular disk images"):
r = parse_boolean_argument("--convert-qcow2=", arg, NULL); r = parse_boolean_argument("--convert-qcow2=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
SET_FLAG(arg_import_flags, IMPORT_CONVERT_QCOW2, r); SET_FLAG(arg_import_flags, IMPORT_CONVERT_QCOW2, r);
break; break;
OPTION_LONG("sync", "BOOL", "Controls whether to sync() before completing"): OPTION_LONG("sync", "BOOL", "Controls whether to sync() before completing"):
r = parse_boolean_argument("--sync=", arg, NULL); r = parse_boolean_argument("--sync=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
SET_FLAG(arg_import_flags, IMPORT_SYNC, r); SET_FLAG(arg_import_flags, IMPORT_SYNC, r);
@@ -381,11 +380,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("offset", "BYTES", "Offset to seek to in destination"): { OPTION_LONG("offset", "BYTES", "Offset to seek to in destination"): {
uint64_t u; uint64_t u;
r = safe_atou64(arg, &u); r = safe_atou64(opts.arg, &u);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --offset= argument: %s", arg); return log_error_errno(r, "Failed to parse --offset= argument: %s", opts.arg);
if (!FILE_SIZE_VALID(u)) if (!FILE_SIZE_VALID(u))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Argument to --offset= switch too large: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Argument to --offset= switch too large: %s", opts.arg);
arg_offset = u; arg_offset = u;
break; break;
@@ -394,11 +393,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("size-max", "BYTES", "Maximum number of bytes to write to destination"): { OPTION_LONG("size-max", "BYTES", "Maximum number of bytes to write to destination"): {
uint64_t u; uint64_t u;
r = parse_size(arg, 1024, &u); r = parse_size(opts.arg, 1024, &u);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --size-max= argument: %s", arg); return log_error_errno(r, "Failed to parse --size-max= argument: %s", opts.arg);
if (!FILE_SIZE_VALID(u)) if (!FILE_SIZE_VALID(u))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Argument to --size-max= switch too large: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Argument to --size-max= switch too large: %s", opts.arg);
arg_size_max = u; arg_size_max = u;
break; break;
@@ -406,9 +405,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("class", "CLASS", OPTION_LONG("class", "CLASS",
"Select image class (machine, sysext, confext, portable)"): "Select image class (machine, sysext, confext, portable)"):
arg_class = image_class_from_string(arg); arg_class = image_class_from_string(opts.arg);
if (arg_class < 0) if (arg_class < 0)
return log_error_errno(arg_class, "Failed to parse --class= argument: %s", arg); return log_error_errno(arg_class, "Failed to parse --class= argument: %s", opts.arg);
break; break;
OPTION_LONG("system", NULL, "Operate in per-system mode"): OPTION_LONG("system", NULL, "Operate in per-system mode"):
@@ -438,7 +437,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
if (arg_runtime_scope == RUNTIME_SCOPE_USER) if (arg_runtime_scope == RUNTIME_SCOPE_USER)
arg_import_flags |= IMPORT_FOREIGN_UID; arg_import_flags |= IMPORT_FOREIGN_UID;
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+16 -17
View File
@@ -1113,10 +1113,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -1139,11 +1138,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_COMMON_HOST: OPTION_COMMON_HOST:
arg_transport = BUS_TRANSPORT_REMOTE; arg_transport = BUS_TRANSPORT_REMOTE;
arg_host = arg; arg_host = opts.arg;
break; break;
OPTION_COMMON_MACHINE: OPTION_COMMON_MACHINE:
r = parse_machine_argument(arg, &arg_host, &arg_transport); r = parse_machine_argument(opts.arg, &arg_host, &arg_transport);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -1166,7 +1165,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_COMMON_JSON: OPTION_COMMON_JSON:
r = parse_json_argument(arg, &arg_json_format_flags); r = parse_json_argument(opts.arg, &arg_json_format_flags);
if (r <= 0) if (r <= 0)
return r; return r;
arg_legend = false; arg_legend = false;
@@ -1179,21 +1178,21 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("verify", "MODE", OPTION_LONG("verify", "MODE",
"Verification mode for downloaded images (no, checksum, signature)"): "Verification mode for downloaded images (no, checksum, signature)"):
if (streq(arg, "help")) if (streq(opts.arg, "help"))
return DUMP_STRING_TABLE(import_verify, ImportVerify, _IMPORT_VERIFY_MAX); return DUMP_STRING_TABLE(import_verify, ImportVerify, _IMPORT_VERIFY_MAX);
r = import_verify_from_string(arg); r = import_verify_from_string(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --verify= setting: %s", arg); return log_error_errno(r, "Failed to parse --verify= setting: %s", opts.arg);
arg_verify = r; arg_verify = r;
break; break;
OPTION_LONG("format", "FORMAT", OPTION_LONG("format", "FORMAT",
"Desired output format for export (zstd, xz, gzip, bzip2)"): "Desired output format for export (zstd, xz, gzip, bzip2)"):
if (!STR_IN_SET(arg, "uncompressed", "xz", "gzip", "bzip2", "zstd")) if (!STR_IN_SET(opts.arg, "uncompressed", "xz", "gzip", "bzip2", "zstd"))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Unknown format: %s", arg); "Unknown format: %s", opts.arg);
arg_format = arg; arg_format = opts.arg;
break; break;
OPTION_LONG("force", NULL, "Install image even if already exists"): OPTION_LONG("force", NULL, "Install image even if already exists"):
@@ -1202,9 +1201,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("class", "TYPE", "Install as the specified TYPE"): OPTION_LONG("class", "TYPE", "Install as the specified TYPE"):
arg_image_class = image_class_from_string(arg); arg_image_class = image_class_from_string(opts.arg);
if (arg_image_class < 0) if (arg_image_class < 0)
return log_error_errno(arg_image_class, "Failed to parse --class= parameter: %s", arg); return log_error_errno(arg_image_class, "Failed to parse --class= parameter: %s", opts.arg);
break; break;
OPTION_SHORT('m', NULL, "Install as --class=machine, machine image"): OPTION_SHORT('m', NULL, "Install as --class=machine, machine image"):
@@ -1225,9 +1224,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("keep-download", "BOOL", OPTION_LONG("keep-download", "BOOL",
"Control whether to keep pristine copy of download"): "Control whether to keep pristine copy of download"):
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --keep-download= value: %s", arg); return log_error_errno(r, "Failed to parse --keep-download= value: %s", opts.arg);
SET_FLAG(arg_import_flags, IMPORT_PULL_KEEP_DOWNLOAD, r); SET_FLAG(arg_import_flags, IMPORT_PULL_KEEP_DOWNLOAD, r);
arg_import_flags_mask |= IMPORT_PULL_KEEP_DOWNLOAD; arg_import_flags_mask |= IMPORT_PULL_KEEP_DOWNLOAD;
@@ -1239,7 +1238,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+25 -26
View File
@@ -364,10 +364,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -381,7 +380,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("image-root", "PATH", "Image root directory"): OPTION_LONG("image-root", "PATH", "Image root directory"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_image_root); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_image_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -390,7 +389,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
"Verify downloaded image, one of: 'no', 'checksum', 'signature' or literal SHA256 hash"): { "Verify downloaded image, one of: 'no', 'checksum', 'signature' or literal SHA256 hash"): {
ImportVerify v; ImportVerify v;
v = import_verify_from_string(arg); v = import_verify_from_string(opts.arg);
if (v < 0) { if (v < 0) {
_cleanup_free_ void *h = NULL; _cleanup_free_ void *h = NULL;
size_t n; size_t n;
@@ -398,10 +397,10 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
/* If this is not a valid verification mode, maybe it's a literally specified /* If this is not a valid verification mode, maybe it's a literally specified
* SHA256 hash? We can handle that too... */ * SHA256 hash? We can handle that too... */
r = unhexmem(arg, &h, &n); r = unhexmem(opts.arg, &h, &n);
if (r < 0 || n == 0) if (r < 0 || n == 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Invalid verification setting: %s", arg); "Invalid verification setting: %s", opts.arg);
if (n != 32) if (n != 32)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"64 hex character SHA256 hash required when specifying explicit checksum, %zu specified", n * 2); "64 hex character SHA256 hash required when specifying explicit checksum, %zu specified", n * 2);
@@ -418,7 +417,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
} }
OPTION_LONG("settings", "BOOL", "Download settings file with image"): OPTION_LONG("settings", "BOOL", "Download settings file with image"):
r = parse_boolean_argument("--settings=", arg, NULL); r = parse_boolean_argument("--settings=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
@@ -427,7 +426,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("roothash", "BOOL", "Download root hash file with image"): OPTION_LONG("roothash", "BOOL", "Download root hash file with image"):
r = parse_boolean_argument("--roothash=", arg, NULL); r = parse_boolean_argument("--roothash=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
@@ -440,7 +439,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("roothash-signature", "BOOL", OPTION_LONG("roothash-signature", "BOOL",
"Download root hash signature file with image"): "Download root hash signature file with image"):
r = parse_boolean_argument("--roothash-signature=", arg, NULL); r = parse_boolean_argument("--roothash-signature=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
@@ -448,7 +447,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("verity", "BOOL", "Download verity file with image"): OPTION_LONG("verity", "BOOL", "Download verity file with image"):
r = parse_boolean_argument("--verity=", arg, NULL); r = parse_boolean_argument("--verity=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
@@ -466,7 +465,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("btrfs-subvol", "BOOL", OPTION_LONG("btrfs-subvol", "BOOL",
"Controls whether to create a btrfs subvolume instead of a directory"): "Controls whether to create a btrfs subvolume instead of a directory"):
r = parse_boolean_argument("--btrfs-subvol=", arg, NULL); r = parse_boolean_argument("--btrfs-subvol=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
SET_FLAG(arg_import_flags, IMPORT_BTRFS_SUBVOL, r); SET_FLAG(arg_import_flags, IMPORT_BTRFS_SUBVOL, r);
@@ -474,7 +473,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("btrfs-quota", "BOOL", OPTION_LONG("btrfs-quota", "BOOL",
"Controls whether to set up quota for btrfs subvolume"): "Controls whether to set up quota for btrfs subvolume"):
r = parse_boolean_argument("--btrfs-quota=", arg, NULL); r = parse_boolean_argument("--btrfs-quota=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
SET_FLAG(arg_import_flags, IMPORT_BTRFS_QUOTA, r); SET_FLAG(arg_import_flags, IMPORT_BTRFS_QUOTA, r);
@@ -482,14 +481,14 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("convert-qcow2", "BOOL", OPTION_LONG("convert-qcow2", "BOOL",
"Controls whether to convert QCOW2 images to regular disk images"): "Controls whether to convert QCOW2 images to regular disk images"):
r = parse_boolean_argument("--convert-qcow2=", arg, NULL); r = parse_boolean_argument("--convert-qcow2=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
SET_FLAG(arg_import_flags, IMPORT_CONVERT_QCOW2, r); SET_FLAG(arg_import_flags, IMPORT_CONVERT_QCOW2, r);
break; break;
OPTION_LONG("sync", "BOOL", "Controls whether to sync() before completing"): OPTION_LONG("sync", "BOOL", "Controls whether to sync() before completing"):
r = parse_boolean_argument("--sync=", arg, NULL); r = parse_boolean_argument("--sync=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
SET_FLAG(arg_import_flags, IMPORT_SYNC, r); SET_FLAG(arg_import_flags, IMPORT_SYNC, r);
@@ -498,11 +497,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("offset", "BYTES", "Offset to seek to in destination"): { OPTION_LONG("offset", "BYTES", "Offset to seek to in destination"): {
uint64_t u; uint64_t u;
r = safe_atou64(arg, &u); r = safe_atou64(opts.arg, &u);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --offset= argument: %s", arg); return log_error_errno(r, "Failed to parse --offset= argument: %s", opts.arg);
if (!FILE_SIZE_VALID(u)) if (!FILE_SIZE_VALID(u))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Argument to --offset= switch too large: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Argument to --offset= switch too large: %s", opts.arg);
arg_offset = u; arg_offset = u;
break; break;
@@ -511,11 +510,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("size-max", "BYTES", "Maximum number of bytes to write to destination"): { OPTION_LONG("size-max", "BYTES", "Maximum number of bytes to write to destination"): {
uint64_t u; uint64_t u;
r = parse_size(arg, 1024, &u); r = parse_size(opts.arg, 1024, &u);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --size-max= argument: %s", arg); return log_error_errno(r, "Failed to parse --size-max= argument: %s", opts.arg);
if (!FILE_SIZE_VALID(u)) if (!FILE_SIZE_VALID(u))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Argument to --size-max= switch too large: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Argument to --size-max= switch too large: %s", opts.arg);
arg_size_max = u; arg_size_max = u;
break; break;
@@ -523,16 +522,16 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("class", "CLASS", OPTION_LONG("class", "CLASS",
"Select image class (machine, sysext, confext, portable)"): "Select image class (machine, sysext, confext, portable)"):
arg_class = image_class_from_string(arg); arg_class = image_class_from_string(opts.arg);
if (arg_class < 0) if (arg_class < 0)
return log_error_errno(arg_class, "Failed to parse --class= argument: %s", arg); return log_error_errno(arg_class, "Failed to parse --class= argument: %s", opts.arg);
break; break;
OPTION_LONG("keep-download", "BOOL", OPTION_LONG("keep-download", "BOOL",
"Keep a pristine copy of the downloaded file around"): "Keep a pristine copy of the downloaded file around"):
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --keep-download= argument: %s", arg); return log_error_errno(r, "Failed to parse --keep-download= argument: %s", opts.arg);
SET_FLAG(arg_import_flags, IMPORT_PULL_KEEP_DOWNLOAD, r); SET_FLAG(arg_import_flags, IMPORT_PULL_KEEP_DOWNLOAD, r);
auto_keep_download = false; auto_keep_download = false;
@@ -577,7 +576,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
if (arg_runtime_scope == RUNTIME_SCOPE_USER) if (arg_runtime_scope == RUNTIME_SCOPE_USER)
arg_import_flags |= IMPORT_FOREIGN_UID; arg_import_flags |= IMPORT_FOREIGN_UID;
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+8 -9
View File
@@ -1118,11 +1118,10 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -1136,7 +1135,7 @@ static int parse_argv(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Certificate file specified twice"); "Certificate file specified twice");
r = read_full_file_full( r = read_full_file_full(
AT_FDCWD, arg, UINT64_MAX, SIZE_MAX, AT_FDCWD, opts.arg, UINT64_MAX, SIZE_MAX,
READ_FULL_FILE_CONNECT_SOCKET, READ_FULL_FILE_CONNECT_SOCKET,
NULL, NULL,
&arg_cert_pem, NULL); &arg_cert_pem, NULL);
@@ -1150,7 +1149,7 @@ static int parse_argv(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Key file specified twice"); "Key file specified twice");
r = read_full_file_full( r = read_full_file_full(
AT_FDCWD, arg, UINT64_MAX, SIZE_MAX, AT_FDCWD, opts.arg, UINT64_MAX, SIZE_MAX,
READ_FULL_FILE_SECURE|READ_FULL_FILE_WARN_WORLD_READABLE|READ_FULL_FILE_CONNECT_SOCKET, READ_FULL_FILE_SECURE|READ_FULL_FILE_WARN_WORLD_READABLE|READ_FULL_FILE_CONNECT_SOCKET,
NULL, NULL,
&arg_key_pem, NULL); &arg_key_pem, NULL);
@@ -1165,7 +1164,7 @@ static int parse_argv(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"CA certificate file specified twice"); "CA certificate file specified twice");
r = read_full_file_full( r = read_full_file_full(
AT_FDCWD, arg, UINT64_MAX, SIZE_MAX, AT_FDCWD, opts.arg, UINT64_MAX, SIZE_MAX,
READ_FULL_FILE_CONNECT_SOCKET, READ_FULL_FILE_CONNECT_SOCKET,
NULL, NULL,
&arg_trust_pem, NULL); &arg_trust_pem, NULL);
@@ -1191,19 +1190,19 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION('D', "directory", "PATH", "Serve journal files in directory"): OPTION('D', "directory", "PATH", "Serve journal files in directory"):
r = free_and_strdup_warn(&arg_directory, arg); r = free_and_strdup_warn(&arg_directory, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("file", "PATH", "Serve this journal file"): OPTION_LONG("file", "PATH", "Serve this journal file"):
r = glob_extend(&arg_file, arg, GLOB_NOCHECK); r = glob_extend(&arg_file, opts.arg, GLOB_NOCHECK);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to add paths: %m"); return log_error_errno(r, "Failed to add paths: %m");
break; break;
} }
if (option_parser_get_n_args(&state) > 0) if (option_parser_get_n_args(&opts) > 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"This program does not take arguments."); "This program does not take arguments.");
+27 -28
View File
@@ -905,10 +905,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -918,19 +917,19 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
OPTION_LONG("url", "URL", "Read events from systemd-journal-gatewayd at URL"): OPTION_LONG("url", "URL", "Read events from systemd-journal-gatewayd at URL"):
r = free_and_strdup_warn(&arg_url, arg); r = free_and_strdup_warn(&arg_url, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("getter", "COMMAND", "Read events from the output of COMMAND"): OPTION_LONG("getter", "COMMAND", "Read events from the output of COMMAND"):
r = free_and_strdup_warn(&arg_getter, arg); r = free_and_strdup_warn(&arg_getter, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("listen-raw", "ADDR", "Listen for connections at ADDR"): OPTION_LONG("listen-raw", "ADDR", "Listen for connections at ADDR"):
r = free_and_strdup_warn(&arg_listen_raw, arg); r = free_and_strdup_warn(&arg_listen_raw, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -940,11 +939,11 @@ static int parse_argv(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Cannot currently use --listen-http= more than once"); "Cannot currently use --listen-http= more than once");
r = negative_fd(arg); r = negative_fd(opts.arg);
if (r >= 0) if (r >= 0)
http_socket = r; http_socket = r;
else { else {
r = free_and_strdup_warn(&arg_listen_http, arg); r = free_and_strdup_warn(&arg_listen_http, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
} }
@@ -955,24 +954,24 @@ static int parse_argv(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Cannot currently use --listen-https= more than once"); "Cannot currently use --listen-https= more than once");
r = negative_fd(arg); r = negative_fd(opts.arg);
if (r >= 0) if (r >= 0)
https_socket = r; https_socket = r;
else { else {
r = free_and_strdup_warn(&arg_listen_https, arg); r = free_and_strdup_warn(&arg_listen_https, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
} }
break; break;
OPTION_LONG("key", "FILENAME", "SSL key in PEM format (default: \"" PRIV_KEY_FILE "\")"): OPTION_LONG("key", "FILENAME", "SSL key in PEM format (default: \"" PRIV_KEY_FILE "\")"):
r = free_and_strdup_warn(&arg_key, arg); r = free_and_strdup_warn(&arg_key, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("cert", "FILENAME", "SSL certificate in PEM format (default: \"" CERT_FILE "\")"): OPTION_LONG("cert", "FILENAME", "SSL certificate in PEM format (default: \"" CERT_FILE "\")"):
r = free_and_strdup_warn(&arg_cert, arg); r = free_and_strdup_warn(&arg_cert, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -980,7 +979,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("trust", "FILENAME|all", OPTION_LONG("trust", "FILENAME|all",
"SSL CA certificate or disable checking (default: \"" TRUST_FILE "\")"): "SSL CA certificate or disable checking (default: \"" TRUST_FILE "\")"):
#if HAVE_GNUTLS #if HAVE_GNUTLS
r = free_and_strdup_warn(&arg_trust, arg); r = free_and_strdup_warn(&arg_trust, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
#else #else
@@ -989,34 +988,34 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION('o', "output", "FILE|DIR", "Write output to FILE or DIR/external-*.journal"): OPTION('o', "output", "FILE|DIR", "Write output to FILE or DIR/external-*.journal"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_output); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_output);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("split-mode", "none|host", "How many output files to create"): OPTION_LONG("split-mode", "none|host", "How many output files to create"):
arg_split_mode = journal_write_split_mode_from_string(arg); arg_split_mode = journal_write_split_mode_from_string(opts.arg);
if (arg_split_mode == _JOURNAL_WRITE_SPLIT_INVALID) if (arg_split_mode == _JOURNAL_WRITE_SPLIT_INVALID)
return log_error_errno(arg_split_mode, "Invalid split mode: %s", arg); return log_error_errno(arg_split_mode, "Invalid split mode: %s", opts.arg);
break; break;
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "compress", "BOOL", OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "compress", "BOOL",
"Use compression in the output journal (default: yes)"): "Use compression in the output journal (default: yes)"):
r = parse_boolean_argument("--compress", arg, &arg_compress); r = parse_boolean_argument("--compress", opts.arg, &arg_compress);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "seal", "BOOL", OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "seal", "BOOL",
"Use event sealing (default: no)"): "Use event sealing (default: no)"):
r = parse_boolean_argument("--seal", arg, &arg_seal); r = parse_boolean_argument("--seal", opts.arg, &arg_seal);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("gnutls-log", "CATEGORY,...", "Specify a list of gnutls logging categories"): OPTION_LONG("gnutls-log", "CATEGORY,...", "Specify a list of gnutls logging categories"):
#if HAVE_GNUTLS #if HAVE_GNUTLS
for (const char *p = arg;;) { for (const char *p = opts.arg;;) {
_cleanup_free_ char *word = NULL; _cleanup_free_ char *word = NULL;
r = extract_first_word(&p, &word, ",", 0); r = extract_first_word(&p, &word, ",", 0);
@@ -1034,31 +1033,31 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("max-use", "BYTES", "Maximum disk space to use"): OPTION_LONG("max-use", "BYTES", "Maximum disk space to use"):
r = parse_size(arg, 1024, &arg_max_use); r = parse_size(opts.arg, 1024, &arg_max_use);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --max-use= value: %s", arg); return log_error_errno(r, "Failed to parse --max-use= value: %s", opts.arg);
break; break;
OPTION_LONG("keep-free", "BYTES", "Minimum disk space to keep free"): OPTION_LONG("keep-free", "BYTES", "Minimum disk space to keep free"):
r = parse_size(arg, 1024, &arg_keep_free); r = parse_size(opts.arg, 1024, &arg_keep_free);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --keep-free= value: %s", arg); return log_error_errno(r, "Failed to parse --keep-free= value: %s", opts.arg);
break; break;
OPTION_LONG("max-file-size", "BYTES", "Maximum size of individual journal files"): OPTION_LONG("max-file-size", "BYTES", "Maximum size of individual journal files"):
r = parse_size(arg, 1024, &arg_max_size); r = parse_size(opts.arg, 1024, &arg_max_size);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --max-file-size= value: %s", arg); return log_error_errno(r, "Failed to parse --max-file-size= value: %s", opts.arg);
break; break;
OPTION_LONG("max-files", "N", "Maximum number of journal files to keep"): OPTION_LONG("max-files", "N", "Maximum number of journal files to keep"):
r = safe_atou64(arg, &arg_n_max_files); r = safe_atou64(opts.arg, &arg_n_max_files);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --max-files= value: %s", arg); return log_error_errno(r, "Failed to parse --max-files= value: %s", opts.arg);
break; break;
} }
arg_files = strv_copy(option_parser_get_args(&state)); arg_files = strv_copy(option_parser_get_args(&opts));
if (!arg_files) if (!arg_files)
return log_oom(); return log_oom();
+4 -5
View File
@@ -247,11 +247,10 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -265,13 +264,13 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("tty", "TTY", "Specify path to TTY to use"): OPTION_LONG("tty", "TTY", "Specify path to TTY to use"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_tty); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_tty);
if (r < 0) if (r < 0)
return r; return r;
break; break;
} }
if (option_parser_get_n_args(&state) > 0) if (option_parser_get_n_args(&opts) > 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"%s takes no argument.", "%s takes no argument.",
program_invocation_short_name); program_invocation_short_name);
+8 -9
View File
@@ -59,11 +59,10 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv, OPTION_PARSER_STOP_AT_FIRST_NONOPTION }; OptionParser opts = { argc, argv, OPTION_PARSER_STOP_AT_FIRST_NONOPTION };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -73,11 +72,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return version(); return version();
OPTION('t', "identifier", "STRING", "Set syslog identifier"): OPTION('t', "identifier", "STRING", "Set syslog identifier"):
arg_identifier = empty_to_null(arg); arg_identifier = empty_to_null(opts.arg);
break; break;
OPTION('p', "priority", "PRIORITY", "Set priority value (0..7)"): OPTION('p', "priority", "PRIORITY", "Set priority value (0..7)"):
arg_priority = log_level_from_string(arg); arg_priority = log_level_from_string(opts.arg);
if (arg_priority < 0) if (arg_priority < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Failed to parse priority value."); "Failed to parse priority value.");
@@ -85,7 +84,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("stderr-priority", "PRIORITY", OPTION_LONG("stderr-priority", "PRIORITY",
"Set priority value (0..7) used for stderr"): "Set priority value (0..7) used for stderr"):
arg_stderr_priority = log_level_from_string(arg); arg_stderr_priority = log_level_from_string(opts.arg);
if (arg_stderr_priority < 0) if (arg_stderr_priority < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Failed to parse stderr priority value."); "Failed to parse stderr priority value.");
@@ -93,18 +92,18 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("level-prefix", "BOOL", OPTION_LONG("level-prefix", "BOOL",
"Control whether level prefix shall be parsed"): "Control whether level prefix shall be parsed"):
r = parse_boolean_argument("--level-prefix=", arg, &arg_level_prefix); r = parse_boolean_argument("--level-prefix=", opts.arg, &arg_level_prefix);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("namespace", "NAMESPACE", OPTION_LONG("namespace", "NAMESPACE",
"Connect to specified journal namespace"): "Connect to specified journal namespace"):
arg_namespace = empty_to_null(arg); arg_namespace = empty_to_null(opts.arg);
break; break;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+11 -12
View File
@@ -87,11 +87,10 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -101,14 +100,14 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return version(); return version();
OPTION_COMMON_PRIVATE_KEY("Private key in PEM format"): OPTION_COMMON_PRIVATE_KEY("Private key in PEM format"):
r = free_and_strdup_warn(&arg_private_key, arg); r = free_and_strdup_warn(&arg_private_key, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_COMMON_PRIVATE_KEY_SOURCE: OPTION_COMMON_PRIVATE_KEY_SOURCE:
r = parse_openssl_key_source_argument( r = parse_openssl_key_source_argument(
arg, opts.arg,
&arg_private_key_source, &arg_private_key_source,
&arg_private_key_source_type); &arg_private_key_source_type);
if (r < 0) if (r < 0)
@@ -116,14 +115,14 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_COMMON_CERTIFICATE("PEM certificate to use for signing"): OPTION_COMMON_CERTIFICATE("PEM certificate to use for signing"):
r = free_and_strdup_warn(&arg_certificate, arg); r = free_and_strdup_warn(&arg_certificate, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_COMMON_CERTIFICATE_SOURCE: OPTION_COMMON_CERTIFICATE_SOURCE:
r = parse_openssl_certificate_source_argument( r = parse_openssl_certificate_source_argument(
arg, opts.arg,
&arg_certificate_source, &arg_certificate_source,
&arg_certificate_source_type); &arg_certificate_source_type);
if (r < 0) if (r < 0)
@@ -131,24 +130,24 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("signature", "PATH", "PKCS#1 signature to embed in PKCS#7 signature"): OPTION_LONG("signature", "PATH", "PKCS#1 signature to embed in PKCS#7 signature"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_signature); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_signature);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("content", "PATH", "Raw data content to embed in PKCS#7 signature"): OPTION_LONG("content", "PATH", "Raw data content to embed in PKCS#7 signature"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_content); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_content);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("hash-algorithm", "ALGORITHM", OPTION_LONG("hash-algorithm", "ALGORITHM",
"Hash algorithm used to create the PKCS#1 signature"): "Hash algorithm used to create the PKCS#1 signature"):
arg_hash_algorithm = arg; arg_hash_algorithm = opts.arg;
break; break;
OPTION_LONG("output", "PATH", "Where to write the PKCS#7 signature"): OPTION_LONG("output", "PATH", "Where to write the PKCS#7 signature"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_output); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_output);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -157,7 +156,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
if (arg_private_key_source && !arg_certificate) if (arg_private_key_source && !arg_certificate)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "When using --private-key-source=, --certificate= must be specified."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "When using --private-key-source=, --certificate= must be specified.");
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+23 -24
View File
@@ -78,88 +78,87 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_VERSION: OPTION_COMMON_VERSION:
return version(); return version();
OPTION('i', "interface", "INTERFACE", "Network interface"): OPTION('i', "interface", "INTERFACE", "Network interface"):
r = rtnl_resolve_interface_or_warn(&rtnl, arg); r = rtnl_resolve_interface_or_warn(&rtnl, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
arg_ifindex = r; arg_ifindex = r;
break; break;
OPTION('t', "type", "TYPE", "ICMPv6 message type"): OPTION('t', "type", "TYPE", "ICMPv6 message type"):
r = parse_icmp6_type(arg); r = parse_icmp6_type(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse message type: %m"); return log_error_errno(r, "Failed to parse message type: %m");
arg_icmp6_type = r; arg_icmp6_type = r;
break; break;
OPTION('d', "dest", "ADDRESS", "Destination address"): OPTION('d', "dest", "ADDRESS", "Destination address"):
r = in_addr_from_string(AF_INET6, arg, &arg_dest); r = in_addr_from_string(AF_INET6, opts.arg, &arg_dest);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse destination address: %m"); return log_error_errno(r, "Failed to parse destination address: %m");
if (!in6_addr_is_link_local(&arg_dest.in6)) if (!in6_addr_is_link_local(&arg_dest.in6))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"The destination address %s is not a link-local address.", arg); "The destination address %s is not a link-local address.", opts.arg);
break; break;
OPTION_GROUP("Router Advertisement"): {} OPTION_GROUP("Router Advertisement"): {}
OPTION_LONG("hop-limit", "LIMIT", "Hop limit"): OPTION_LONG("hop-limit", "LIMIT", "Hop limit"):
r = safe_atou8(arg, &arg_hop_limit); r = safe_atou8(opts.arg, &arg_hop_limit);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse hop limit: %m"); return log_error_errno(r, "Failed to parse hop limit: %m");
break; break;
OPTION_LONG("managed", "BOOL", "Managed flag"): OPTION_LONG("managed", "BOOL", "Managed flag"):
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse managed flag: %m"); return log_error_errno(r, "Failed to parse managed flag: %m");
SET_FLAG(arg_ra_flags, ND_RA_FLAG_MANAGED, r); SET_FLAG(arg_ra_flags, ND_RA_FLAG_MANAGED, r);
break; break;
OPTION_LONG("other", "BOOL", "Other flag"): OPTION_LONG("other", "BOOL", "Other flag"):
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse other flag: %m"); return log_error_errno(r, "Failed to parse other flag: %m");
SET_FLAG(arg_ra_flags, ND_RA_FLAG_OTHER, r); SET_FLAG(arg_ra_flags, ND_RA_FLAG_OTHER, r);
break; break;
OPTION_LONG("home-agent", "BOOL", "Home-agent flag"): OPTION_LONG("home-agent", "BOOL", "Home-agent flag"):
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse home-agent flag: %m"); return log_error_errno(r, "Failed to parse home-agent flag: %m");
SET_FLAG(arg_ra_flags, ND_RA_FLAG_HOME_AGENT, r); SET_FLAG(arg_ra_flags, ND_RA_FLAG_HOME_AGENT, r);
break; break;
OPTION_LONG("preference", "PREF", "Preference"): OPTION_LONG("preference", "PREF", "Preference"):
r = parse_preference(arg); r = parse_preference(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse preference: %m"); return log_error_errno(r, "Failed to parse preference: %m");
arg_preference = r; arg_preference = r;
break; break;
OPTION_LONG("lifetime", "SECS", "Lifetime"): OPTION_LONG("lifetime", "SECS", "Lifetime"):
r = parse_sec(arg, &arg_lifetime); r = parse_sec(opts.arg, &arg_lifetime);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse lifetime: %m"); return log_error_errno(r, "Failed to parse lifetime: %m");
break; break;
OPTION_LONG("reachable-time", "SECS", "Reachable time"): OPTION_LONG("reachable-time", "SECS", "Reachable time"):
r = parse_sec(arg, &arg_reachable); r = parse_sec(opts.arg, &arg_reachable);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse reachable time: %m"); return log_error_errno(r, "Failed to parse reachable time: %m");
break; break;
OPTION_LONG("retransmit-timer", "SECS", "Retransmit timer"): OPTION_LONG("retransmit-timer", "SECS", "Retransmit timer"):
r = parse_sec(arg, &arg_retransmit); r = parse_sec(opts.arg, &arg_retransmit);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse retransmit timer: %m"); return log_error_errno(r, "Failed to parse retransmit timer: %m");
break; break;
@@ -167,21 +166,21 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_GROUP("Neighbor Advertisement"): {} OPTION_GROUP("Neighbor Advertisement"): {}
OPTION_LONG("is-router", "BOOL", "Router flag"): OPTION_LONG("is-router", "BOOL", "Router flag"):
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse is-router flag: %m"); return log_error_errno(r, "Failed to parse is-router flag: %m");
SET_FLAG(arg_na_flags, ND_NA_FLAG_ROUTER, r); SET_FLAG(arg_na_flags, ND_NA_FLAG_ROUTER, r);
break; break;
OPTION_LONG("is-solicited", "BOOL", "Solicited flag"): OPTION_LONG("is-solicited", "BOOL", "Solicited flag"):
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse is-solicited flag: %m"); return log_error_errno(r, "Failed to parse is-solicited flag: %m");
SET_FLAG(arg_na_flags, ND_NA_FLAG_SOLICITED, r); SET_FLAG(arg_na_flags, ND_NA_FLAG_SOLICITED, r);
break; break;
OPTION_LONG("is-override", "BOOL", "Override flag"): OPTION_LONG("is-override", "BOOL", "Override flag"):
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse is-override flag: %m"); return log_error_errno(r, "Failed to parse is-override flag: %m");
SET_FLAG(arg_na_flags, ND_NA_FLAG_OVERRIDE, r); SET_FLAG(arg_na_flags, ND_NA_FLAG_OVERRIDE, r);
@@ -190,7 +189,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_GROUP("Neighbor Solicit/Advertisement and Redirect"): {} OPTION_GROUP("Neighbor Solicit/Advertisement and Redirect"): {}
OPTION_LONG("target-address", "ADDRESS", "Target address"): OPTION_LONG("target-address", "ADDRESS", "Target address"):
r = in_addr_from_string(AF_INET6, arg, &arg_target_address); r = in_addr_from_string(AF_INET6, opts.arg, &arg_target_address);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse target address: %m"); return log_error_errno(r, "Failed to parse target address: %m");
break; break;
@@ -198,7 +197,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_GROUP("Redirect"): {} OPTION_GROUP("Redirect"): {}
OPTION_LONG("redirect-destination", "ADDRESS", "Redirect destination address"): OPTION_LONG("redirect-destination", "ADDRESS", "Redirect destination address"):
r = in_addr_from_string(AF_INET6, arg, &arg_redirect_destination); r = in_addr_from_string(AF_INET6, opts.arg, &arg_redirect_destination);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse destination address: %m"); return log_error_errno(r, "Failed to parse destination address: %m");
break; break;
@@ -206,14 +205,14 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_GROUP("NDisc Options"): {} OPTION_GROUP("NDisc Options"): {}
OPTION_LONG("source-ll-address", "BOOL", "Include source link-layer address"): OPTION_LONG("source-ll-address", "BOOL", "Include source link-layer address"):
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse source LL address option: %m"); return log_error_errno(r, "Failed to parse source LL address option: %m");
arg_set_source_mac = r; arg_set_source_mac = r;
break; break;
OPTION_LONG("target-ll-address", "ADDRESS", "Target link-layer address"): OPTION_LONG("target-ll-address", "ADDRESS", "Target link-layer address"):
r = parse_ether_addr(arg, &arg_target_mac); r = parse_ether_addr(opts.arg, &arg_target_mac);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse target LL address option: %m"); return log_error_errno(r, "Failed to parse target LL address option: %m");
arg_set_target_mac = true; arg_set_target_mac = true;
@@ -223,7 +222,7 @@ static int parse_argv(int argc, char *argv[]) {
_cleanup_free_ void *p = NULL; _cleanup_free_ void *p = NULL;
size_t len; size_t len;
r = unbase64mem(arg, &p, &len); r = unbase64mem(opts.arg, &p, &len);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse redirected header: %m"); return log_error_errno(r, "Failed to parse redirected header: %m");
@@ -235,7 +234,7 @@ static int parse_argv(int argc, char *argv[]) {
} }
OPTION_LONG("mtu", "MTU", "MTU"): OPTION_LONG("mtu", "MTU", "MTU"):
r = safe_atou32(arg, &arg_mtu); r = safe_atou32(opts.arg, &arg_mtu);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse MTU: %m"); return log_error_errno(r, "Failed to parse MTU: %m");
arg_set_mtu = true; arg_set_mtu = true;
@@ -151,10 +151,9 @@ int main(int argc, char *argv[]) {
test_setup_logging(LOG_DEBUG); test_setup_logging(LOG_DEBUG);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: { OPTION_COMMON_HELP: {
@@ -180,27 +179,27 @@ int main(int argc, char *argv[]) {
"Offset at which to start corrupting the journal " "Offset at which to start corrupting the journal "
"(default: random offset is picked, unless --sequential is used" "(default: random offset is picked, unless --sequential is used"
" - in that case we use 0 + iteration)"): " - in that case we use 0 + iteration)"):
r = safe_atou64(arg, &start_offset); r = safe_atou64(opts.arg, &start_offset);
if (r < 0) if (r < 0)
return log_error_errno(r, "Invalid starting offset: %m"); return log_error_errno(r, "Invalid starting offset: %m");
break; break;
OPTION_LONG("iterations", "ITER", OPTION_LONG("iterations", "ITER",
"Number of iterations to perform before exiting (default: 100)"): "Number of iterations to perform before exiting (default: 100)"):
r = safe_atou64(arg, &iterations); r = safe_atou64(opts.arg, &iterations);
if (r < 0) if (r < 0)
return log_error_errno(r, "Invalid value for iterations: %m"); return log_error_errno(r, "Invalid value for iterations: %m");
break; break;
OPTION_LONG("corrupt-step", "STEP", OPTION_LONG("corrupt-step", "STEP",
"Corrupt every n-th byte starting from OFFSET (default: 31)"): "Corrupt every n-th byte starting from OFFSET (default: 31)"):
r = safe_atou64(arg, &corrupt_step); r = safe_atou64(opts.arg, &corrupt_step);
if (r < 0) if (r < 0)
return log_error_errno(r, "Invalid value for corrupt-step: %m"); return log_error_errno(r, "Invalid value for corrupt-step: %m");
break; break;
OPTION_LONG("iteration-step", "STEP", "Iteration step (default: 1)"): OPTION_LONG("iteration-step", "STEP", "Iteration step (default: 1)"):
r = safe_atou64(arg, &iteration_step); r = safe_atou64(opts.arg, &iteration_step);
if (r < 0) if (r < 0)
return log_error_errno(r, "Invalid value for iteration-step: %m"); return log_error_errno(r, "Invalid value for iteration-step: %m");
break; break;
@@ -215,7 +214,7 @@ int main(int argc, char *argv[]) {
OPTION_LONG("run-one", "OFFSET", OPTION_LONG("run-one", "OFFSET",
"Single shot mode for reproducing issues. " "Single shot mode for reproducing issues. "
"Takes the same offset as --start-offset= and does only one iteration"): "Takes the same offset as --start-offset= and does only one iteration"):
r = safe_atou64(arg, &start_offset); r = safe_atou64(opts.arg, &start_offset);
if (r < 0) if (r < 0)
return log_error_errno(r, "Invalid offset: %m"); return log_error_errno(r, "Invalid offset: %m");
+4 -5
View File
@@ -428,10 +428,9 @@ static int parse_args(int argc, char *argv[], const char **syspath, const char *
assert(syspath); assert(syspath);
assert(subsystem); assert(subsystem);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -442,11 +441,11 @@ static int parse_args(int argc, char *argv[], const char **syspath, const char *
return 0; return 0;
OPTION('p', "syspath", "PATH", "Syspath to test"): OPTION('p', "syspath", "PATH", "Syspath to test"):
*syspath = arg; *syspath = opts.arg;
break; break;
OPTION('s', "subsystem", "SUBSYSTEM", "Subsystem to enumerate"): OPTION('s', "subsystem", "SUBSYSTEM", "Subsystem to enumerate"):
*subsystem = arg; *subsystem = opts.arg;
break; break;
OPTION('d', "debug", NULL, "Enable debug logging"): OPTION('d', "debug", NULL, "Enable debug logging"):
+8 -9
View File
@@ -200,11 +200,10 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
assert(argv); assert(argv);
assert(remaining_args); assert(remaining_args);
OptionParser state = { argc, argv, OPTION_PARSER_STOP_AT_FIRST_NONOPTION }; OptionParser opts = { argc, argv, OPTION_PARSER_STOP_AT_FIRST_NONOPTION };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -226,7 +225,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
break; break;
OPTION_COMMON_JSON: OPTION_COMMON_JSON:
r = parse_json_argument(arg, &arg_json_format_flags); r = parse_json_argument(opts.arg, &arg_json_format_flags);
if (r <= 0) if (r <= 0)
return r; return r;
break; break;
@@ -236,21 +235,21 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
"(shutdown, sleep, idle, handle-power-key, " "(shutdown, sleep, idle, handle-power-key, "
"handle-suspend-key, handle-hibernate-key, " "handle-suspend-key, handle-hibernate-key, "
"handle-lid-switch)"): "handle-lid-switch)"):
arg_what = arg; arg_what = opts.arg;
break; break;
OPTION_LONG("who", "STRING", OPTION_LONG("who", "STRING",
"A descriptive string who is inhibiting"): "A descriptive string who is inhibiting"):
arg_who = arg; arg_who = opts.arg;
break; break;
OPTION_LONG("why", "STRING", OPTION_LONG("why", "STRING",
"A descriptive string why is being inhibited"): "A descriptive string why is being inhibited"):
arg_why = arg; arg_why = opts.arg;
break; break;
OPTION_LONG("mode", "MODE", "One of block, block-weak, or delay"): OPTION_LONG("mode", "MODE", "One of block, block-weak, or delay"):
arg_mode = arg; arg_mode = opts.arg;
break; break;
OPTION_LONG("list", NULL, "List active inhibitors"): OPTION_LONG("list", NULL, "List active inhibitors"):
@@ -258,7 +257,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
break; break;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (arg_action == ACTION_INHIBIT && strv_isempty(args)) if (arg_action == ACTION_INHIBIT && strv_isempty(args))
arg_action = ACTION_LIST; arg_action = ACTION_LIST;
+6 -7
View File
@@ -75,11 +75,10 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -95,19 +94,19 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_GROUP("Options"): {} OPTION_GROUP("Options"): {}
OPTION_LONG("root", "PATH", "Operate on an alternate filesystem root"): OPTION_LONG("root", "PATH", "Operate on an alternate filesystem root"):
r = parse_path_argument(arg, true, &arg_root); r = parse_path_argument(opts.arg, true, &arg_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("image", "PATH", "Operate on disk image as filesystem root"): OPTION_LONG("image", "PATH", "Operate on disk image as filesystem root"):
r = parse_path_argument(arg, false, &arg_image); r = parse_path_argument(opts.arg, false, &arg_image);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("image-policy", "POLICY", "Specify disk image dissection policy"): OPTION_LONG("image-policy", "POLICY", "Specify disk image dissection policy"):
r = parse_image_policy_argument(arg, &arg_image_policy); r = parse_image_policy_argument(opts.arg, &arg_image_policy);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -117,7 +116,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
} }
if (option_parser_get_n_args(&state) > 0) if (option_parser_get_n_args(&opts) > 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Extraneous arguments"); "Extraneous arguments");
+18 -20
View File
@@ -136,12 +136,10 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const Option *opt;
const char *arg;
int r; int r;
FOREACH_OPTION_FULL(&state, c, &opt, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -163,7 +161,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
"Specify a boot phase to sign for"): { "Specify a boot phase to sign for"): {
char *n; char *n;
n = normalize_phase(arg); n = normalize_phase(opts.arg);
if (!n) if (!n)
return log_oom(); return log_oom();
@@ -182,9 +180,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
if (r < 0) if (r < 0)
return r; return r;
implementation = sym_EVP_get_digestbyname(arg); implementation = sym_EVP_get_digestbyname(opts.arg);
if (!implementation) if (!implementation)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown bank '%s', refusing.", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown bank '%s', refusing.", opts.arg);
if (strv_extend(&arg_banks, sym_EVP_MD_get0_name(implementation)) < 0) if (strv_extend(&arg_banks, sym_EVP_MD_get0_name(implementation)) < 0)
return log_oom(); return log_oom();
@@ -196,11 +194,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
"Use specified TPM2 device"): { "Use specified TPM2 device"): {
_cleanup_free_ char *device = NULL; _cleanup_free_ char *device = NULL;
if (streq(arg, "list")) if (streq(opts.arg, "list"))
return tpm2_list_devices(/* legend= */ true, /* quiet= */ false); return tpm2_list_devices(/* legend= */ true, /* quiet= */ false);
if (!streq(arg, "auto")) { if (!streq(opts.arg, "auto")) {
device = strdup(arg); device = strdup(opts.arg);
if (!device) if (!device)
return log_oom(); return log_oom();
} }
@@ -210,7 +208,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
} }
OPTION_COMMON_PRIVATE_KEY("Private key (PEM) to sign with"): OPTION_COMMON_PRIVATE_KEY("Private key (PEM) to sign with"):
r = free_and_strdup_warn(&arg_private_key, arg); r = free_and_strdup_warn(&arg_private_key, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
@@ -218,7 +216,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_COMMON_PRIVATE_KEY_SOURCE: OPTION_COMMON_PRIVATE_KEY_SOURCE:
r = parse_openssl_key_source_argument( r = parse_openssl_key_source_argument(
arg, opts.arg,
&arg_private_key_source, &arg_private_key_source,
&arg_private_key_source_type); &arg_private_key_source_type);
if (r < 0) if (r < 0)
@@ -228,21 +226,21 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("public-key", "KEY", OPTION_LONG("public-key", "KEY",
"Public key (PEM) to validate against"): "Public key (PEM) to validate against"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_public_key); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_public_key);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_COMMON_CERTIFICATE("PEM certificate to use for signing"): OPTION_COMMON_CERTIFICATE("PEM certificate to use for signing"):
r = free_and_strdup_warn(&arg_certificate, arg); r = free_and_strdup_warn(&arg_certificate, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_COMMON_CERTIFICATE_SOURCE: OPTION_COMMON_CERTIFICATE_SOURCE:
r = parse_openssl_certificate_source_argument( r = parse_openssl_certificate_source_argument(
arg, opts.arg,
&arg_certificate_source, &arg_certificate_source,
&arg_certificate_source_type); &arg_certificate_source_type);
if (r < 0) if (r < 0)
@@ -250,7 +248,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_COMMON_JSON: OPTION_COMMON_JSON:
r = parse_json_argument(arg, &arg_json_format_flags); r = parse_json_argument(opts.arg, &arg_json_format_flags);
if (r <= 0) if (r <= 0)
return r; return r;
@@ -262,7 +260,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("append", "PATH", OPTION_LONG("append", "PATH",
"Load specified JSON signature, and append new signature to it"): "Load specified JSON signature, and append new signature to it"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_append); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_append);
if (r < 0) if (r < 0)
return r; return r;
@@ -301,9 +299,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
"Path to EFI firmware file (→ .efifw)"): {} "Path to EFI firmware file (→ .efifw)"): {}
/* Make sure that if new sections are added, the list here is updated. */ /* Make sure that if new sections are added, the list here is updated. */
assert_cc(UNIFIED_SECTION_EFIFW + 1 == _UNIFIED_SECTION_MAX); assert_cc(UNIFIED_SECTION_EFIFW + 1 == _UNIFIED_SECTION_MAX);
assert(opt->data < _UNIFIED_SECTION_MAX); assert(opts.opt->data < _UNIFIED_SECTION_MAX);
r = parse_path_argument(arg, /* suppress_root= */ false, arg_sections + opt->data); r = parse_path_argument(opts.arg, /* suppress_root= */ false, arg_sections + opts.opt->data);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -349,7 +347,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
log_debug("Measuring boot phases: %s", j); log_debug("Measuring boot phases: %s", j);
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+3 -3
View File
@@ -359,9 +359,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
FOREACH_OPTION(&state, c, /* arg= */ NULL, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -371,7 +371,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return version(); return version();
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+4 -5
View File
@@ -60,11 +60,10 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -74,13 +73,13 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
OPTION_LONG("kernel", "BOOL", "Mute kernel log output"): OPTION_LONG("kernel", "BOOL", "Mute kernel log output"):
r = parse_boolean_argument("--kernel=", arg, &arg_mute_kernel); r = parse_boolean_argument("--kernel=", opts.arg, &arg_mute_kernel);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("pid1", "BOOL", "Mute PID 1 status output"): OPTION_LONG("pid1", "BOOL", "Mute PID 1 status output"):
r = parse_boolean_argument("--pid1=", arg, &arg_mute_pid1); r = parse_boolean_argument("--pid1=", opts.arg, &arg_mute_pid1);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -172,10 +172,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -186,11 +185,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("root", "PATH", OPTION_LONG("root", "PATH",
"Operate on an alternate filesystem root"): "Operate on an alternate filesystem root"):
arg_root = arg; arg_root = opts.arg;
break; break;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+17 -18
View File
@@ -153,10 +153,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -184,28 +183,28 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
"Set main PID of daemon"): "Set main PID of daemon"):
pidref_done(&arg_pid); pidref_done(&arg_pid);
if (isempty(arg) || streq(arg, "auto")) if (isempty(opts.arg) || streq(opts.arg, "auto"))
r = pidref_parent_if_applicable(&arg_pid); r = pidref_parent_if_applicable(&arg_pid);
else if (streq(arg, "parent")) else if (streq(opts.arg, "parent"))
r = pidref_set_parent(&arg_pid); r = pidref_set_parent(&arg_pid);
else if (streq(arg, "self")) else if (streq(opts.arg, "self"))
r = pidref_set_self(&arg_pid); r = pidref_set_self(&arg_pid);
else else
r = pidref_set_pidstr(&arg_pid, arg); r = pidref_set_pidstr(&arg_pid, opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to refer to --pid='%s': %m", arg); return log_error_errno(r, "Failed to refer to --pid='%s': %m", opts.arg);
break; break;
OPTION_LONG("uid", "USER", "Set user to send from"): OPTION_LONG("uid", "USER", "Set user to send from"):
r = get_user_creds(&arg, &arg_uid, &arg_gid, NULL, NULL, 0); r = get_user_creds(&opts.arg, &arg_uid, &arg_gid, NULL, NULL, 0);
if (r == -ESRCH) /* If the user doesn't exist, then accept it anyway as numeric */ if (r == -ESRCH) /* If the user doesn't exist, then accept it anyway as numeric */
r = parse_uid(arg, &arg_uid); r = parse_uid(opts.arg, &arg_uid);
if (r < 0) if (r < 0)
return log_error_errno(r, "Can't resolve user %s: %m", arg); return log_error_errno(r, "Can't resolve user %s: %m", opts.arg);
break; break;
OPTION_LONG("status", "TEXT", "Set status text"): OPTION_LONG("status", "TEXT", "Set status text"):
arg_status = arg; arg_status = opts.arg;
break; break;
OPTION_LONG("booted", NULL, "Check if the system was booted up with systemd"): OPTION_LONG("booted", NULL, "Check if the system was booted up with systemd"):
@@ -223,9 +222,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("fd", "FD", "Pass specified file descriptor along with the message"): { OPTION_LONG("fd", "FD", "Pass specified file descriptor along with the message"): {
_cleanup_close_ int owned_fd = -EBADF; _cleanup_close_ int owned_fd = -EBADF;
int fdnr = parse_fd(arg); int fdnr = parse_fd(opts.arg);
if (fdnr < 0) if (fdnr < 0)
return log_error_errno(fdnr, "Failed to parse file descriptor: %s", arg); return log_error_errno(fdnr, "Failed to parse file descriptor: %s", opts.arg);
if (!passed) { if (!passed) {
/* Take possession of all passed fds */ /* Take possession of all passed fds */
@@ -259,10 +258,10 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
} }
OPTION_LONG("fdname", "NAME", "Name to assign to passed file descriptors"): OPTION_LONG("fdname", "NAME", "Name to assign to passed file descriptors"):
if (!fdname_is_valid(arg)) if (!fdname_is_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "File descriptor name invalid: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "File descriptor name invalid: %s", opts.arg);
if (free_and_strdup(&arg_fdname, arg) < 0) if (free_and_strdup(&arg_fdname, opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
@@ -278,7 +277,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
bool have_env = arg_ready || arg_stopping || arg_reloading || arg_status || pidref_is_set(&arg_pid) || !fdset_isempty(arg_fds); bool have_env = arg_ready || arg_stopping || arg_reloading || arg_status || pidref_is_set(&arg_pid) || !fdset_isempty(arg_fds);
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
switch (arg_action) { switch (arg_action) {
+129 -131
View File
@@ -602,11 +602,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv, OPTION_PARSER_STOP_AT_FIRST_NONOPTION }; OptionParser opts = { argc, argv, OPTION_PARSER_STOP_AT_FIRST_NONOPTION };
const Option *opt;
const char *arg;
FOREACH_OPTION_FULL(&state, c, &opt, &arg, /* on_error= */ return c) { FOREACH_OPTION(c, &opts, /* on_error= */ return c) {
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -630,19 +628,19 @@ static int parse_argv(int argc, char *argv[]) {
* trusted → read files, do not override cmdline, trust all * trusted → read files, do not override cmdline, trust all
*/ */
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) { if (r < 0) {
if (streq(arg, "trusted")) { if (streq(opts.arg, "trusted")) {
mask_all_settings = false; mask_all_settings = false;
mask_no_settings = false; mask_no_settings = false;
arg_settings_trusted = true; arg_settings_trusted = true;
} else if (streq(arg, "override")) { } else if (streq(opts.arg, "override")) {
mask_all_settings = false; mask_all_settings = false;
mask_no_settings = true; mask_no_settings = true;
arg_settings_trusted = -1; arg_settings_trusted = -1;
} else } else
return log_error_errno(r, "Failed to parse --settings= argument: %s", arg); return log_error_errno(r, "Failed to parse --settings= argument: %s", opts.arg);
} else if (r > 0) { } else if (r > 0) {
/* yes */ /* yes */
mask_all_settings = false; mask_all_settings = false;
@@ -668,7 +666,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_GROUP("Image"): {} OPTION_GROUP("Image"): {}
OPTION('D', "directory", "PATH", "Root directory for the container"): OPTION('D', "directory", "PATH", "Root directory for the container"):
r = parse_path_argument(arg, false, &arg_directory); r = parse_path_argument(opts.arg, false, &arg_directory);
if (r < 0) if (r < 0)
return r; return r;
arg_settings_mask |= SETTING_DIRECTORY; arg_settings_mask |= SETTING_DIRECTORY;
@@ -676,7 +674,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("template", "PATH", OPTION_LONG("template", "PATH",
"Initialize root directory from template directory, if missing"): "Initialize root directory from template directory, if missing"):
r = parse_path_argument(arg, false, &arg_template); r = parse_path_argument(opts.arg, false, &arg_template);
if (r < 0) if (r < 0)
return r; return r;
arg_settings_mask |= SETTING_DIRECTORY; arg_settings_mask |= SETTING_DIRECTORY;
@@ -690,27 +688,27 @@ static int parse_argv(int argc, char *argv[]) {
OPTION('i', "image", "PATH", OPTION('i', "image", "PATH",
"Root file system disk image (or device node) for the container"): "Root file system disk image (or device node) for the container"):
r = parse_path_argument(arg, false, &arg_image); r = parse_path_argument(opts.arg, false, &arg_image);
if (r < 0) if (r < 0)
return r; return r;
arg_settings_mask |= SETTING_DIRECTORY; arg_settings_mask |= SETTING_DIRECTORY;
break; break;
OPTION_LONG("image-policy", "POLICY", "Specify disk image dissection policy"): OPTION_LONG("image-policy", "POLICY", "Specify disk image dissection policy"):
r = parse_image_policy_argument(arg, &arg_image_policy); r = parse_image_policy_argument(opts.arg, &arg_image_policy);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("mstack", "PATH", /* help= */ NULL): OPTION_LONG("mstack", "PATH", /* help= */ NULL):
r = parse_path_argument(arg, false, &arg_mstack); r = parse_path_argument(opts.arg, false, &arg_mstack);
if (r < 0) if (r < 0)
return r; return r;
arg_settings_mask |= SETTING_DIRECTORY; arg_settings_mask |= SETTING_DIRECTORY;
break; break;
OPTION_LONG("oci-bundle", "PATH", "OCI bundle directory"): OPTION_LONG("oci-bundle", "PATH", "OCI bundle directory"):
r = parse_path_argument(arg, false, &arg_oci_bundle); r = parse_path_argument(opts.arg, false, &arg_oci_bundle);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -721,17 +719,17 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "volatile", "MODE", "Run the system in volatile mode"): OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "volatile", "MODE", "Run the system in volatile mode"):
if (!arg) if (!opts.arg)
arg_volatile_mode = VOLATILE_YES; arg_volatile_mode = VOLATILE_YES;
else if (streq(arg, "help")) else if (streq(opts.arg, "help"))
return DUMP_STRING_TABLE(volatile_mode, VolatileMode, _VOLATILE_MODE_MAX); return DUMP_STRING_TABLE(volatile_mode, VolatileMode, _VOLATILE_MODE_MAX);
else { else {
VolatileMode m; VolatileMode m;
m = volatile_mode_from_string(arg); m = volatile_mode_from_string(opts.arg);
if (m < 0) if (m < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Failed to parse --volatile= argument: %s", arg); "Failed to parse --volatile= argument: %s", opts.arg);
else else
arg_volatile_mode = m; arg_volatile_mode = m;
} }
@@ -741,11 +739,11 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("root-hash", "HASH", "Specify verity root hash for root disk image"): { OPTION_LONG("root-hash", "HASH", "Specify verity root hash for root disk image"): {
_cleanup_(iovec_done) struct iovec k = {}; _cleanup_(iovec_done) struct iovec k = {};
r = unhexmem(arg, &k.iov_base, &k.iov_len); r = unhexmem(opts.arg, &k.iov_base, &k.iov_len);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse root hash: %s", arg); return log_error_errno(r, "Failed to parse root hash: %s", opts.arg);
if (k.iov_len < sizeof(sd_id128_t)) if (k.iov_len < sizeof(sd_id128_t))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Root hash must be at least 128-bit long: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Root hash must be at least 128-bit long: %s", opts.arg);
iovec_done(&arg_verity_settings.root_hash); iovec_done(&arg_verity_settings.root_hash);
arg_verity_settings.root_hash = TAKE_STRUCT(k); arg_verity_settings.root_hash = TAKE_STRUCT(k);
@@ -757,15 +755,15 @@ static int parse_argv(int argc, char *argv[]) {
_cleanup_(iovec_done) struct iovec p = {}; _cleanup_(iovec_done) struct iovec p = {};
const char *value; const char *value;
if ((value = startswith(arg, "base64:"))) { if ((value = startswith(opts.arg, "base64:"))) {
r = unbase64mem(value, &p.iov_base, &p.iov_len); r = unbase64mem(value, &p.iov_base, &p.iov_len);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse root hash signature '%s': %m", arg); return log_error_errno(r, "Failed to parse root hash signature '%s': %m", opts.arg);
} else { } else {
r = read_full_file(arg, (char**) &p.iov_base, &p.iov_len); r = read_full_file(opts.arg, (char**) &p.iov_base, &p.iov_len);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse root hash signature file '%s': %m", arg); return log_error_errno(r, "Failed to parse root hash signature file '%s': %m", opts.arg);
} }
iovec_done(&arg_verity_settings.root_hash_sig); iovec_done(&arg_verity_settings.root_hash_sig);
@@ -774,16 +772,16 @@ static int parse_argv(int argc, char *argv[]) {
} }
OPTION_LONG("verity-data", "PATH", "Specify hash device for verity"): OPTION_LONG("verity-data", "PATH", "Specify hash device for verity"):
r = parse_path_argument(arg, false, &arg_verity_settings.data_path); r = parse_path_argument(opts.arg, false, &arg_verity_settings.data_path);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("pivot-root", "PATH[:PATH]", OPTION_LONG("pivot-root", "PATH[:PATH]",
"Pivot root to given directory in the container"): "Pivot root to given directory in the container"):
r = pivot_root_parse(&arg_pivot_root_new, &arg_pivot_root_old, arg); r = pivot_root_parse(&arg_pivot_root_new, &arg_pivot_root_old, opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --pivot-root= argument %s: %m", arg); return log_error_errno(r, "Failed to parse --pivot-root= argument %s: %m", opts.arg);
arg_settings_mask |= SETTING_PIVOT_ROOT; arg_settings_mask |= SETTING_PIVOT_ROOT;
break; break;
@@ -808,13 +806,13 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("chdir", "PATH", "Set working directory in the container"): { OPTION_LONG("chdir", "PATH", "Set working directory in the container"): {
_cleanup_free_ char *wd = NULL; _cleanup_free_ char *wd = NULL;
if (!path_is_absolute(arg)) if (!path_is_absolute(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Working directory %s is not an absolute path.", arg); "Working directory %s is not an absolute path.", opts.arg);
r = path_simplify_alloc(arg, &wd); r = path_simplify_alloc(opts.arg, &wd);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to simplify path %s: %m", arg); return log_error_errno(r, "Failed to simplify path %s: %m", opts.arg);
if (!path_is_normalized(wd)) if (!path_is_normalized(wd))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Working directory path is not normalized: %s", wd); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Working directory path is not normalized: %s", wd);
@@ -828,38 +826,38 @@ static int parse_argv(int argc, char *argv[]) {
} }
OPTION('E', "setenv", "NAME[=VALUE]", "Pass an environment variable to PID 1"): OPTION('E', "setenv", "NAME[=VALUE]", "Pass an environment variable to PID 1"):
r = strv_env_replace_strdup_passthrough(&arg_setenv, arg); r = strv_env_replace_strdup_passthrough(&arg_setenv, opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Cannot assign environment variable %s: %m", arg); return log_error_errno(r, "Cannot assign environment variable %s: %m", opts.arg);
arg_settings_mask |= SETTING_ENVIRONMENT; arg_settings_mask |= SETTING_ENVIRONMENT;
break; break;
OPTION('u', "uid", "USER", "Run the command under specified user or UID"): OPTION('u', "uid", "USER", "Run the command under specified user or UID"):
r = free_and_strdup(&arg_user, arg); r = free_and_strdup(&arg_user, opts.arg);
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
arg_settings_mask |= SETTING_USER; arg_settings_mask |= SETTING_USER;
break; break;
OPTION_LONG("kill-signal", "SIGNAL", "Select signal to use for shutting down PID 1"): OPTION_LONG("kill-signal", "SIGNAL", "Select signal to use for shutting down PID 1"):
if (streq(arg, "help")) if (streq(opts.arg, "help"))
return DUMP_STRING_TABLE(signal, int, _NSIG); return DUMP_STRING_TABLE(signal, int, _NSIG);
arg_kill_signal = signal_from_string(arg); arg_kill_signal = signal_from_string(opts.arg);
if (arg_kill_signal < 0) if (arg_kill_signal < 0)
return log_error_errno(arg_kill_signal, "Cannot parse signal: %s", arg); return log_error_errno(arg_kill_signal, "Cannot parse signal: %s", opts.arg);
arg_settings_mask |= SETTING_KILL_SIGNAL; arg_settings_mask |= SETTING_KILL_SIGNAL;
break; break;
OPTION_LONG("notify-ready", "BOOLEAN", "Receive notifications from the child init process"): OPTION_LONG("notify-ready", "BOOLEAN", "Receive notifications from the child init process"):
r = parse_boolean_argument("--notify-ready=", arg, &arg_notify_ready); r = parse_boolean_argument("--notify-ready=", opts.arg, &arg_notify_ready);
if (r < 0) if (r < 0)
return r; return r;
arg_settings_mask |= SETTING_NOTIFY_READY; arg_settings_mask |= SETTING_NOTIFY_READY;
break; break;
OPTION_LONG("suppress-sync", "BOOLEAN", "Suppress any form of disk data synchronization"): OPTION_LONG("suppress-sync", "BOOLEAN", "Suppress any form of disk data synchronization"):
r = parse_boolean_argument("--suppress-sync=", arg, &arg_suppress_sync); r = parse_boolean_argument("--suppress-sync=", opts.arg, &arg_suppress_sync);
if (r < 0) if (r < 0)
return r; return r;
arg_settings_mask |= SETTING_SUPPRESS_SYNC; arg_settings_mask |= SETTING_SUPPRESS_SYNC;
@@ -868,31 +866,31 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_GROUP("System Identity"): {} OPTION_GROUP("System Identity"): {}
OPTION('M', "machine", "NAME", "Set the machine name for the container"): OPTION('M', "machine", "NAME", "Set the machine name for the container"):
if (!isempty(arg) && !hostname_is_valid(arg, /* flags= */ 0)) if (!isempty(opts.arg) && !hostname_is_valid(opts.arg, /* flags= */ 0))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Invalid machine name: %s", arg); "Invalid machine name: %s", opts.arg);
r = free_and_strdup_warn(&arg_machine, arg); r = free_and_strdup_warn(&arg_machine, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("hostname", "NAME", "Override the hostname for the container"): OPTION_LONG("hostname", "NAME", "Override the hostname for the container"):
if (!isempty(arg) && !hostname_is_valid(arg, /* flags= */ 0)) if (!isempty(opts.arg) && !hostname_is_valid(opts.arg, /* flags= */ 0))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Invalid hostname: %s", arg); "Invalid hostname: %s", opts.arg);
r = free_and_strdup_warn(&arg_hostname, arg); r = free_and_strdup_warn(&arg_hostname, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
arg_settings_mask |= SETTING_HOSTNAME; arg_settings_mask |= SETTING_HOSTNAME;
break; break;
OPTION_LONG("uuid", "UUID", "Set a specific machine UUID for the container"): OPTION_LONG("uuid", "UUID", "Set a specific machine UUID for the container"):
r = id128_from_string_nonzero(arg, &arg_uuid); r = id128_from_string_nonzero(opts.arg, &arg_uuid);
if (r == -ENXIO) if (r == -ENXIO)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Machine UUID may not be all zeroes."); "Machine UUID may not be all zeroes.");
if (r < 0) if (r < 0)
return log_error_errno(r, "Invalid UUID: %s", arg); return log_error_errno(r, "Invalid UUID: %s", opts.arg);
arg_settings_mask |= SETTING_MACHINE_ID; arg_settings_mask |= SETTING_MACHINE_ID;
break; break;
@@ -901,7 +899,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION('S', "slice", "SLICE", "Place the container in the specified slice"): { OPTION('S', "slice", "SLICE", "Place the container in the specified slice"): {
_cleanup_free_ char *mangled = NULL; _cleanup_free_ char *mangled = NULL;
r = unit_name_mangle_with_suffix(arg, NULL, UNIT_NAME_MANGLE_WARN, ".slice", &mangled); r = unit_name_mangle_with_suffix(opts.arg, NULL, UNIT_NAME_MANGLE_WARN, ".slice", &mangled);
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
@@ -911,12 +909,12 @@ static int parse_argv(int argc, char *argv[]) {
} }
OPTION_LONG("property", "NAME=VALUE", "Set scope unit property"): OPTION_LONG("property", "NAME=VALUE", "Set scope unit property"):
if (strv_extend(&arg_property, arg) < 0) if (strv_extend(&arg_property, opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
OPTION_LONG("register", "BOOLEAN", "Register container as machine"): OPTION_LONG("register", "BOOLEAN", "Register container as machine"):
r = parse_tristate_argument_with_auto("--register=", arg, &arg_register); r = parse_tristate_argument_with_auto("--register=", opts.arg, &arg_register);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -930,7 +928,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "private-users", "MODE", OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "private-users", "MODE",
"Run within user namespace, configure UID/GID range"): "Run within user namespace, configure UID/GID range"):
r = parse_private_users(arg, &arg_userns_mode, &arg_uid_shift, &arg_uid_range); r = parse_private_users(opts.arg, &arg_userns_mode, &arg_uid_shift, &arg_uid_range);
if (r < 0) if (r < 0)
return r; return r;
arg_settings_mask |= SETTING_USERNS; arg_settings_mask |= SETTING_USERNS;
@@ -938,12 +936,12 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("private-users-ownership", "MODE", OPTION_LONG("private-users-ownership", "MODE",
"Adjust ('chown') or map ('map') OS tree ownership to private UID/GID range"): "Adjust ('chown') or map ('map') OS tree ownership to private UID/GID range"):
if (streq(arg, "help")) if (streq(opts.arg, "help"))
return DUMP_STRING_TABLE(user_namespace_ownership, UserNamespaceOwnership, _USER_NAMESPACE_OWNERSHIP_MAX); return DUMP_STRING_TABLE(user_namespace_ownership, UserNamespaceOwnership, _USER_NAMESPACE_OWNERSHIP_MAX);
arg_userns_ownership = user_namespace_ownership_from_string(arg); arg_userns_ownership = user_namespace_ownership_from_string(opts.arg);
if (arg_userns_ownership < 0) if (arg_userns_ownership < 0)
return log_error_errno(arg_userns_ownership, "Cannot parse --private-users-ownership= value: %s", arg); return log_error_errno(arg_userns_ownership, "Cannot parse --private-users-ownership= value: %s", opts.arg);
arg_settings_mask |= SETTING_USERNS; arg_settings_mask |= SETTING_USERNS;
break; break;
@@ -954,9 +952,9 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("private-users-delegate", "N", OPTION_LONG("private-users-delegate", "N",
"Delegate N additional 64K UID/GID ranges for use by nested containers"): "Delegate N additional 64K UID/GID ranges for use by nested containers"):
r = safe_atou(arg, &arg_delegate_container_ranges); r = safe_atou(opts.arg, &arg_delegate_container_ranges);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --private-users-delegate= parameter: %s", arg); return log_error_errno(r, "Failed to parse --private-users-delegate= parameter: %s", opts.arg);
arg_settings_mask |= SETTING_USERNS; arg_settings_mask |= SETTING_USERNS;
break; break;
@@ -979,7 +977,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("network-interface", "HOSTIF[:CONTAINERIF]", OPTION_LONG("network-interface", "HOSTIF[:CONTAINERIF]",
"Assign an existing network interface to the container"): "Assign an existing network interface to the container"):
r = interface_pair_parse(&arg_network_interfaces, arg); r = interface_pair_parse(&arg_network_interfaces, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
arg_private_network = true; arg_private_network = true;
@@ -988,7 +986,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("network-macvlan", "HOSTIF[:CONTAINERIF]", OPTION_LONG("network-macvlan", "HOSTIF[:CONTAINERIF]",
"Create a macvlan network interface based on an existing network interface to the container"): "Create a macvlan network interface based on an existing network interface to the container"):
r = macvlan_pair_parse(&arg_network_macvlan, arg); r = macvlan_pair_parse(&arg_network_macvlan, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
arg_private_network = true; arg_private_network = true;
@@ -997,7 +995,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("network-ipvlan", "HOSTIF[:CONTAINERIF]", OPTION_LONG("network-ipvlan", "HOSTIF[:CONTAINERIF]",
"Create an ipvlan network interface based on an existing network interface to the container"): "Create an ipvlan network interface based on an existing network interface to the container"):
r = ipvlan_pair_parse(&arg_network_ipvlan, arg); r = ipvlan_pair_parse(&arg_network_ipvlan, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
arg_private_network = true; arg_private_network = true;
@@ -1013,19 +1011,19 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("network-veth-extra", "HOSTIF[:CONTAINERIF]", OPTION_LONG("network-veth-extra", "HOSTIF[:CONTAINERIF]",
"Add an additional virtual Ethernet link between host and container"): "Add an additional virtual Ethernet link between host and container"):
r = veth_extra_parse(&arg_network_veth_extra, arg); r = veth_extra_parse(&arg_network_veth_extra, opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --network-veth-extra= parameter: %s", arg); return log_error_errno(r, "Failed to parse --network-veth-extra= parameter: %s", opts.arg);
arg_private_network = true; arg_private_network = true;
arg_settings_mask |= SETTING_NETWORK; arg_settings_mask |= SETTING_NETWORK;
break; break;
OPTION_LONG("network-bridge", "INTERFACE", OPTION_LONG("network-bridge", "INTERFACE",
"Add a virtual Ethernet connection to the container and attach it to an existing bridge on the host"): "Add a virtual Ethernet connection to the container and attach it to an existing bridge on the host"):
if (!ifname_valid(arg)) if (!ifname_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Bridge interface name not valid: %s", arg); "Bridge interface name not valid: %s", opts.arg);
r = free_and_strdup(&arg_network_bridge, arg); r = free_and_strdup(&arg_network_bridge, opts.arg);
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
arg_network_veth = true; arg_network_veth = true;
@@ -1037,7 +1035,7 @@ static int parse_argv(int argc, char *argv[]) {
"Similar, but attach the new interface to an automatically managed bridge interface"): { "Similar, but attach the new interface to an automatically managed bridge interface"): {
_cleanup_free_ char *j = NULL; _cleanup_free_ char *j = NULL;
j = strjoin("vz-", arg); j = strjoin("vz-", opts.arg);
if (!j) if (!j)
return log_oom(); return log_oom();
@@ -1054,7 +1052,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("network-namespace-path", "PATH", OPTION_LONG("network-namespace-path", "PATH",
"Set network namespace to the one represented by the specified kernel namespace file node"): "Set network namespace to the one represented by the specified kernel namespace file node"):
r = parse_path_argument(arg, false, &arg_network_namespace_path); r = parse_path_argument(opts.arg, false, &arg_network_namespace_path);
if (r < 0) if (r < 0)
return r; return r;
arg_settings_mask |= SETTING_NETWORK; arg_settings_mask |= SETTING_NETWORK;
@@ -1062,11 +1060,11 @@ static int parse_argv(int argc, char *argv[]) {
OPTION('p', "port", "[PROTOCOL:]HOSTPORT[:CONTAINERPORT]", OPTION('p', "port", "[PROTOCOL:]HOSTPORT[:CONTAINERPORT]",
"Expose a container IP port on the host"): "Expose a container IP port on the host"):
r = expose_port_parse(&arg_expose_ports, arg); r = expose_port_parse(&arg_expose_ports, opts.arg);
if (r == -EEXIST) if (r == -EEXIST)
return log_error_errno(r, "Duplicate port specification: %s", arg); return log_error_errno(r, "Duplicate port specification: %s", opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse host port %s: %m", arg); return log_error_errno(r, "Failed to parse host port %s: %m", opts.arg);
arg_settings_mask |= SETTING_EXPOSE_PORTS; arg_settings_mask |= SETTING_EXPOSE_PORTS;
break; break;
@@ -1077,11 +1075,11 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("drop-capability", "CAP", OPTION_LONG("drop-capability", "CAP",
"Drop the specified capability from the default set"): { "Drop the specified capability from the default set"): {
uint64_t m; uint64_t m;
r = parse_capability_spec(arg, &m); r = parse_capability_spec(opts.arg, &m);
if (r <= 0) if (r <= 0)
return r; return r;
if (streq(opt->long_code, "capability")) if (streq(opts.opt->long_code, "capability"))
plus |= m; plus |= m;
else else
minus |= m; minus |= m;
@@ -1092,7 +1090,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("ambient-capability", "CAP", OPTION_LONG("ambient-capability", "CAP",
"Sets the specified capability for the started process"): { "Sets the specified capability for the started process"): {
uint64_t m; uint64_t m;
r = parse_capability_spec(arg, &m); r = parse_capability_spec(opts.arg, &m);
if (r <= 0) if (r <= 0)
return r; return r;
arg_caps_ambient |= m; arg_caps_ambient |= m;
@@ -1102,7 +1100,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("no-new-privileges", "BOOL", OPTION_LONG("no-new-privileges", "BOOL",
"Set PR_SET_NO_NEW_PRIVS flag for container payload"): "Set PR_SET_NO_NEW_PRIVS flag for container payload"):
r = parse_boolean_argument("--no-new-privileges=", arg, &arg_no_new_privileges); r = parse_boolean_argument("--no-new-privileges=", opts.arg, &arg_no_new_privileges);
if (r < 0) if (r < 0)
return r; return r;
arg_settings_mask |= SETTING_NO_NEW_PRIVILEGES; arg_settings_mask |= SETTING_NO_NEW_PRIVILEGES;
@@ -1113,8 +1111,8 @@ static int parse_argv(int argc, char *argv[]) {
bool negative; bool negative;
const char *items; const char *items;
negative = arg[0] == '~'; negative = opts.arg[0] == '~';
items = negative ? arg + 1 : arg; items = negative ? opts.arg + 1 : opts.arg;
for (;;) { for (;;) {
_cleanup_free_ char *word = NULL; _cleanup_free_ char *word = NULL;
@@ -1148,12 +1146,12 @@ static int parse_argv(int argc, char *argv[]) {
OPTION('Z', "selinux-context", "SECLABEL", OPTION('Z', "selinux-context", "SECLABEL",
"Set the SELinux security context to be used by processes in the container"): "Set the SELinux security context to be used by processes in the container"):
arg_selinux_context = arg; arg_selinux_context = opts.arg;
break; break;
OPTION('L', "selinux-apifs-context", "SECLABEL", OPTION('L', "selinux-apifs-context", "SECLABEL",
"Set the SELinux security context to be used by API/tmpfs file systems in the container"): "Set the SELinux security context to be used by API/tmpfs file systems in the container"):
arg_selinux_apifs_context = arg; arg_selinux_apifs_context = opts.arg;
break; break;
OPTION_GROUP("Resources"): {} OPTION_GROUP("Resources"): {}
@@ -1163,15 +1161,15 @@ static int parse_argv(int argc, char *argv[]) {
_cleanup_free_ char *name = NULL; _cleanup_free_ char *name = NULL;
int rl; int rl;
if (streq(arg, "help")) if (streq(opts.arg, "help"))
return DUMP_STRING_TABLE(rlimit, int, _RLIMIT_MAX); return DUMP_STRING_TABLE(rlimit, int, _RLIMIT_MAX);
eq = strchr(arg, '='); eq = strchr(opts.arg, '=');
if (!eq) if (!eq)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"--rlimit= expects an '=' assignment."); "--rlimit= expects an '=' assignment.");
name = strndup(arg, eq - arg); name = strndup(opts.arg, eq - opts.arg);
if (!name) if (!name)
return log_oom(); return log_oom();
@@ -1194,9 +1192,9 @@ static int parse_argv(int argc, char *argv[]) {
} }
OPTION_LONG("oom-score-adjust", "VALUE", "Adjust the OOM score value for the payload"): OPTION_LONG("oom-score-adjust", "VALUE", "Adjust the OOM score value for the payload"):
r = parse_oom_score_adjust(arg, &arg_oom_score_adjust); r = parse_oom_score_adjust(opts.arg, &arg_oom_score_adjust);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --oom-score-adjust= parameter: %s", arg); return log_error_errno(r, "Failed to parse --oom-score-adjust= parameter: %s", opts.arg);
arg_oom_score_adjust_set = true; arg_oom_score_adjust_set = true;
arg_settings_mask |= SETTING_OOM_SCORE_ADJUST; arg_settings_mask |= SETTING_OOM_SCORE_ADJUST;
break; break;
@@ -1204,9 +1202,9 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("cpu-affinity", "CPUS", "Adjust the CPU affinity of the container"): { OPTION_LONG("cpu-affinity", "CPUS", "Adjust the CPU affinity of the container"): {
CPUSet cpuset; CPUSet cpuset;
r = parse_cpu_set(arg, &cpuset); r = parse_cpu_set(opts.arg, &cpuset);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse CPU affinity mask %s: %m", arg); return log_error_errno(r, "Failed to parse CPU affinity mask %s: %m", opts.arg);
cpu_set_done_and_replace(arg_cpu_set, cpuset); cpu_set_done_and_replace(arg_cpu_set, cpuset);
arg_settings_mask |= SETTING_CPU_AFFINITY; arg_settings_mask |= SETTING_CPU_AFFINITY;
@@ -1214,42 +1212,42 @@ static int parse_argv(int argc, char *argv[]) {
} }
OPTION_LONG("personality", "ARCH", "Pick personality for this container"): OPTION_LONG("personality", "ARCH", "Pick personality for this container"):
arg_personality = personality_from_string(arg); arg_personality = personality_from_string(opts.arg);
if (arg_personality == PERSONALITY_INVALID) if (arg_personality == PERSONALITY_INVALID)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Unknown or unsupported personality '%s'.", arg); "Unknown or unsupported personality '%s'.", opts.arg);
arg_settings_mask |= SETTING_PERSONALITY; arg_settings_mask |= SETTING_PERSONALITY;
break; break;
OPTION_GROUP("Integration"): {} OPTION_GROUP("Integration"): {}
OPTION_LONG("resolv-conf", "MODE", "Select mode of /etc/resolv.conf initialization"): OPTION_LONG("resolv-conf", "MODE", "Select mode of /etc/resolv.conf initialization"):
if (streq(arg, "help")) if (streq(opts.arg, "help"))
return DUMP_STRING_TABLE(resolv_conf_mode, ResolvConfMode, _RESOLV_CONF_MODE_MAX); return DUMP_STRING_TABLE(resolv_conf_mode, ResolvConfMode, _RESOLV_CONF_MODE_MAX);
arg_resolv_conf = resolv_conf_mode_from_string(arg); arg_resolv_conf = resolv_conf_mode_from_string(opts.arg);
if (arg_resolv_conf < 0) if (arg_resolv_conf < 0)
return log_error_errno(arg_resolv_conf, return log_error_errno(arg_resolv_conf,
"Failed to parse /etc/resolv.conf mode: %s", arg); "Failed to parse /etc/resolv.conf mode: %s", opts.arg);
arg_settings_mask |= SETTING_RESOLV_CONF; arg_settings_mask |= SETTING_RESOLV_CONF;
break; break;
OPTION_LONG("timezone", "MODE", "Select mode of /etc/localtime initialization"): OPTION_LONG("timezone", "MODE", "Select mode of /etc/localtime initialization"):
if (streq(arg, "help")) if (streq(opts.arg, "help"))
return DUMP_STRING_TABLE(timezone_mode, TimezoneMode, _TIMEZONE_MODE_MAX); return DUMP_STRING_TABLE(timezone_mode, TimezoneMode, _TIMEZONE_MODE_MAX);
arg_timezone = timezone_mode_from_string(arg); arg_timezone = timezone_mode_from_string(opts.arg);
if (arg_timezone < 0) if (arg_timezone < 0)
return log_error_errno(arg_timezone, return log_error_errno(arg_timezone,
"Failed to parse /etc/localtime mode: %s", arg); "Failed to parse /etc/localtime mode: %s", opts.arg);
arg_settings_mask |= SETTING_TIMEZONE; arg_settings_mask |= SETTING_TIMEZONE;
break; break;
OPTION_LONG("link-journal", "MODE", OPTION_LONG("link-journal", "MODE",
"Link up guest journal, one of no, auto, guest, host, try-guest, try-host"): "Link up guest journal, one of no, auto, guest, host, try-guest, try-host"):
r = parse_link_journal(arg, &arg_link_journal, &arg_link_journal_try); r = parse_link_journal(opts.arg, &arg_link_journal, &arg_link_journal_try);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse link journal mode %s", arg); return log_error_errno(r, "Failed to parse link journal mode %s", opts.arg);
arg_settings_mask |= SETTING_LINK_JOURNAL; arg_settings_mask |= SETTING_LINK_JOURNAL;
break; break;
@@ -1260,31 +1258,31 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("forward-journal", "FILE|DIR", "Forward the container's journal to the host"): OPTION_LONG("forward-journal", "FILE|DIR", "Forward the container's journal to the host"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_forward_journal); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_forward_journal);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("forward-journal-max-use", "BYTES", "Maximum disk space for forwarded journal"): OPTION_LONG("forward-journal-max-use", "BYTES", "Maximum disk space for forwarded journal"):
r = parse_size(arg, 1024, &arg_forward_journal_max_use); r = parse_size(opts.arg, 1024, &arg_forward_journal_max_use);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --forward-journal-max-use= value: %s", optarg); return log_error_errno(r, "Failed to parse --forward-journal-max-use= value: %s", optarg);
break; break;
OPTION_LONG("forward-journal-keep-free", "BYTES", "Minimum disk space to keep free"): OPTION_LONG("forward-journal-keep-free", "BYTES", "Minimum disk space to keep free"):
r = parse_size(arg, 1024, &arg_forward_journal_keep_free); r = parse_size(opts.arg, 1024, &arg_forward_journal_keep_free);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --forward-journal-keep-free= value: %s", optarg); return log_error_errno(r, "Failed to parse --forward-journal-keep-free= value: %s", optarg);
break; break;
OPTION_LONG("forward-journal-max-file-size", "BYTES", "Maximum size of individual journal files"): OPTION_LONG("forward-journal-max-file-size", "BYTES", "Maximum size of individual journal files"):
r = parse_size(arg, 1024, &arg_forward_journal_max_file_size); r = parse_size(opts.arg, 1024, &arg_forward_journal_max_file_size);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --forward-journal-max-file-size= value: %s", optarg); return log_error_errno(r, "Failed to parse --forward-journal-max-file-size= value: %s", optarg);
break; break;
OPTION_LONG("forward-journal-max-files", "N", "Maximum number of journal files to keep"): OPTION_LONG("forward-journal-max-files", "N", "Maximum number of journal files to keep"):
r = safe_atou64(arg, &arg_forward_journal_max_files); r = safe_atou64(opts.arg, &arg_forward_journal_max_files);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --forward-journal-max-files= value: %s", optarg); return log_error_errno(r, "Failed to parse --forward-journal-max-files= value: %s", optarg);
break; break;
@@ -1295,26 +1293,26 @@ static int parse_argv(int argc, char *argv[]) {
"Bind mount a file or directory from the host into the container"): {} "Bind mount a file or directory from the host into the container"): {}
OPTION_LONG("bind-ro", "PATH[:PATH[:OPTIONS]]", OPTION_LONG("bind-ro", "PATH[:PATH[:OPTIONS]]",
"Similar, but creates a read-only bind mount"): "Similar, but creates a read-only bind mount"):
r = bind_mount_parse(&arg_custom_mounts, &arg_n_custom_mounts, arg, r = bind_mount_parse(&arg_custom_mounts, &arg_n_custom_mounts, opts.arg,
streq(opt->long_code, "bind-ro")); streq(opts.opt->long_code, "bind-ro"));
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --bind(-ro)= argument %s: %m", arg); return log_error_errno(r, "Failed to parse --bind(-ro)= argument %s: %m", opts.arg);
arg_settings_mask |= SETTING_CUSTOM_MOUNTS; arg_settings_mask |= SETTING_CUSTOM_MOUNTS;
break; break;
OPTION_LONG("inaccessible", "PATH", OPTION_LONG("inaccessible", "PATH",
"Over-mount file node with inaccessible node to mask it"): "Over-mount file node with inaccessible node to mask it"):
r = inaccessible_mount_parse(&arg_custom_mounts, &arg_n_custom_mounts, arg); r = inaccessible_mount_parse(&arg_custom_mounts, &arg_n_custom_mounts, opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --inaccessible= argument %s: %m", arg); return log_error_errno(r, "Failed to parse --inaccessible= argument %s: %m", opts.arg);
arg_settings_mask |= SETTING_CUSTOM_MOUNTS; arg_settings_mask |= SETTING_CUSTOM_MOUNTS;
break; break;
OPTION_LONG("tmpfs", "PATH:[OPTIONS]", OPTION_LONG("tmpfs", "PATH:[OPTIONS]",
"Mount an empty tmpfs to the specified directory"): "Mount an empty tmpfs to the specified directory"):
r = tmpfs_mount_parse(&arg_custom_mounts, &arg_n_custom_mounts, arg); r = tmpfs_mount_parse(&arg_custom_mounts, &arg_n_custom_mounts, opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --tmpfs= argument %s: %m", arg); return log_error_errno(r, "Failed to parse --tmpfs= argument %s: %m", opts.arg);
arg_settings_mask |= SETTING_CUSTOM_MOUNTS; arg_settings_mask |= SETTING_CUSTOM_MOUNTS;
break; break;
@@ -1322,19 +1320,19 @@ static int parse_argv(int argc, char *argv[]) {
"Create an overlay mount from the host to the container"): {} "Create an overlay mount from the host to the container"): {}
OPTION_LONG("overlay-ro", "PATH[:PATH...]:PATH", OPTION_LONG("overlay-ro", "PATH[:PATH...]:PATH",
"Similar, but creates a read-only overlay mount"): "Similar, but creates a read-only overlay mount"):
r = overlay_mount_parse(&arg_custom_mounts, &arg_n_custom_mounts, arg, r = overlay_mount_parse(&arg_custom_mounts, &arg_n_custom_mounts, opts.arg,
streq(opt->long_code, "overlay-ro")); streq(opts.opt->long_code, "overlay-ro"));
if (r == -EADDRNOTAVAIL) if (r == -EADDRNOTAVAIL)
return log_error_errno(r, "--overlay(-ro)= needs at least two colon-separated directories specified."); return log_error_errno(r, "--overlay(-ro)= needs at least two colon-separated directories specified.");
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --overlay(-ro)= argument %s: %m", arg); return log_error_errno(r, "Failed to parse --overlay(-ro)= argument %s: %m", opts.arg);
arg_settings_mask |= SETTING_CUSTOM_MOUNTS; arg_settings_mask |= SETTING_CUSTOM_MOUNTS;
break; break;
OPTION_LONG("bind-user", "NAME", "Bind user from host to container"): OPTION_LONG("bind-user", "NAME", "Bind user from host to container"):
if (!valid_user_group_name(arg, 0)) if (!valid_user_group_name(opts.arg, 0))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid user name to bind: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid user name to bind: %s", opts.arg);
if (strv_extend(&arg_bind_user, arg) < 0) if (strv_extend(&arg_bind_user, opts.arg) < 0)
return log_oom(); return log_oom();
arg_settings_mask |= SETTING_BIND_USER; arg_settings_mask |= SETTING_BIND_USER;
break; break;
@@ -1343,11 +1341,11 @@ static int parse_argv(int argc, char *argv[]) {
"Configure the shell to use for --bind-user= users"): { "Configure the shell to use for --bind-user= users"): {
bool copy = false; bool copy = false;
char *sh = NULL; char *sh = NULL;
r = parse_user_shell(arg, &sh, &copy); r = parse_user_shell(opts.arg, &sh, &copy);
if (r == -ENOMEM) if (r == -ENOMEM)
return log_oom(); return log_oom();
if (r < 0) if (r < 0)
return log_error_errno(r, "Invalid user shell to bind: %s", arg); return log_error_errno(r, "Invalid user shell to bind: %s", opts.arg);
free_and_replace(arg_bind_user_shell, sh); free_and_replace(arg_bind_user_shell, sh);
arg_bind_user_shell_copy = copy; arg_bind_user_shell_copy = copy;
@@ -1357,9 +1355,9 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("bind-user-group", "GROUP", OPTION_LONG("bind-user-group", "GROUP",
"Add an auxiliary group to --bind-user= users"): "Add an auxiliary group to --bind-user= users"):
if (!valid_user_group_name(arg, /* flags= */ 0)) if (!valid_user_group_name(opts.arg, /* flags= */ 0))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid bind user auxiliary group name: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid bind user auxiliary group name: %s", opts.arg);
if (strv_extend(&arg_bind_user_groups, arg) < 0) if (strv_extend(&arg_bind_user_groups, opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
@@ -1367,12 +1365,12 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("console", "MODE", OPTION_LONG("console", "MODE",
"Select how stdin/stdout/stderr and /dev/console are set up for the container"): "Select how stdin/stdout/stderr and /dev/console are set up for the container"):
if (streq(arg, "help")) if (streq(opts.arg, "help"))
return DUMP_STRING_TABLE(console_mode, ConsoleMode, _CONSOLE_MODE_MAX); return DUMP_STRING_TABLE(console_mode, ConsoleMode, _CONSOLE_MODE_MAX);
arg_console_mode = console_mode_from_string(arg); arg_console_mode = console_mode_from_string(opts.arg);
if (arg_console_mode < 0) if (arg_console_mode < 0)
return log_error_errno(arg_console_mode, "Unknown console mode: %s", arg); return log_error_errno(arg_console_mode, "Unknown console mode: %s", opts.arg);
arg_settings_mask |= SETTING_CONSOLE_MODE; arg_settings_mask |= SETTING_CONSOLE_MODE;
break; break;
@@ -1382,7 +1380,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("background", "COLOR", "Set ANSI color for background"): OPTION_LONG("background", "COLOR", "Set ANSI color for background"):
r = parse_background_argument(arg, &arg_background); r = parse_background_argument(opts.arg, &arg_background);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -1391,7 +1389,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("set-credential", "ID:VALUE", OPTION_LONG("set-credential", "ID:VALUE",
"Pass a credential with literal value to container"): "Pass a credential with literal value to container"):
r = machine_credential_set(&arg_credentials, arg); r = machine_credential_set(&arg_credentials, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
arg_settings_mask |= SETTING_CREDENTIALS; arg_settings_mask |= SETTING_CREDENTIALS;
@@ -1399,7 +1397,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("load-credential", "ID:PATH", OPTION_LONG("load-credential", "ID:PATH",
"Load credential to pass to container from file or AF_UNIX stream socket"): "Load credential to pass to container from file or AF_UNIX stream socket"):
r = machine_credential_load(&arg_credentials, arg); r = machine_credential_load(&arg_credentials, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
arg_settings_mask |= SETTING_CREDENTIALS; arg_settings_mask |= SETTING_CREDENTIALS;
@@ -1413,24 +1411,24 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "user", "NAME", "Run in the user service manager scope"): OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "user", "NAME", "Run in the user service manager scope"):
if (arg) if (opts.arg)
/* --user=NAME is a deprecated alias for --uid=NAME */ /* --user=NAME is a deprecated alias for --uid=NAME */
log_warning("--user=NAME is deprecated, use --uid=NAME instead."); log_warning("--user=NAME is deprecated, use --uid=NAME instead.");
else { else {
/* --user= used to require an argument (the container user to run as). It has /* --user= used to require an argument (the container user to run as). It has
* been repurposed to optionally set the runtime scope, with --uid= replacing * been repurposed to optionally set the runtime scope, with --uid= replacing
* the old container user functionality. To maintain backwards compatibility * the old container user functionality. To maintain backwards compatibility
* with the space-separated form (--user NAME), if the next arg does not look * with the space-separated form (--user NAME), if the next opts.arg does not look
* like an option, interpret it as a user name. */ * like an option, interpret it as a user name. */
const char *t = option_parser_next_arg(&state); const char *t = option_parser_next_arg(&opts);
if (t && t[0] != '-') { if (t && t[0] != '-') {
arg = option_parser_consume_next_arg(&state); opts.arg = option_parser_consume_next_arg(&opts);
log_warning("--user NAME is deprecated, use --uid=NAME instead."); log_warning("--user NAME is deprecated, use --uid=NAME instead.");
} }
} }
if (arg) { if (opts.arg) {
r = free_and_strdup(&arg_user, arg); r = free_and_strdup(&arg_user, opts.arg);
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
arg_settings_mask |= SETTING_USER; arg_settings_mask |= SETTING_USER;
@@ -1444,7 +1442,7 @@ static int parse_argv(int argc, char *argv[]) {
} }
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (!strv_isempty(args)) { if (!strv_isempty(args)) {
strv_free(arg_parameters); strv_free(arg_parameters);
arg_parameters = strv_copy(args); arg_parameters = strv_copy(args);
+3 -4
View File
@@ -91,10 +91,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -108,7 +107,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+4 -5
View File
@@ -51,10 +51,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -72,12 +71,12 @@ static int parse_argv(int argc, char *argv[]) {
"Write D-Bus XML introspection data"): "Write D-Bus XML introspection data"):
return bus_introspect_implementations( return bus_introspect_implementations(
stdout, stdout,
arg, opts.arg,
BUS_IMPLEMENTATIONS(&manager_object, BUS_IMPLEMENTATIONS(&manager_object,
&log_control_object)); &log_control_object));
} }
if (option_parser_get_n_args(&state) > 0) if (option_parser_get_n_args(&opts) > 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"This program takes no arguments."); "This program takes no arguments.");
+4 -5
View File
@@ -204,10 +204,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -217,7 +216,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return version(); return version();
OPTION_LONG("suffix", "SUFFIX", "Suffix to append to paths"): OPTION_LONG("suffix", "SUFFIX", "Suffix to append to paths"):
arg_suffix = arg; arg_suffix = opts.arg;
break; break;
OPTION_COMMON_NO_PAGER: OPTION_COMMON_NO_PAGER:
@@ -225,7 +224,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+18 -19
View File
@@ -81,11 +81,10 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -101,9 +100,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
if (r < 0) if (r < 0)
return r; return r;
implementation = sym_EVP_get_digestbyname(arg); implementation = sym_EVP_get_digestbyname(opts.arg);
if (!implementation) if (!implementation)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown bank '%s', refusing.", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown bank '%s', refusing.", opts.arg);
if (strv_extend(&arg_banks, sym_EVP_MD_get0_name(implementation)) < 0) if (strv_extend(&arg_banks, sym_EVP_MD_get0_name(implementation)) < 0)
return log_oom(); return log_oom();
@@ -112,23 +111,23 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
} }
OPTION_LONG("pcr", "INDEX", "Select TPM PCR index (0…23)"): OPTION_LONG("pcr", "INDEX", "Select TPM PCR index (0…23)"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_pcr_mask = 0; arg_pcr_mask = 0;
break; break;
} }
r = tpm2_pcr_index_from_string(arg); r = tpm2_pcr_index_from_string(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse PCR index: %s", arg); return log_error_errno(r, "Failed to parse PCR index: %s", opts.arg);
arg_pcr_mask |= INDEX_TO_MASK(uint32_t, r); arg_pcr_mask |= INDEX_TO_MASK(uint32_t, r);
break; break;
OPTION_LONG("nvpcr", "NAME", "Select TPM PCR mode nvindex name"): OPTION_LONG("nvpcr", "NAME", "Select TPM PCR mode nvindex name"):
if (!tpm2_nvpcr_name_is_valid(arg)) if (!tpm2_nvpcr_name_is_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "NvPCR name is not valid: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "NvPCR name is not valid: %s", opts.arg);
r = free_and_strdup_warn(&arg_nvpcr_name, arg); r = free_and_strdup_warn(&arg_nvpcr_name, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -136,11 +135,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("tpm2-device", "PATH", "Use specified TPM2 device"): { OPTION_LONG("tpm2-device", "PATH", "Use specified TPM2 device"): {
_cleanup_free_ char *device = NULL; _cleanup_free_ char *device = NULL;
if (streq(arg, "list")) if (streq(opts.arg, "list"))
return tpm2_list_devices(/* legend= */ true, /* quiet= */ false); return tpm2_list_devices(/* legend= */ true, /* quiet= */ false);
if (!streq(arg, "auto")) { if (!streq(opts.arg, "auto")) {
device = strdup(arg); device = strdup(opts.arg);
if (!device) if (!device)
return log_oom(); return log_oom();
} }
@@ -156,7 +155,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("file-system", "PATH", OPTION_LONG("file-system", "PATH",
"Measure UUID/labels of file system into PCR 15"): "Measure UUID/labels of file system into PCR 15"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_file_system); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_file_system);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -177,12 +176,12 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("event-type", "TYPE", OPTION_LONG("event-type", "TYPE",
"Event type to include in the event log"): "Event type to include in the event log"):
if (streq(arg, "help")) if (streq(opts.arg, "help"))
return DUMP_STRING_TABLE(tpm2_userspace_event_type, Tpm2UserspaceEventType, _TPM2_USERSPACE_EVENT_TYPE_MAX); return DUMP_STRING_TABLE(tpm2_userspace_event_type, Tpm2UserspaceEventType, _TPM2_USERSPACE_EVENT_TYPE_MAX);
arg_event_type = tpm2_userspace_event_type_from_string(arg); arg_event_type = tpm2_userspace_event_type_from_string(opts.arg);
if (arg_event_type < 0) if (arg_event_type < 0)
return log_error_errno(arg_event_type, "Failed to parse --event-type= argument: %s", arg); return log_error_errno(arg_event_type, "Failed to parse --event-type= argument: %s", opts.arg);
break; break;
} }
@@ -208,7 +207,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return r; return r;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+22 -23
View File
@@ -5189,12 +5189,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
bool auto_location = true; bool auto_location = true;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -5208,7 +5207,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_COMMON_JSON: OPTION_COMMON_JSON:
r = parse_json_argument(arg, &arg_json_format_flags); r = parse_json_argument(opts.arg, &arg_json_format_flags);
if (r <= 0) if (r <= 0)
return r; return r;
break; break;
@@ -5220,21 +5219,21 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("pcr", "NR", OPTION_LONG("pcr", "NR",
"Generate .pcrlock for specified PCR"): "Generate .pcrlock for specified PCR"):
r = tpm2_parse_pcr_argument_to_mask(arg, &arg_pcr_mask); r = tpm2_parse_pcr_argument_to_mask(opts.arg, &arg_pcr_mask);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse PCR specification: %s", arg); return log_error_errno(r, "Failed to parse PCR specification: %s", opts.arg);
break; break;
OPTION_LONG("nv-index", "NUMBER", OPTION_LONG("nv-index", "NUMBER",
"Use the specified NV index, instead of a random one"): "Use the specified NV index, instead of a random one"):
if (isempty(arg)) if (isempty(opts.arg))
arg_nv_index = 0; arg_nv_index = 0;
else { else {
uint32_t u; uint32_t u;
r = safe_atou32_full(arg, 16, &u); r = safe_atou32_full(opts.arg, 16, &u);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --nv-index= argument: %s", arg); return log_error_errno(r, "Failed to parse --nv-index= argument: %s", opts.arg);
if (u < TPM2_NV_INDEX_FIRST || u > TPM2_NV_INDEX_LAST) if (u < TPM2_NV_INDEX_FIRST || u > TPM2_NV_INDEX_LAST)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Argument for --nv-index= outside of valid range 0x%" PRIx32 "…0x%" PRIx32 ": 0x%" PRIx32, return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Argument for --nv-index= outside of valid range 0x%" PRIx32 "…0x%" PRIx32 ": 0x%" PRIx32,
@@ -5248,7 +5247,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
"Directory to read .pcrlock files from"): { "Directory to read .pcrlock files from"): {
_cleanup_free_ char *p = NULL; _cleanup_free_ char *p = NULL;
r = parse_path_argument(arg, /* suppress_root= */ false, &p); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &p);
if (r < 0) if (r < 0)
return r; return r;
@@ -5266,15 +5265,15 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
auto_location = false; auto_location = false;
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_location_start = mfree(arg_location_start); arg_location_start = mfree(arg_location_start);
arg_location_end = mfree(arg_location_end); arg_location_end = mfree(arg_location_end);
break; break;
} }
e = strchr(arg, ':'); e = strchr(opts.arg, ':');
if (e) { if (e) {
start = strndup(arg, e - arg); start = strndup(opts.arg, e - opts.arg);
if (!start) if (!start)
return log_oom(); return log_oom();
@@ -5282,11 +5281,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
if (!end) if (!end)
return log_oom(); return log_oom();
} else { } else {
start = strdup(arg); start = strdup(opts.arg);
if (!start) if (!start)
return log_oom(); return log_oom();
end = strdup(arg); end = strdup(opts.arg);
if (!end) if (!end)
return log_oom(); return log_oom();
} }
@@ -5303,17 +5302,17 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("recovery-pin", "MODE", OPTION_LONG("recovery-pin", "MODE",
"Controls whether to show, hide, or ask for a recovery PIN"): "Controls whether to show, hide, or ask for a recovery PIN"):
arg_recovery_pin = recovery_pin_mode_from_string(arg); arg_recovery_pin = recovery_pin_mode_from_string(opts.arg);
if (arg_recovery_pin < 0) if (arg_recovery_pin < 0)
return log_error_errno(arg_recovery_pin, "Failed to parse --recovery-pin= mode: %s", arg); return log_error_errno(arg_recovery_pin, "Failed to parse --recovery-pin= mode: %s", opts.arg);
break; break;
OPTION_LONG("pcrlock", "PATH", OPTION_LONG("pcrlock", "PATH",
".pcrlock file to write expected PCR measurement to"): ".pcrlock file to write expected PCR measurement to"):
if (empty_or_dash(arg)) if (empty_or_dash(opts.arg))
arg_pcrlock_path = mfree(arg_pcrlock_path); arg_pcrlock_path = mfree(arg_pcrlock_path);
else { else {
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_pcrlock_path); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_pcrlock_path);
if (r < 0) if (r < 0)
return r; return r;
} }
@@ -5323,10 +5322,10 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("policy", "PATH", OPTION_LONG("policy", "PATH",
"JSON file to write policy output to"): "JSON file to write policy output to"):
if (empty_or_dash(arg)) if (empty_or_dash(opts.arg))
arg_policy_path = mfree(arg_policy_path); arg_policy_path = mfree(arg_policy_path);
else { else {
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_policy_path); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_policy_path);
if (r < 0) if (r < 0)
return r; return r;
} }
@@ -5341,7 +5340,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("entry-token", "TOKEN", OPTION_LONG("entry-token", "TOKEN",
"Boot entry token to use for this installation " "Boot entry token to use for this installation "
"(machine-id, os-id, os-image-id, auto, literal:…)"): "(machine-id, os-id, os-image-id, auto, literal:…)"):
r = parse_boot_entry_token_type(arg, &arg_entry_token_type, &arg_entry_token); r = parse_boot_entry_token_type(opts.arg, &arg_entry_token_type, &arg_entry_token);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -5372,7 +5371,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
arg_pager_flags |= PAGER_DISABLE; arg_pager_flags |= PAGER_DISABLE;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+6 -7
View File
@@ -62,11 +62,10 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
assert(argv); assert(argv);
assert(remaining_args); assert(remaining_args);
OptionParser state = { argc, argv, OPTION_PARSER_STOP_AT_FIRST_NONOPTION }; OptionParser opts = { argc, argv, OPTION_PARSER_STOP_AT_FIRST_NONOPTION };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -84,22 +83,22 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
break; break;
OPTION_LONG("background", "COLOR", "Set ANSI color for background"): OPTION_LONG("background", "COLOR", "Set ANSI color for background"):
r = parse_background_argument(arg, &arg_background); r = parse_background_argument(opts.arg, &arg_background);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("title", "TITLE", "Set terminal title"): OPTION_LONG("title", "TITLE", "Set terminal title"):
r = free_and_strdup_warn(&arg_title, arg); r = free_and_strdup_warn(&arg_title, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
} }
if (option_parser_get_n_args(&state) == 0) if (option_parser_get_n_args(&opts) == 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected command line, refusing."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected command line, refusing.");
*remaining_args = option_parser_get_args(&state); *remaining_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+3 -4
View File
@@ -349,11 +349,10 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -363,7 +362,7 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
} }
r = dispatch_verb_with_args(option_parser_get_args(&state), NULL); r = dispatch_verb_with_args(option_parser_get_args(&opts), NULL);
if (r < 0) if (r < 0)
return r; return r;
+71 -72
View File
@@ -9684,12 +9684,11 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
bool auto_public_key_pcr_mask = true, auto_pcrlock = true; bool auto_public_key_pcr_mask = true, auto_pcrlock = true;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_GROUP("Options"): {} OPTION_GROUP("Options"): {}
@@ -9712,41 +9711,41 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("dry-run", "BOOL", OPTION_LONG("dry-run", "BOOL",
"Whether to run dry-run operation"): "Whether to run dry-run operation"):
r = parse_boolean_argument("--dry-run=", arg, &arg_dry_run); r = parse_boolean_argument("--dry-run=", opts.arg, &arg_dry_run);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("empty", "MODE", OPTION_LONG("empty", "MODE",
"How to handle empty disks lacking partition tables (refuse, allow, require, force, create)"): "How to handle empty disks lacking partition tables (refuse, allow, require, force, create)"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_empty = EMPTY_UNSET; arg_empty = EMPTY_UNSET;
break; break;
} }
arg_empty = empty_mode_from_string(arg); arg_empty = empty_mode_from_string(opts.arg);
if (arg_empty < 0) if (arg_empty < 0)
return log_error_errno(arg_empty, "Failed to parse --empty= parameter: %s", arg); return log_error_errno(arg_empty, "Failed to parse --empty= parameter: %s", opts.arg);
break; break;
OPTION_LONG("offline", "BOOL", OPTION_LONG("offline", "BOOL",
"Whether to build the image offline"): "Whether to build the image offline"):
r = parse_tristate_argument_with_auto("--offline=", arg, &arg_offline); r = parse_tristate_argument_with_auto("--offline=", opts.arg, &arg_offline);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("discard", "BOOL", OPTION_LONG("discard", "BOOL",
"Whether to discard backing blocks for new partitions"): "Whether to discard backing blocks for new partitions"):
r = parse_boolean_argument("--discard=", arg, &arg_discard); r = parse_boolean_argument("--discard=", opts.arg, &arg_discard);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("sector-size", "SIZE", OPTION_LONG("sector-size", "SIZE",
"Set the logical sector size for the image"): "Set the logical sector size for the image"):
r = parse_sector_size(arg, &arg_sector_size); r = parse_sector_size(opts.arg, &arg_sector_size);
if (r < 0) if (r < 0)
return r; return r;
@@ -9754,9 +9753,9 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("grain-size", "BYTES", OPTION_LONG("grain-size", "BYTES",
"Set the grain size for partition alignment"): "Set the grain size for partition alignment"):
r = parse_size(arg, 1024, &arg_grain_size); r = parse_size(opts.arg, 1024, &arg_grain_size);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --grain-size= parameter: %s", arg); return log_error_errno(r, "Failed to parse --grain-size= parameter: %s", opts.arg);
if (arg_grain_size < 512 || !ISPOWEROF2(arg_grain_size)) if (arg_grain_size < 512 || !ISPOWEROF2(arg_grain_size))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Grain size must be a power of 2 >= 512."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Grain size must be a power of 2 >= 512.");
@@ -9764,9 +9763,9 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("architecture", "ARCH", OPTION_LONG("architecture", "ARCH",
"Set the generic architecture for the image"): "Set the generic architecture for the image"):
r = architecture_from_string(arg); r = architecture_from_string(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid architecture '%s'.", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid architecture '%s'.", opts.arg);
arg_architecture = r; arg_architecture = r;
break; break;
@@ -9775,15 +9774,15 @@ static int parse_argv(int argc, char *argv[]) {
"Grow loopback file to specified size"): { "Grow loopback file to specified size"): {
uint64_t parsed, rounded; uint64_t parsed, rounded;
if (streq(arg, "auto")) { if (streq(opts.arg, "auto")) {
arg_size = UINT64_MAX; arg_size = UINT64_MAX;
arg_size_auto = true; arg_size_auto = true;
break; break;
} }
r = parse_size(arg, 1024, &parsed); r = parse_size(opts.arg, 1024, &parsed);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --size= parameter: %s", arg); return log_error_errno(r, "Failed to parse --size= parameter: %s", opts.arg);
rounded = round_up_size(parsed, 4096); rounded = round_up_size(parsed, 4096);
if (rounded == 0) if (rounded == 0)
@@ -9802,15 +9801,15 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("seed", "UUID", OPTION_LONG("seed", "UUID",
"128-bit seed UUID to derive all UUIDs from"): "128-bit seed UUID to derive all UUIDs from"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_seed = SD_ID128_NULL; arg_seed = SD_ID128_NULL;
arg_randomize = false; arg_randomize = false;
} else if (streq(arg, "random")) } else if (streq(opts.arg, "random"))
arg_randomize = true; arg_randomize = true;
else { else {
r = sd_id128_from_string(arg, &arg_seed); r = sd_id128_from_string(opts.arg, &arg_seed);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse seed: %s", arg); return log_error_errno(r, "Failed to parse seed: %s", opts.arg);
arg_randomize = false; arg_randomize = false;
} }
@@ -9819,7 +9818,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("split", "BOOL", OPTION_LONG("split", "BOOL",
"Whether to generate split artifacts"): "Whether to generate split artifacts"):
r = parse_boolean_argument("--split=", arg, NULL); r = parse_boolean_argument("--split=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
@@ -9830,14 +9829,14 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("pretty", "BOOL", OPTION_LONG("pretty", "BOOL",
"Whether to show pretty summary before doing changes"): "Whether to show pretty summary before doing changes"):
r = parse_boolean_argument("--pretty=", arg, NULL); r = parse_boolean_argument("--pretty=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
arg_pretty = r; arg_pretty = r;
break; break;
OPTION_COMMON_JSON: OPTION_COMMON_JSON:
r = parse_json_argument(arg, &arg_json_format_flags); r = parse_json_argument(opts.arg, &arg_json_format_flags);
if (r <= 0) if (r <= 0)
return r; return r;
@@ -9847,7 +9846,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("factory-reset", "BOOL", OPTION_LONG("factory-reset", "BOOL",
"Whether to remove data partitions before recreating them"): "Whether to remove data partitions before recreating them"):
r = parse_boolean_argument("--factory-reset=", arg, NULL); r = parse_boolean_argument("--factory-reset=", opts.arg, NULL);
if (r < 0) if (r < 0)
return r; return r;
arg_factory_reset = r; arg_factory_reset = r;
@@ -9862,14 +9861,14 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("root", "PATH", OPTION_LONG("root", "PATH",
"Operate relative to root path"): "Operate relative to root path"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_root); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("image", "PATH", OPTION_LONG("image", "PATH",
"Operate relative to image file"): "Operate relative to image file"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_image); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_image);
if (r < 0) if (r < 0)
return r; return r;
@@ -9879,7 +9878,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("image-policy", "POLICY", OPTION_LONG("image-policy", "POLICY",
"Specify disk image dissection policy"): "Specify disk image dissection policy"):
r = parse_image_policy_argument(arg, &arg_image_policy); r = parse_image_policy_argument(opts.arg, &arg_image_policy);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -9887,7 +9886,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("definitions", "DIR", OPTION_LONG("definitions", "DIR",
"Find partition definitions in specified directory"): { "Find partition definitions in specified directory"): {
_cleanup_free_ char *path = NULL; _cleanup_free_ char *path = NULL;
r = parse_path_argument(arg, false, &path); r = parse_path_argument(opts.arg, false, &path);
if (r < 0) if (r < 0)
return r; return r;
if (strv_consume(&arg_definitions, TAKE_PTR(path)) < 0) if (strv_consume(&arg_definitions, TAKE_PTR(path)) < 0)
@@ -9906,14 +9905,14 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_GROUP("Verity"): {} OPTION_GROUP("Verity"): {}
OPTION_COMMON_PRIVATE_KEY("Private key to use when generating verity roothash signatures"): OPTION_COMMON_PRIVATE_KEY("Private key to use when generating verity roothash signatures"):
r = free_and_strdup_warn(&arg_private_key, arg); r = free_and_strdup_warn(&arg_private_key, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_COMMON_PRIVATE_KEY_SOURCE: OPTION_COMMON_PRIVATE_KEY_SOURCE:
r = parse_openssl_key_source_argument( r = parse_openssl_key_source_argument(
arg, opts.arg,
&arg_private_key_source, &arg_private_key_source,
&arg_private_key_source_type); &arg_private_key_source_type);
if (r < 0) if (r < 0)
@@ -9921,14 +9920,14 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_COMMON_CERTIFICATE("PEM certificate to use when generating verity roothash signatures"): OPTION_COMMON_CERTIFICATE("PEM certificate to use when generating verity roothash signatures"):
r = free_and_strdup_warn(&arg_certificate, arg); r = free_and_strdup_warn(&arg_certificate, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_COMMON_CERTIFICATE_SOURCE: OPTION_COMMON_CERTIFICATE_SOURCE:
r = parse_openssl_certificate_source_argument( r = parse_openssl_certificate_source_argument(
arg, opts.arg,
&arg_certificate_source, &arg_certificate_source,
&arg_certificate_source_type); &arg_certificate_source_type);
if (r < 0) if (r < 0)
@@ -9939,7 +9938,7 @@ static int parse_argv(int argc, char *argv[]) {
"Specify root hash and pkcs7 signature of root hash for verity as a tuple of " "Specify root hash and pkcs7 signature of root hash for verity as a tuple of "
"hex-encoded hash and a DER-encoded PKCS7, either as a path to a file or as an " "hex-encoded hash and a DER-encoded PKCS7, either as a path to a file or as an "
"ASCII base64-encoded string prefixed by 'base64:'"): "ASCII base64-encoded string prefixed by 'base64:'"):
r = parse_join_signature(arg, &arg_verity_settings); r = parse_join_signature(opts.arg, &arg_verity_settings);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -9948,7 +9947,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("key-file", "PATH", OPTION_LONG("key-file", "PATH",
"Key to use when encrypting partitions"): "Key to use when encrypting partitions"):
r = parse_key_file(arg, &arg_key); r = parse_key_file(opts.arg, &arg_key);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -9957,11 +9956,11 @@ static int parse_argv(int argc, char *argv[]) {
"Path to TPM2 device node to use"): { "Path to TPM2 device node to use"): {
_cleanup_free_ char *device = NULL; _cleanup_free_ char *device = NULL;
if (streq(arg, "list")) if (streq(opts.arg, "list"))
return tpm2_list_devices(/* legend= */ true, /* quiet= */ false); return tpm2_list_devices(/* legend= */ true, /* quiet= */ false);
if (!streq(arg, "auto")) { if (!streq(opts.arg, "auto")) {
device = strdup(arg); device = strdup(opts.arg);
if (!device) if (!device)
return log_oom(); return log_oom();
} }
@@ -9973,7 +9972,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("tpm2-device-key", "PATH", OPTION_LONG("tpm2-device-key", "PATH",
"Enroll a TPM2 device using its public key"): "Enroll a TPM2 device using its public key"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_tpm2_device_key); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_tpm2_device_key);
if (r < 0) if (r < 0)
return r; return r;
@@ -9981,15 +9980,15 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("tpm2-seal-key-handle", "HANDLE", OPTION_LONG("tpm2-seal-key-handle", "HANDLE",
"Specify handle of key to use for sealing"): "Specify handle of key to use for sealing"):
r = safe_atou32_full(arg, 16, &arg_tpm2_seal_key_handle); r = safe_atou32_full(opts.arg, 16, &arg_tpm2_seal_key_handle);
if (r < 0) if (r < 0)
return log_error_errno(r, "Could not parse TPM2 seal key handle index '%s': %m", arg); return log_error_errno(r, "Could not parse TPM2 seal key handle index '%s': %m", opts.arg);
break; break;
OPTION_LONG("tpm2-pcrs", "PCR1+PCR2+…", OPTION_LONG("tpm2-pcrs", "PCR1+PCR2+…",
"TPM2 PCR indexes to use for TPM2 enrollment"): "TPM2 PCR indexes to use for TPM2 enrollment"):
r = tpm2_parse_pcr_argument_append(arg, &arg_tpm2_hash_pcr_values, &arg_tpm2_n_hash_pcr_values); r = tpm2_parse_pcr_argument_append(opts.arg, &arg_tpm2_hash_pcr_values, &arg_tpm2_n_hash_pcr_values);
if (r < 0) if (r < 0)
return r; return r;
@@ -9997,7 +9996,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("tpm2-public-key", "PATH", OPTION_LONG("tpm2-public-key", "PATH",
"Enroll signed TPM2 PCR policy against PEM public key"): "Enroll signed TPM2 PCR policy against PEM public key"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_tpm2_public_key); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_tpm2_public_key);
if (r < 0) if (r < 0)
return r; return r;
@@ -10006,7 +10005,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("tpm2-public-key-pcrs", "PCR1+PCR2+…", OPTION_LONG("tpm2-public-key-pcrs", "PCR1+PCR2+…",
"Enroll signed TPM2 PCR policy for specified TPM2 PCRs"): "Enroll signed TPM2 PCR policy for specified TPM2 PCRs"):
auto_public_key_pcr_mask = false; auto_public_key_pcr_mask = false;
r = tpm2_parse_pcr_argument_to_mask(arg, &arg_tpm2_public_key_pcr_mask); r = tpm2_parse_pcr_argument_to_mask(opts.arg, &arg_tpm2_public_key_pcr_mask);
if (r < 0) if (r < 0)
return r; return r;
@@ -10014,7 +10013,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("tpm2-pcrlock", "PATH", OPTION_LONG("tpm2-pcrlock", "PATH",
"Specify pcrlock policy to lock against"): "Specify pcrlock policy to lock against"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_tpm2_pcrlock); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_tpm2_pcrlock);
if (r < 0) if (r < 0)
return r; return r;
@@ -10029,7 +10028,7 @@ static int parse_argv(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Combination of --include-partitions= and --exclude-partitions= is invalid."); "Combination of --include-partitions= and --exclude-partitions= is invalid.");
r = parse_partition_types(arg, &arg_filter_partitions, &arg_n_filter_partitions); r = parse_partition_types(opts.arg, &arg_filter_partitions, &arg_n_filter_partitions);
if (r < 0) if (r < 0)
return r; return r;
@@ -10043,7 +10042,7 @@ static int parse_argv(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Combination of --include-partitions= and --exclude-partitions= is invalid."); "Combination of --include-partitions= and --exclude-partitions= is invalid.");
r = parse_partition_types(arg, &arg_filter_partitions, &arg_n_filter_partitions); r = parse_partition_types(opts.arg, &arg_filter_partitions, &arg_n_filter_partitions);
if (r < 0) if (r < 0)
return r; return r;
@@ -10053,7 +10052,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("defer-partitions", "PART1,PART2…", OPTION_LONG("defer-partitions", "PART1,PART2…",
"Take partitions of the specified types into account but don't populate them yet"): "Take partitions of the specified types into account but don't populate them yet"):
r = parse_partition_types(arg, &arg_defer_partitions, &arg_n_defer_partitions); r = parse_partition_types(opts.arg, &arg_defer_partitions, &arg_n_defer_partitions);
if (r < 0) if (r < 0)
return r; return r;
@@ -10061,7 +10060,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("defer-partitions-empty", "BOOL", OPTION_LONG("defer-partitions-empty", "BOOL",
"Defer all partitions marked for formatting as empty"): "Defer all partitions marked for formatting as empty"):
r = parse_boolean_argument("--defer-partitions-empty=", arg, &arg_defer_partitions_empty); r = parse_boolean_argument("--defer-partitions-empty=", opts.arg, &arg_defer_partitions_empty);
if (r < 0) if (r < 0)
return r; return r;
@@ -10069,7 +10068,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("defer-partitions-factory-reset", "BOOL", OPTION_LONG("defer-partitions-factory-reset", "BOOL",
"Defer all partitions marked for factory reset"): "Defer all partitions marked for factory reset"):
r = parse_boolean_argument("--defer-partitions-factory-reset=", arg, &arg_defer_partitions_factory_reset); r = parse_boolean_argument("--defer-partitions-factory-reset=", opts.arg, &arg_defer_partitions_factory_reset);
if (r < 0) if (r < 0)
return r; return r;
@@ -10079,7 +10078,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION('s', "copy-source", "PATH", OPTION('s', "copy-source", "PATH",
"Specify the primary source tree to copy files from"): "Specify the primary source tree to copy files from"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_copy_source); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_copy_source);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -10088,7 +10087,7 @@ static int parse_argv(int argc, char *argv[]) {
"Copy partitions from the given image"): { "Copy partitions from the given image"): {
_cleanup_free_ char *p = NULL; _cleanup_free_ char *p = NULL;
r = parse_path_argument(arg, /* suppress_root= */ false, &p); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &p);
if (r < 0) if (r < 0)
return r; return r;
@@ -10102,10 +10101,10 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("make-ddi", "TYPE", OPTION_LONG("make-ddi", "TYPE",
"Create a DDI of the given type"): "Create a DDI of the given type"):
if (!filename_is_valid(arg)) if (!filename_is_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid DDI type: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid DDI type: %s", opts.arg);
r = free_and_strdup_warn(&arg_make_ddi, arg); r = free_and_strdup_warn(&arg_make_ddi, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -10133,26 +10132,26 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("append-fstab", "MODE", OPTION_LONG("append-fstab", "MODE",
"How to join the content of a pre-existing fstab with the generated one " "How to join the content of a pre-existing fstab with the generated one "
"(no, auto, replace)"): "(no, auto, replace)"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_append_fstab = APPEND_AUTO; arg_append_fstab = APPEND_AUTO;
break; break;
} }
arg_append_fstab = append_mode_from_string(arg); arg_append_fstab = append_mode_from_string(opts.arg);
if (arg_append_fstab < 0) if (arg_append_fstab < 0)
return log_error_errno(arg_append_fstab, "Failed to parse --append-fstab= parameter: %s", arg); return log_error_errno(arg_append_fstab, "Failed to parse --append-fstab= parameter: %s", opts.arg);
break; break;
OPTION_LONG("generate-fstab", "PATH", OPTION_LONG("generate-fstab", "PATH",
"Write fstab configuration to the given path"): "Write fstab configuration to the given path"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_generate_fstab); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_generate_fstab);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("generate-crypttab", "PATH", OPTION_LONG("generate-crypttab", "PATH",
"Write crypttab configuration to the given path"): "Write crypttab configuration to the given path"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_generate_crypttab); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_generate_crypttab);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -10161,7 +10160,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("el-torito", "BOOL", OPTION_LONG("el-torito", "BOOL",
"Whether to add a boot catalog to boot the ESP"): "Whether to add a boot catalog to boot the ESP"):
r = parse_boolean_argument("--el-torito=", arg, &arg_eltorito); r = parse_boolean_argument("--el-torito=", opts.arg, &arg_eltorito);
if (r < 0) if (r < 0)
return r; return r;
@@ -10169,10 +10168,10 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("el-torito-system", "STRING", OPTION_LONG("el-torito-system", "STRING",
"Set the system identifier in the ISO9660 descriptor"): "Set the system identifier in the ISO9660 descriptor"):
if (!iso9660_system_name_valid(arg)) if (!iso9660_system_name_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid value '%s' for --el-torito-system=.", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid value '%s' for --el-torito-system=.", opts.arg);
r = free_and_strdup_warn(&arg_eltorito_system, arg); r = free_and_strdup_warn(&arg_eltorito_system, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
@@ -10180,10 +10179,10 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("el-torito-volume", "STRING", OPTION_LONG("el-torito-volume", "STRING",
"Set the volume identifier in the ISO9660 descriptor"): "Set the volume identifier in the ISO9660 descriptor"):
if (!iso9660_volume_name_valid(arg)) if (!iso9660_volume_name_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid value '%s' for --el-torito-volume=.", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid value '%s' for --el-torito-volume=.", opts.arg);
r = free_and_strdup_warn(&arg_eltorito_volume, arg); r = free_and_strdup_warn(&arg_eltorito_volume, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
@@ -10191,17 +10190,17 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("el-torito-publisher", "STRING", OPTION_LONG("el-torito-publisher", "STRING",
"Set the publisher identifier in the ISO9660 descriptor"): "Set the publisher identifier in the ISO9660 descriptor"):
if (!iso9660_publisher_name_valid(arg)) if (!iso9660_publisher_name_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid value '%s' for --el-torito-publisher=.", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid value '%s' for --el-torito-publisher=.", opts.arg);
r = free_and_strdup_warn(&arg_eltorito_publisher, arg); r = free_and_strdup_warn(&arg_eltorito_publisher, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
} }
if (option_parser_get_n_args(&state) > 1) if (option_parser_get_n_args(&opts) > 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Expected at most one argument, the path to the block device or image file."); "Expected at most one argument, the path to the block device or image file.");
@@ -10281,7 +10280,7 @@ static int parse_argv(int argc, char *argv[]) {
arg_relax_copy_block_security = true; arg_relax_copy_block_security = true;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (!strv_isempty(args)) { if (!strv_isempty(args)) {
if (empty_or_dash(args[0])) if (empty_or_dash(args[0]))
arg_node_none = true; arg_node_none = true;
+3 -3
View File
@@ -57,9 +57,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
FOREACH_OPTION(&state, c, /* ret_a= */ NULL, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
@@ -68,7 +68,7 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
} }
if (state.optind < argc) if (opts.optind < argc)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"This program takes no arguments."); "This program takes no arguments.");
+14 -15
View File
@@ -985,10 +985,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
@@ -1013,7 +1012,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_COMMON_JSON: OPTION_COMMON_JSON:
r = parse_json_argument(arg, &arg_json_format_flags); r = parse_json_argument(opts.arg, &arg_json_format_flags);
if (r <= 0) if (r <= 0)
return r; return r;
break; break;
@@ -1024,49 +1023,49 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("url", "URL", OPTION_LONG("url", "URL",
"Upload to this address"): "Upload to this address"):
r = free_and_strdup_warn(&arg_url, arg); r = free_and_strdup_warn(&arg_url, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("key", "FILENAME", OPTION_LONG("key", "FILENAME",
"Specify key in PEM format (default: \"" REPORT_PRIV_KEY_FILE "\")"): "Specify key in PEM format (default: \"" REPORT_PRIV_KEY_FILE "\")"):
r = free_and_strdup_warn(&arg_key, arg); r = free_and_strdup_warn(&arg_key, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("cert", "FILENAME", OPTION_LONG("cert", "FILENAME",
"Specify certificate in PEM format (default: \"" REPORT_CERT_FILE "\")"): "Specify certificate in PEM format (default: \"" REPORT_CERT_FILE "\")"):
r = free_and_strdup_warn(&arg_cert, arg); r = free_and_strdup_warn(&arg_cert, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("trust", "FILENAME|all", OPTION_LONG("trust", "FILENAME|all",
"Specify CA certificate or disable checking (default: \"" REPORT_TRUST_FILE "\")"): "Specify CA certificate or disable checking (default: \"" REPORT_TRUST_FILE "\")"):
r = free_and_strdup_warn(&arg_trust, arg); r = free_and_strdup_warn(&arg_trust, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("network-timeout", "SEC", "Specify timeout for network upload operation"): OPTION_LONG("network-timeout", "SEC", "Specify timeout for network upload operation"):
r = parse_sec(arg, &arg_network_timeout_usec); r = parse_sec(opts.arg, &arg_network_timeout_usec);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --network-timeout value: %s", arg); return log_error_errno(r, "Failed to parse --network-timeout value: %s", opts.arg);
break; break;
OPTION_LONG("extra-header", "NAME: VALUE", OPTION_LONG("extra-header", "NAME: VALUE",
"Inject additional header into the upload request"): "Inject additional header into the upload request"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_extra_headers = strv_free(arg_extra_headers); arg_extra_headers = strv_free(arg_extra_headers);
break; break;
} }
if (!http_header_valid(arg)) if (!http_header_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid HTTP header: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid HTTP header: %s", opts.arg);
if (strv_extend(&arg_extra_headers, arg) < 0) if (strv_extend(&arg_extra_headers, opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
} }
@@ -1074,7 +1073,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
if ((arg_url || arg_key || arg_cert || arg_trust || arg_extra_headers) && !HAVE_LIBCURL) if ((arg_url || arg_key || arg_cert || arg_trust || arg_extra_headers) && !HAVE_LIBCURL)
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Compiled without libcurl."); return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Compiled without libcurl.");
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+10 -11
View File
@@ -93,11 +93,10 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -108,21 +107,21 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("output", "PATH", OPTION_LONG("output", "PATH",
"Where to write the signed PE binary"): "Where to write the signed PE binary"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_output); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_output);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_COMMON_CERTIFICATE("PEM certificate to use for signing"): OPTION_COMMON_CERTIFICATE("PEM certificate to use for signing"):
r = free_and_strdup_warn(&arg_certificate, arg); r = free_and_strdup_warn(&arg_certificate, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_COMMON_CERTIFICATE_SOURCE: OPTION_COMMON_CERTIFICATE_SOURCE:
r = parse_openssl_certificate_source_argument( r = parse_openssl_certificate_source_argument(
arg, opts.arg,
&arg_certificate_source, &arg_certificate_source,
&arg_certificate_source_type); &arg_certificate_source_type);
if (r < 0) if (r < 0)
@@ -130,7 +129,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_COMMON_PRIVATE_KEY("Private key (PEM) to sign with"): OPTION_COMMON_PRIVATE_KEY("Private key (PEM) to sign with"):
r = free_and_strdup_warn(&arg_private_key, arg); r = free_and_strdup_warn(&arg_private_key, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
@@ -138,7 +137,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_COMMON_PRIVATE_KEY_SOURCE: OPTION_COMMON_PRIVATE_KEY_SOURCE:
r = parse_openssl_key_source_argument( r = parse_openssl_key_source_argument(
arg, opts.arg,
&arg_private_key_source, &arg_private_key_source,
&arg_private_key_source_type); &arg_private_key_source_type);
if (r < 0) if (r < 0)
@@ -151,14 +150,14 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("signed-data", "PATH", /* help= */ NULL): OPTION_LONG("signed-data", "PATH", /* help= */ NULL):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_signed_data); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_signed_data);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("signed-data-signature", "PATH", /* help= */ NULL): OPTION_LONG("signed-data-signature", "PATH", /* help= */ NULL):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_signed_data_signature); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_signed_data_signature);
if (r < 0) if (r < 0)
return r; return r;
@@ -174,7 +173,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
if (arg_prepare_offline_signing && (arg_private_key || arg_signed_data || arg_signed_data_signature)) if (arg_prepare_offline_signing && (arg_private_key || arg_signed_data || arg_signed_data_signature))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--prepare-offline-signing cannot be used with --private-key=, --signed-data= or --signed-data-signature="); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--prepare-offline-signing cannot be used with --private-key=, --signed-data= or --signed-data-signature=");
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+11 -16
View File
@@ -70,9 +70,7 @@ static int partial_match_error(
int option_parse( int option_parse(
const Option options[], const Option options[],
const Option options_end[], const Option options_end[],
OptionParser *state, OptionParser *state) {
const Option **ret_option,
const char **ret_arg) {
/* Check and initialize */ /* Check and initialize */
if (state->optind == 0) { if (state->optind == 0) {
@@ -96,7 +94,7 @@ int option_parse(
/* Handle non-option parameters */ /* Handle non-option parameters */
for (;;) { for (;;) {
if (state->optind == state->argc) if (state->optind == state->argc)
return 0; goto finished;
if (streq(state->argv[state->optind], "--")) { if (streq(state->argv[state->optind], "--")) {
/* No more options. Move "--" before positional args so that /* No more options. Move "--" before positional args so that
@@ -106,7 +104,7 @@ int option_parse(
} }
if (state->parsing_stopped) if (state->parsing_stopped)
return 0; goto finished;
if (state->argv[state->optind][0] == '-' && if (state->argv[state->optind][0] == '-' &&
state->argv[state->optind][1] != '\0') state->argv[state->optind][1] != '\0')
@@ -115,7 +113,7 @@ int option_parse(
if (state->mode == OPTION_PARSER_STOP_AT_FIRST_NONOPTION) { if (state->mode == OPTION_PARSER_STOP_AT_FIRST_NONOPTION) {
state->parsing_stopped = true; state->parsing_stopped = true;
return 0; goto finished;
} }
if (state->mode == OPTION_PARSER_RETURN_POSITIONAL_ARGS) { if (state->mode == OPTION_PARSER_RETURN_POSITIONAL_ARGS) {
@@ -254,17 +252,14 @@ int option_parse(
if (FLAGS_SET(option->flags, OPTION_STOPS_PARSING)) if (FLAGS_SET(option->flags, OPTION_STOPS_PARSING))
state->parsing_stopped = true; state->parsing_stopped = true;
if (ret_option) state->opt = option;
/* Return the matched Option structure to allow the caller to "know" what was matched */ state->arg = optval;
*ret_option = option;
if (ret_arg)
*ret_arg = optval;
else
/* It's fine to omit ret_arg, but only if no options return a value. */
assert(!optval);
return option->id; return option->id;
finished:
state->opt = NULL;
state->arg = NULL;
return 0;
} }
char* option_parser_next_arg(const OptionParser *state) { char* option_parser_next_arg(const OptionParser *state) {
+11 -11
View File
@@ -147,26 +147,26 @@ typedef struct OptionParser {
* 0 → we're not parsing short options. */ * 0 → we're not parsing short options. */
int positional_offset; /* Offset to where positional parameters are. After processing has been int positional_offset; /* Offset to where positional parameters are. After processing has been
* finished, all options and their args are to the left of this offset. */ * finished, all options and their args are to the left of this offset. */
/* The two variables below encompass the state of the last option_parse() call.
* Before parsing has commenced, and after it has finished, they will be NULL. */
const Option *opt; /* … the matched option or NULL */
const char *arg; /* … the argument or NULL */
} OptionParser; } OptionParser;
int option_parse( int option_parse(
const Option options[], const Option options[],
const Option options_end[], const Option options_end[],
OptionParser *state, OptionParser *state);
const Option **ret_option,
const char **ret_arg);
/* Iterate over options. */ /* Iterate over options. */
#define FOREACH_OPTION_FULL(parser, opt, ret_o, ret_a, on_error) \ #define FOREACH_OPTION(c, state, on_error) \
for (int opt; (opt = option_parse(ALIGN_PTR(__start_SYSTEMD_OPTIONS), __stop_SYSTEMD_OPTIONS, parser, ret_o, ret_a)) != 0; ) \ for (int c; (c = option_parse(ALIGN_PTR(__start_SYSTEMD_OPTIONS), __stop_SYSTEMD_OPTIONS, state)) != 0; ) \
if (opt < 0) { \ if (c < 0) { \
on_error; \ on_error; \
break; \ break; \
} else } else
#define FOREACH_OPTION(parser, opt, ret_a, on_error) \
FOREACH_OPTION_FULL(parser, opt, /* ret_o= */ NULL, ret_a, on_error)
char* option_parser_next_arg(const OptionParser *state); char* option_parser_next_arg(const OptionParser *state);
char* option_parser_consume_next_arg(OptionParser *state); char* option_parser_consume_next_arg(OptionParser *state);
+20 -21
View File
@@ -63,33 +63,32 @@ static int parse_argv(int argc, char *argv[]) {
/* The interface is: the verb must stay in argv[1]. Any extra positional arguments /* The interface is: the verb must stay in argv[1]. Any extra positional arguments
* are warned about and ignored. See 4b5d8d0f22ae61ceb45a25391354ba53b43ee992. */ * are warned about and ignored. See 4b5d8d0f22ae61ceb45a25391354ba53b43ee992. */
OptionParser state = { argc, argv, OPTION_PARSER_RETURN_POSITIONAL_ARGS }; OptionParser opts = { argc, argv, OPTION_PARSER_RETURN_POSITIONAL_ARGS };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_LOG_LEVEL: OPTION_COMMON_LOG_LEVEL:
r = log_set_max_level_from_string(arg); r = log_set_max_level_from_string(opts.arg);
if (r < 0) if (r < 0)
log_warning_errno(r, "Failed to parse log level %s, ignoring: %m", arg); log_warning_errno(r, "Failed to parse log level %s, ignoring: %m", opts.arg);
break; break;
OPTION_COMMON_LOG_TARGET: OPTION_COMMON_LOG_TARGET:
r = log_set_target_from_string(arg); r = log_set_target_from_string(opts.arg);
if (r < 0) if (r < 0)
log_warning_errno(r, "Failed to parse log target %s, ignoring: %m", arg); log_warning_errno(r, "Failed to parse log target %s, ignoring: %m", opts.arg);
break; break;
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "log-color", "BOOL", OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "log-color", "BOOL",
"Highlight important messages"): "Highlight important messages"):
if (arg) { if (opts.arg) {
r = log_show_color_from_string(arg); r = log_show_color_from_string(opts.arg);
if (r < 0) if (r < 0)
log_warning_errno(r, "Failed to parse log color setting %s, ignoring: %m", arg); log_warning_errno(r, "Failed to parse log color setting %s, ignoring: %m", opts.arg);
} else } else
log_show_color(true); log_show_color(true);
@@ -97,10 +96,10 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "log-location", "BOOL", OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "log-location", "BOOL",
"Include code location in messages"): "Include code location in messages"):
if (arg) { if (opts.arg) {
r = log_show_location_from_string(arg); r = log_show_location_from_string(opts.arg);
if (r < 0) if (r < 0)
log_warning_errno(r, "Failed to parse log location setting %s, ignoring: %m", arg); log_warning_errno(r, "Failed to parse log location setting %s, ignoring: %m", opts.arg);
} else } else
log_show_location(true); log_show_location(true);
@@ -108,10 +107,10 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "log-time", "BOOL", OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "log-time", "BOOL",
"Prefix messages with current time"): "Prefix messages with current time"):
if (arg) { if (opts.arg) {
r = log_show_time_from_string(arg); r = log_show_time_from_string(opts.arg);
if (r < 0) if (r < 0)
log_warning_errno(r, "Failed to parse log time setting %s, ignoring: %m", arg); log_warning_errno(r, "Failed to parse log time setting %s, ignoring: %m", opts.arg);
} else } else
log_show_time(true); log_show_time(true);
@@ -119,23 +118,23 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("exit-code", "N", OPTION_LONG("exit-code", "N",
"Exit code for reboot/kexec"): "Exit code for reboot/kexec"):
r = safe_atou8(arg, &arg_exit_code); r = safe_atou8(opts.arg, &arg_exit_code);
if (r < 0) if (r < 0)
log_warning_errno(r, "Failed to parse exit code %s, ignoring: %m", arg); log_warning_errno(r, "Failed to parse exit code %s, ignoring: %m", opts.arg);
break; break;
OPTION_LONG("timeout", "TIME", OPTION_LONG("timeout", "TIME",
"Overall shutdown timeout"): "Overall shutdown timeout"):
r = parse_sec(arg, &arg_timeout); r = parse_sec(opts.arg, &arg_timeout);
if (r < 0) if (r < 0)
log_warning_errno(r, "Failed to parse shutdown timeout %s, ignoring: %m", arg); log_warning_errno(r, "Failed to parse shutdown timeout %s, ignoring: %m", opts.arg);
break; break;
OPTION_POSITIONAL: OPTION_POSITIONAL:
if (!arg_verb) if (!arg_verb)
arg_verb = arg; arg_verb = opts.arg;
else else
log_warning("Got extraneous argument, ignoring."); log_warning("Got extraneous argument, ignoring.");
break; break;
+3 -3
View File
@@ -729,9 +729,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
FOREACH_OPTION(&state, c, /* arg= */ NULL, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -741,7 +741,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return version(); return version();
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+7 -8
View File
@@ -355,11 +355,10 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
assert(argv); assert(argv);
assert(remaining_args); assert(remaining_args);
OptionParser state = { argc, argv, OPTION_PARSER_STOP_AT_FIRST_NONOPTION }; OptionParser opts = { argc, argv, OPTION_PARSER_STOP_AT_FIRST_NONOPTION };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -370,7 +369,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
OPTION('l', "listen", "ADDR", OPTION('l', "listen", "ADDR",
"Listen for raw connections at ADDR"): "Listen for raw connections at ADDR"):
r = strv_extend(&arg_listen, arg); r = strv_extend(&arg_listen, opts.arg);
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
@@ -402,16 +401,16 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
OPTION('E', "setenv", "NAME[=VALUE]", OPTION('E', "setenv", "NAME[=VALUE]",
"Pass an environment variable to children"): {} "Pass an environment variable to children"): {}
OPTION_LONG("environment", "NAME[=VALUE]", /* help= */ NULL): /* legacy alias */ OPTION_LONG("environment", "NAME[=VALUE]", /* help= */ NULL): /* legacy alias */
r = strv_env_replace_strdup_passthrough(&arg_setenv, arg); r = strv_env_replace_strdup_passthrough(&arg_setenv, opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Cannot assign environment variable %s: %m", arg); return log_error_errno(r, "Cannot assign environment variable %s: %m", opts.arg);
break; break;
OPTION_LONG("fdname", "NAME[:NAME...]", OPTION_LONG("fdname", "NAME[:NAME...]",
"Specify names for file descriptors"): { "Specify names for file descriptors"): {
_cleanup_strv_free_ char **names = NULL; _cleanup_strv_free_ char **names = NULL;
names = strv_split(arg, ":"); names = strv_split(opts.arg, ":");
if (!names) if (!names)
return log_oom(); return log_oom();
@@ -443,7 +442,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
break; break;
} }
*remaining_args = option_parser_get_args(&state); *remaining_args = option_parser_get_args(&opts);
if (strv_isempty(*remaining_args)) if (strv_isempty(*remaining_args))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"%s: command to execute is missing.", "%s: command to execute is missing.",
+7 -8
View File
@@ -420,11 +420,10 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -435,9 +434,9 @@ static int parse_argv(int argc, char *argv[]) {
OPTION('c', "connections-max", "NUMBER", OPTION('c', "connections-max", "NUMBER",
"Set the maximum number of connections to be accepted"): "Set the maximum number of connections to be accepted"):
r = safe_atou(arg, &arg_connections_max); r = safe_atou(opts.arg, &arg_connections_max);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --connections-max= argument: %s", arg); return log_error_errno(r, "Failed to parse --connections-max= argument: %s", opts.arg);
if (arg_connections_max < 1) if (arg_connections_max < 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
@@ -447,13 +446,13 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("exit-idle-time", "TIME", OPTION_LONG("exit-idle-time", "TIME",
"Exit when without a connection for this duration"): "Exit when without a connection for this duration"):
r = parse_sec(arg, &arg_exit_idle_time); r = parse_sec(opts.arg, &arg_exit_idle_time);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --exit-idle-time= argument: %s", arg); return log_error_errno(r, "Failed to parse --exit-idle-time= argument: %s", opts.arg);
break; break;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
size_t n = strv_length(args); size_t n = strv_length(args);
if (n < 1) if (n < 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Not enough parameters."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Not enough parameters.");
+8 -9
View File
@@ -159,12 +159,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const Option *opt; const char *verb = NULL;
const char *arg, *verb = NULL;
int r; int r;
FOREACH_OPTION_FULL(&state, c, &opt, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -175,18 +174,18 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("make-vsock", NULL, /* help= */ NULL): {} OPTION_LONG("make-vsock", NULL, /* help= */ NULL): {}
OPTION_LONG("rm-vsock", NULL, /* help= */ NULL): OPTION_LONG("rm-vsock", NULL, /* help= */ NULL):
verb = opt->long_code; verb = opts.opt->long_code;
break; break;
OPTION_LONG("issue-path", "PATH", OPTION_LONG("issue-path", "PATH",
"Change path to /run/issue.d/50-ssh-vsock.issue"): "Change path to /run/issue.d/50-ssh-vsock.issue"):
if (empty_or_dash(arg)) { if (empty_or_dash(opts.arg)) {
arg_issue_path = mfree(arg_issue_path); arg_issue_path = mfree(arg_issue_path);
arg_issue_stdout = true; arg_issue_stdout = true;
break; break;
} }
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_issue_path); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_issue_path);
if (r < 0) if (r < 0)
return r; return r;
@@ -202,12 +201,12 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
char **args; char **args;
if (verb) { if (verb) {
if (option_parser_get_n_args(&state) > 0) if (option_parser_get_n_args(&opts) > 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid use of compat option --make-vsock/--rm-vsock."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid use of compat option --make-vsock/--rm-vsock.");
log_warning("Options --make-vsock/--rm-vsock have been replaced by make-vsock/rm-vsock verbs."); log_warning("Options --make-vsock/--rm-vsock have been replaced by make-vsock/rm-vsock verbs.");
args = strv_new(verb); args = strv_new(verb);
} else } else
args = strv_copy(option_parser_get_args(&state)); args = strv_copy(option_parser_get_args(&opts));
if (!args) if (!args)
return log_oom(); return log_oom();
+5 -6
View File
@@ -46,11 +46,10 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -69,11 +68,11 @@ static int parse_argv(int argc, char *argv[]) {
OPTION('p', "bus-path", "PATH", OPTION('p', "bus-path", "PATH",
"Path to the bus address (default: " DEFAULT_SYSTEM_BUS_ADDRESS ")"): "Path to the bus address (default: " DEFAULT_SYSTEM_BUS_ADDRESS ")"):
arg_bus_path = arg; arg_bus_path = opts.arg;
break; break;
OPTION_COMMON_MACHINE: OPTION_COMMON_MACHINE:
r = parse_machine_argument(arg, &arg_bus_path, &arg_transport); r = parse_machine_argument(opts.arg, &arg_bus_path, &arg_transport);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -83,7 +82,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
} }
if (option_parser_get_n_args(&state) > 0) if (option_parser_get_n_args(&opts) > 0)
return log_full_errno(arg_quiet ? LOG_DEBUG : LOG_ERR, SYNTHETIC_ERRNO(EINVAL), return log_full_errno(arg_quiet ? LOG_DEBUG : LOG_ERR, SYNTHETIC_ERRNO(EINVAL),
"%s takes no arguments.", "%s takes no arguments.",
program_invocation_short_name); program_invocation_short_name);
+6 -7
View File
@@ -77,11 +77,10 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -92,10 +91,10 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("nqn", "STRING", OPTION_LONG("nqn", "STRING",
"Select NQN (NVMe Qualified Name)"): "Select NQN (NVMe Qualified Name)"):
if (!filename_is_valid(arg)) if (!filename_is_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "NQN invalid: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "NQN invalid: %s", opts.arg);
if (free_and_strdup(&arg_nqn, arg) < 0) if (free_and_strdup(&arg_nqn, opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
@@ -113,7 +112,7 @@ static int parse_argv(int argc, char *argv[]) {
return 0; return 0;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (arg_all > 0) { if (arg_all > 0) {
if (!strv_isempty(args)) if (!strv_isempty(args))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expects no further arguments if --all/-a is specified."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expects no further arguments if --all/-a is specified.");
+4 -5
View File
@@ -360,10 +360,9 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
assert(argv); assert(argv);
assert(remaining_args); assert(remaining_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -384,7 +383,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
OPTION_LONG("prefix", "PATH", OPTION_LONG("prefix", "PATH",
"Only apply rules with the specified prefix"): { "Only apply rules with the specified prefix"): {
_cleanup_free_ char *normalized = strdup(arg); _cleanup_free_ char *normalized = strdup(opts.arg);
if (!normalized) if (!normalized)
return log_oom(); return log_oom();
sysctl_normalize(normalized); sysctl_normalize(normalized);
@@ -416,7 +415,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
break; break;
} }
*remaining_args = option_parser_get_args(&state); *remaining_args = option_parser_get_args(&opts);
if (arg_cat_flags != CAT_CONFIG_OFF && !strv_isempty(*remaining_args)) if (arg_cat_flags != CAT_CONFIG_OFF && !strv_isempty(*remaining_args))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+17 -18
View File
@@ -1862,11 +1862,10 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
assert(argv); assert(argv);
assert(remaining_args); assert(remaining_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -1880,18 +1879,18 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
OPTION('C', "component", "NAME", OPTION('C', "component", "NAME",
"Select component to update"): "Select component to update"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_component = mfree(arg_component); arg_component = mfree(arg_component);
break; break;
} }
r = component_name_valid(arg); r = component_name_valid(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to determine if component name is valid: %m"); return log_error_errno(r, "Failed to determine if component name is valid: %m");
if (r == 0) if (r == 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Component name invalid: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Component name invalid: %s", opts.arg);
r = free_and_strdup_warn(&arg_component, arg); r = free_and_strdup_warn(&arg_component, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
@@ -1899,35 +1898,35 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
OPTION_LONG("definitions", "DIR", OPTION_LONG("definitions", "DIR",
"Find transfer definitions in specified directory"): "Find transfer definitions in specified directory"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_definitions); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_definitions);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("root", "PATH", OPTION_LONG("root", "PATH",
"Operate on an alternate filesystem root"): "Operate on an alternate filesystem root"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_root); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("image", "PATH", OPTION_LONG("image", "PATH",
"Operate on disk image as filesystem root"): "Operate on disk image as filesystem root"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_image); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_image);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("image-policy", "POLICY", OPTION_LONG("image-policy", "POLICY",
"Specify disk image dissection policy"): "Specify disk image dissection policy"):
r = parse_image_policy_argument(arg, &arg_image_policy); r = parse_image_policy_argument(opts.arg, &arg_image_policy);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("transfer-source", "PATH", OPTION_LONG("transfer-source", "PATH",
"Specify the directory to transfer sources from"): "Specify the directory to transfer sources from"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_transfer_source); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_transfer_source);
if (r < 0) if (r < 0)
return r; return r;
@@ -1935,15 +1934,15 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
OPTION('m', "instances-max", "INT", OPTION('m', "instances-max", "INT",
"How many instances to maintain"): "How many instances to maintain"):
r = safe_atou64(arg, &arg_instances_max); r = safe_atou64(opts.arg, &arg_instances_max);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --instances-max= parameter: %s", arg); return log_error_errno(r, "Failed to parse --instances-max= parameter: %s", opts.arg);
break; break;
OPTION_LONG("sync", "BOOL", OPTION_LONG("sync", "BOOL",
"Controls whether to sync data to disk"): "Controls whether to sync data to disk"):
r = parse_boolean_argument("--sync=", arg, &arg_sync); r = parse_boolean_argument("--sync=", opts.arg, &arg_sync);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -1952,7 +1951,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
"Force signature verification on or off"): { "Force signature verification on or off"): {
bool b; bool b;
r = parse_boolean_argument("--verify=", arg, &b); r = parse_boolean_argument("--verify=", opts.arg, &b);
if (r < 0) if (r < 0)
return r; return r;
@@ -1979,7 +1978,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
break; break;
OPTION_COMMON_JSON: OPTION_COMMON_JSON:
r = parse_json_argument(arg, &arg_json_format_flags); r = parse_json_argument(opts.arg, &arg_json_format_flags);
if (r <= 0) if (r <= 0)
return r; return r;
@@ -1995,7 +1994,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
if (arg_definitions && arg_component) if (arg_definitions && arg_component)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "The --definitions= and --component= switches may not be combined."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "The --definitions= and --component= switches may not be combined.");
*remaining_args = option_parser_get_args(&state); *remaining_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+4 -5
View File
@@ -1687,10 +1687,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_LONG("reboot", NULL, "Reboot after updating to newer version"): OPTION_LONG("reboot", NULL, "Reboot after updating to newer version"):
@@ -1707,7 +1706,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_COMMON_HOST: OPTION_COMMON_HOST:
arg_transport = BUS_TRANSPORT_REMOTE; arg_transport = BUS_TRANSPORT_REMOTE;
arg_host = arg; arg_host = opts.arg;
break; break;
OPTION_COMMON_NO_PAGER: OPTION_COMMON_NO_PAGER:
@@ -1727,7 +1726,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return version(); return version();
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+10 -11
View File
@@ -2101,10 +2101,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_CAT_CONFIG: OPTION_COMMON_CAT_CONFIG:
@@ -2124,32 +2123,32 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_GROUP("Options"): {} OPTION_GROUP("Options"): {}
OPTION_LONG("root", "PATH", "Operate on an alternate filesystem root"): OPTION_LONG("root", "PATH", "Operate on an alternate filesystem root"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_root); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("image", "PATH", "Operate on disk image as filesystem root"): OPTION_LONG("image", "PATH", "Operate on disk image as filesystem root"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_image); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_image);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("image-policy", "POLICY", "Specify disk image dissection policy"): OPTION_LONG("image-policy", "POLICY", "Specify disk image dissection policy"):
r = parse_image_policy_argument(arg, &arg_image_policy); r = parse_image_policy_argument(opts.arg, &arg_image_policy);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("replace", "PATH", "Treat arguments as replacement for PATH"): OPTION_LONG("replace", "PATH", "Treat arguments as replacement for PATH"):
if (!path_is_absolute(arg)) if (!path_is_absolute(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"The argument to --replace= must be an absolute path."); "The argument to --replace= must be an absolute path.");
if (!endswith(arg, ".conf")) if (!endswith(opts.arg, ".conf"))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"The argument to --replace= must have the extension '.conf'."); "The argument to --replace= must have the extension '.conf'.");
arg_replace = arg; arg_replace = opts.arg;
break; break;
OPTION_LONG("dry-run", NULL, "Just print what would be done"): OPTION_LONG("dry-run", NULL, "Just print what would be done"):
@@ -2165,8 +2164,8 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
size_t n_args = option_parser_get_n_args(&state); size_t n_args = option_parser_get_n_args(&opts);
if (arg_replace && arg_cat_flags != CAT_CONFIG_OFF) if (arg_replace && arg_cat_flags != CAT_CONFIG_OFF)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+5 -7
View File
@@ -37,18 +37,16 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argv); assert(argv);
assert(ret_args); assert(ret_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const Option *opt;
const char *arg;
FOREACH_OPTION_FULL(&state, c, &opt, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
OPTION_LONG("root", "PATH", "Operate below specified root directory"): OPTION_LONG("root", "PATH", "Operate below specified root directory"):
arg_root = arg; arg_root = opts.arg;
break; break;
OPTION_LONG("open", NULL, "Open the resolved path"): OPTION_LONG("open", NULL, "Open the resolved path"):
@@ -64,11 +62,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG_DATA("step", NULL, CHASE_STEP, "Execute a single normalization step"): {} OPTION_LONG_DATA("step", NULL, CHASE_STEP, "Execute a single normalization step"): {}
OPTION_LONG_DATA("nofollow", NULL, CHASE_NOFOLLOW, "Do not follow the path's right-most component"): {} OPTION_LONG_DATA("nofollow", NULL, CHASE_NOFOLLOW, "Do not follow the path's right-most component"): {}
OPTION_LONG_DATA("warn", NULL, CHASE_WARN, "Emit a warning on error"): OPTION_LONG_DATA("warn", NULL, CHASE_WARN, "Emit a warning on error"):
arg_flags |= opt->data; arg_flags |= opts.opt->data;
break; break;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
if (strv_isempty(*ret_args)) if (strv_isempty(*ret_args))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "At least one argument is required."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "At least one argument is required.");
+73 -75
View File
@@ -32,34 +32,32 @@ static void test_option_parse_one(
for (const Entry *e = entries; e && (e->long_code || e->short_code != 0); e++) for (const Entry *e = entries; e && (e->long_code || e->short_code != 0); e++)
n_entries++; n_entries++;
OptionParser state = { argc, argv, mode }; OptionParser opts = { argc, argv, mode };
const Option *opt; for (int c; (c = option_parse(options, options + n_options, &opts)) != 0; ) {
const char *arg;
for (int c; (c = option_parse(options, options + n_options, &state, &opt, &arg)) != 0; ) {
ASSERT_OK(c); ASSERT_OK(c);
ASSERT_NOT_NULL(opt); ASSERT_NOT_NULL(opts.opt);
log_debug("%c %s: %s=%s", log_debug("%c %s: %s=%s",
opt->short_code != 0 ? opt->short_code : ' ', opts.opt->short_code != 0 ? opts.opt->short_code : ' ',
opt->long_code ?: "", opts.opt->long_code ?: "",
strnull(opt->metavar), strnull(arg)); strnull(opts.opt->metavar), strnull(opts.arg));
ASSERT_LT(i, n_entries); ASSERT_LT(i, n_entries);
if (entries[i].long_code) if (entries[i].long_code)
ASSERT_TRUE(streq_ptr(opt->long_code, entries[i].long_code)); ASSERT_TRUE(streq_ptr(opts.opt->long_code, entries[i].long_code));
if (entries[i].short_code != 0) if (entries[i].short_code != 0)
ASSERT_EQ(opt->short_code, entries[i].short_code); ASSERT_EQ(opts.opt->short_code, entries[i].short_code);
ASSERT_TRUE(streq_ptr(arg, entries[i].argument)); ASSERT_TRUE(streq_ptr(opts.arg, entries[i].argument));
i++; i++;
} }
ASSERT_EQ(i, n_entries); ASSERT_EQ(i, n_entries);
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
ASSERT_TRUE(strv_equal(args, remaining)); ASSERT_TRUE(strv_equal(args, remaining));
ASSERT_STREQ(argv[0], saved_argv0); ASSERT_STREQ(argv[0], saved_argv0);
ASSERT_EQ(option_parser_get_n_args(&state), strv_length(remaining)); ASSERT_EQ(option_parser_get_n_args(&opts), strv_length(remaining));
} }
static void test_option_invalid_one( static void test_option_invalid_one(
@@ -78,11 +76,9 @@ static void test_option_invalid_one(
for (const Option *o = options; o->short_code != 0 || o->long_code; o++) for (const Option *o = options; o->short_code != 0 || o->long_code; o++)
n_options++; n_options++;
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const Option *opt;
const char *arg;
int c = option_parse(options, options + n_options, &state, &opt, &arg); int c = option_parse(options, options + n_options, &opts);
ASSERT_ERROR(c, EINVAL); ASSERT_ERROR(c, EINVAL);
} }
@@ -736,7 +732,7 @@ TEST(option_optional_arg) {
} }
/* Test the OPTION, OPTION_LONG, OPTION_SHORT, OPTION_FULL, OPTION_GROUP macros /* Test the OPTION, OPTION_LONG, OPTION_SHORT, OPTION_FULL, OPTION_GROUP macros
* by using them in a FOREACH_OPTION_FULL switch, as they would be used in real code. */ * by using them in a FOREACH_OPTION switch, as they would be used in real code. */
static void test_macros_parse_one( static void test_macros_parse_one(
char **argv, char **argv,
@@ -756,27 +752,25 @@ static void test_macros_parse_one(
for (const Entry *e = entries; e && (e->long_code || e->short_code != 0); e++) for (const Entry *e = entries; e && (e->long_code || e->short_code != 0); e++)
n_entries++; n_entries++;
OptionParser state = { argc, argv, mode }; OptionParser opts = { argc, argv, mode };
const Option *opt;
const char *arg;
FOREACH_OPTION_FULL(&state, c, &opt, &arg, ASSERT_TRUE(false)) { FOREACH_OPTION(c, &opts, assert_not_reached()) {
log_debug("%c %s: %s=%s", log_debug("%c %s: %s=%s",
opt->short_code != 0 ? opt->short_code : ' ', opts.opt->short_code != 0 ? opts.opt->short_code : ' ',
opt->long_code ?: "", opts.opt->long_code ?: "",
strnull(opt->metavar), strnull(arg)); strnull(opts.opt->metavar), strnull(opts.arg));
ASSERT_LT(i, n_entries); ASSERT_LT(i, n_entries);
if (entries[i].long_code) if (entries[i].long_code)
ASSERT_TRUE(streq_ptr(opt->long_code, entries[i].long_code)); ASSERT_TRUE(streq_ptr(opts.opt->long_code, entries[i].long_code));
if (entries[i].short_code != 0) if (entries[i].short_code != 0)
ASSERT_EQ(opt->short_code, entries[i].short_code); ASSERT_EQ(opts.opt->short_code, entries[i].short_code);
ASSERT_TRUE(streq_ptr(arg, entries[i].argument)); ASSERT_TRUE(streq_ptr(opts.arg, entries[i].argument));
if (streq_ptr(entries[i].long_code, "optional2")) if (streq_ptr(entries[i].long_code, "optional2"))
ASSERT_EQ(opt->data, 666u); ASSERT_EQ(opts.opt->data, 666u);
else else
ASSERT_EQ(opt->data, 0u); ASSERT_EQ(opts.opt->data, 0u);
i++; i++;
@@ -828,9 +822,11 @@ static void test_macros_parse_one(
ASSERT_EQ(i, n_entries); ASSERT_EQ(i, n_entries);
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
ASSERT_TRUE(strv_equal(args, remaining)); ASSERT_TRUE(strv_equal(args, remaining));
ASSERT_STREQ(argv[0], saved_argv0); ASSERT_STREQ(argv[0], saved_argv0);
ASSERT_NULL(opts.opt);
ASSERT_NULL(opts.arg);
} }
TEST(option_macros) { TEST(option_macros) {
@@ -1202,19 +1198,19 @@ TEST(option_optional_arg_consume) {
char **argv = STRV_MAKE("arg0", "--user", "someuser", "pos1"); char **argv = STRV_MAKE("arg0", "--user", "someuser", "pos1");
int argc = strv_length(argv); int argc = strv_length(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const Option *opt;
const char *arg;
ASSERT_OK_POSITIVE(option_parse(options, options + 3, &state, &opt, &arg)); ASSERT_OK_POSITIVE(option_parse(options, options + 3, &opts));
ASSERT_STREQ(opt->long_code, "user"); ASSERT_STREQ(opts.opt->long_code, "user");
ASSERT_NULL(arg); ASSERT_NULL(opts.arg);
ASSERT_STREQ(option_parser_next_arg(&state), "someuser"); ASSERT_STREQ(option_parser_next_arg(&opts), "someuser");
ASSERT_STREQ(option_parser_consume_next_arg(&state), "someuser"); ASSERT_STREQ(option_parser_consume_next_arg(&opts), "someuser");
ASSERT_EQ(option_parse(options, options + 3, &state, &opt, &arg), 0); ASSERT_EQ(option_parse(options, options + 3, &opts), 0);
ASSERT_NULL(opts.opt);
ASSERT_NULL(opts.arg);
ASSERT_TRUE(strv_equal(option_parser_get_args(&state), STRV_MAKE("pos1"))); ASSERT_TRUE(strv_equal(option_parser_get_args(&opts), STRV_MAKE("pos1")));
} }
/* --user at end of args: no next arg, so scope mode */ /* --user at end of args: no next arg, so scope mode */
@@ -1222,19 +1218,19 @@ TEST(option_optional_arg_consume) {
char **argv = STRV_MAKE("arg0", "--user"); char **argv = STRV_MAKE("arg0", "--user");
int argc = strv_length(argv); int argc = strv_length(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const Option *opt;
const char *arg;
ASSERT_OK_POSITIVE(option_parse(options, options + 3, &state, &opt, &arg)); ASSERT_OK_POSITIVE(option_parse(options, options + 3, &opts));
ASSERT_STREQ(opt->long_code, "user"); ASSERT_STREQ(opts.opt->long_code, "user");
ASSERT_NULL(arg); ASSERT_NULL(opts.arg);
ASSERT_NULL(option_parser_next_arg(&state)); ASSERT_NULL(option_parser_next_arg(&opts));
ASSERT_NULL(option_parser_consume_next_arg(&state)); ASSERT_NULL(option_parser_consume_next_arg(&opts));
ASSERT_EQ(option_parse(options, options + 3, &state, &opt, &arg), 0); ASSERT_EQ(option_parse(options, options + 3, &opts), 0);
ASSERT_NULL(opts.opt);
ASSERT_NULL(opts.arg);
ASSERT_TRUE(strv_isempty(option_parser_get_args(&state))); ASSERT_TRUE(strv_isempty(option_parser_get_args(&opts)));
} }
/* --user followed by -u (option): scope mode, -u gets its own processing */ /* --user followed by -u (option): scope mode, -u gets its own processing */
@@ -1242,24 +1238,24 @@ TEST(option_optional_arg_consume) {
char **argv = STRV_MAKE("arg0", "--user", "-u", "nobody"); char **argv = STRV_MAKE("arg0", "--user", "-u", "nobody");
int argc = strv_length(argv); int argc = strv_length(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const Option *opt;
const char *arg;
ASSERT_OK_POSITIVE(option_parse(options, options + 3, &state, &opt, &arg)); ASSERT_OK_POSITIVE(option_parse(options, options + 3, &opts));
ASSERT_STREQ(opt->long_code, "user"); ASSERT_STREQ(opts.opt->long_code, "user");
ASSERT_NULL(arg); ASSERT_NULL(opts.arg);
ASSERT_STREQ(option_parser_next_arg(&state), "-u"); ASSERT_STREQ(option_parser_next_arg(&opts), "-u");
ASSERT_OK_POSITIVE(option_parse(options, options + 3, &state, &opt, &arg)); ASSERT_OK_POSITIVE(option_parse(options, options + 3, &opts));
ASSERT_STREQ(opt->long_code, "uid"); ASSERT_STREQ(opts.opt->long_code, "uid");
ASSERT_STREQ(arg, "nobody"); ASSERT_STREQ(opts.arg, "nobody");
ASSERT_NULL(option_parser_next_arg(&state)); ASSERT_NULL(option_parser_next_arg(&opts));
ASSERT_NULL(option_parser_consume_next_arg(&state)); ASSERT_NULL(option_parser_consume_next_arg(&opts));
ASSERT_EQ(option_parse(options, options + 3, &state, &opt, &arg), 0); ASSERT_EQ(option_parse(options, options + 3, &opts), 0);
ASSERT_NULL(opts.opt);
ASSERT_NULL(opts.arg);
ASSERT_TRUE(strv_isempty(option_parser_get_args(&state))); ASSERT_TRUE(strv_isempty(option_parser_get_args(&opts)));
} }
/* "Functional test": --user followed by -u (option): scope mode, -u gets its own processing, /* "Functional test": --user followed by -u (option): scope mode, -u gets its own processing,
@@ -1268,20 +1264,20 @@ TEST(option_optional_arg_consume) {
char **argv = STRV_MAKE("arg0", "--user", "-u", "nobody", "nogroup", "--user=nobody", "--user"); char **argv = STRV_MAKE("arg0", "--user", "-u", "nobody", "nogroup", "--user=nobody", "--user");
int argc = strv_length(argv); int argc = strv_length(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const Option *opt;
const char *arg;
int scope_seen = 0; int scope_seen = 0;
int nobody_seen = 0; int nobody_seen = 0;
for (int c; (c = option_parse(options, options + 3, &state, &opt, &arg)) != 0; ) { for (int c; (c = option_parse(options, options + 3, &opts)) != 0; ) {
ASSERT_OK(c); ASSERT_OK(c);
if (streq_ptr(opt->long_code, "user")) { if (streq_ptr(opts.opt->long_code, "user")) {
const char *arg = opts.arg;
if (!arg) { if (!arg) {
const char *t = option_parser_next_arg(&state); const char *t = option_parser_next_arg(&opts);
if (t && t[0] != '-') if (t && t[0] != '-')
arg = option_parser_consume_next_arg(&state); arg = option_parser_consume_next_arg(&opts);
} }
if (arg) { if (arg) {
@@ -1290,15 +1286,17 @@ TEST(option_optional_arg_consume) {
} else } else
scope_seen ++; scope_seen ++;
} else if (streq_ptr(opt->long_code, "uid")) { } else if (streq_ptr(opts.opt->long_code, "uid")) {
ASSERT_STREQ(arg, "nobody"); ASSERT_STREQ(opts.arg, "nobody");
nobody_seen ++; nobody_seen ++;
} }
} }
ASSERT_EQ(nobody_seen, 2); ASSERT_EQ(nobody_seen, 2);
ASSERT_EQ(scope_seen, 2); ASSERT_EQ(scope_seen, 2);
ASSERT_TRUE(strv_equal(option_parser_get_args(&state), STRV_MAKE("nogroup"))); ASSERT_TRUE(strv_equal(option_parser_get_args(&opts), STRV_MAKE("nogroup")));
ASSERT_NULL(opts.opt);
ASSERT_NULL(opts.arg);
} }
} }
+7 -9
View File
@@ -947,11 +947,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const Option *current;
const char *arg;
FOREACH_OPTION_FULL(&state, c, &current, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
@@ -969,11 +967,11 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_COMMON_HOST: OPTION_COMMON_HOST:
arg_transport = BUS_TRANSPORT_REMOTE; arg_transport = BUS_TRANSPORT_REMOTE;
arg_host = arg; arg_host = opts.arg;
break; break;
OPTION_COMMON_MACHINE: OPTION_COMMON_MACHINE:
r = parse_machine_argument(arg, &arg_host, &arg_transport); r = parse_machine_argument(opts.arg, &arg_host, &arg_transport);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -988,14 +986,14 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION('p', "property", "NAME", "Show only properties by this name"): {} OPTION('p', "property", "NAME", "Show only properties by this name"): {}
OPTION_SHORT('P', "NAME", "Equivalent to --value --property=NAME"): OPTION_SHORT('P', "NAME", "Equivalent to --value --property=NAME"):
r = strv_extend(&arg_property, arg); r = strv_extend(&arg_property, opts.arg);
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
/* If the user asked for a particular property, show it to them, even if empty. */ /* If the user asked for a particular property, show it to them, even if empty. */
SET_FLAG(arg_print_flags, BUS_PRINT_PROPERTY_SHOW_EMPTY, true); SET_FLAG(arg_print_flags, BUS_PRINT_PROPERTY_SHOW_EMPTY, true);
if (current->short_code == 'P') if (opts.opt->short_code == 'P')
SET_FLAG(arg_print_flags, BUS_PRINT_PROPERTY_ONLY_VALUE, true); SET_FLAG(arg_print_flags, BUS_PRINT_PROPERTY_ONLY_VALUE, true);
break; break;
@@ -1008,7 +1006,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+4 -5
View File
@@ -43,18 +43,17 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert_se(argc >= 0); assert_se(argc >= 0);
assert_se(argv); assert_se(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION('r', "root", "PATH", "Operate on an alternate filesystem root"): OPTION('r', "root", "PATH", "Operate on an alternate filesystem root"):
arg_root = arg; arg_root = opts.arg;
break; break;
} }
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 0; return 0;
} }
+12 -13
View File
@@ -4187,10 +4187,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_LONG("create", NULL, "Create and adjust files and directories"): OPTION_LONG("create", NULL, "Create and adjust files and directories"):
@@ -4240,12 +4239,12 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("prefix", "PATH", "Only apply rules with the specified prefix"): OPTION_LONG("prefix", "PATH", "Only apply rules with the specified prefix"):
if (strv_extend(&arg_include_prefixes, arg) < 0) if (strv_extend(&arg_include_prefixes, opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
OPTION_LONG("exclude-prefix", "PATH", "Ignore rules with the specified prefix"): OPTION_LONG("exclude-prefix", "PATH", "Ignore rules with the specified prefix"):
if (strv_extend(&arg_exclude_prefixes, arg) < 0) if (strv_extend(&arg_exclude_prefixes, opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
@@ -4256,13 +4255,13 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("root", "PATH", "Operate on an alternate filesystem root"): OPTION_LONG("root", "PATH", "Operate on an alternate filesystem root"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_root); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("image", "PATH", "Operate on disk image as filesystem root"): OPTION_LONG("image", "PATH", "Operate on disk image as filesystem root"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_image); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_image);
if (r < 0) if (r < 0)
return r; return r;
@@ -4273,20 +4272,20 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("image-policy", "POLICY", "Specify disk image dissection policy"): OPTION_LONG("image-policy", "POLICY", "Specify disk image dissection policy"):
r = parse_image_policy_argument(arg, &arg_image_policy); r = parse_image_policy_argument(opts.arg, &arg_image_policy);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("replace", "PATH", "Treat arguments as replacement for PATH"): OPTION_LONG("replace", "PATH", "Treat arguments as replacement for PATH"):
if (!path_is_absolute(arg)) if (!path_is_absolute(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"The argument to --replace= must be an absolute path."); "The argument to --replace= must be an absolute path.");
if (!endswith(arg, ".conf")) if (!endswith(opts.arg, ".conf"))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"The argument to --replace= must have the extension '.conf'."); "The argument to --replace= must have the extension '.conf'.");
arg_replace = arg; arg_replace = opts.arg;
break; break;
OPTION_LONG("dry-run", NULL, "Just print what would be done"): OPTION_LONG("dry-run", NULL, "Just print what would be done"):
@@ -4302,8 +4301,8 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
size_t n_args = option_parser_get_n_args(&state); size_t n_args = option_parser_get_n_args(&opts);
if (arg_operation == 0 && arg_cat_flags == CAT_CONFIG_OFF) if (arg_operation == 0 && arg_cat_flags == CAT_CONFIG_OFF)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+3 -3
View File
@@ -50,9 +50,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
FOREACH_OPTION(&state, c, /* ret_a= */ NULL, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -66,7 +66,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
} }
if (option_parser_get_n_args(&state) != 0) if (option_parser_get_n_args(&opts) != 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program expects no arguments."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program expects no arguments.");
return 1; return 1;
+7 -8
View File
@@ -76,10 +76,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -89,17 +88,17 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
OPTION_LONG("tpm2-device", "PATH", "Pick TPM2 device"): OPTION_LONG("tpm2-device", "PATH", "Pick TPM2 device"):
if (streq(arg, "list")) if (streq(opts.arg, "list"))
return tpm2_list_devices(/* legend= */ true, /* quiet= */ false); return tpm2_list_devices(/* legend= */ true, /* quiet= */ false);
if (free_and_strdup(&arg_tpm2_device, streq(arg, "auto") ? NULL : arg) < 0) if (free_and_strdup(&arg_tpm2_device, streq(opts.arg, "auto") ? NULL : opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
OPTION_LONG("early", "BOOL", "Store SRK public key in /run/ rather than /var/lib/"): OPTION_LONG("early", "BOOL", "Store SRK public key in /run/ rather than /var/lib/"):
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --early= argument: %s", arg); return log_error_errno(r, "Failed to parse --early= argument: %s", opts.arg);
arg_early = r; arg_early = r;
break; break;
@@ -109,7 +108,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
} }
if (option_parser_get_n_args(&state) != 0) if (option_parser_get_n_args(&opts) != 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program expects no argument."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program expects no argument.");
return 1; return 1;
@@ -472,11 +472,10 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -509,19 +508,19 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "console", "DEVICE", OPTION_LONG_FLAGS(OPTION_OPTIONAL_ARG, "console", "DEVICE",
"Ask question on /dev/console (or DEVICE if specified) instead of the current TTY"): "Ask question on /dev/console (or DEVICE if specified) instead of the current TTY"):
arg_console = true; arg_console = true;
if (arg) { if (opts.arg) {
if (isempty(arg)) if (isempty(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Empty console device path is not allowed."); "Empty console device path is not allowed.");
r = free_and_strdup_warn(&arg_device, arg); r = free_and_strdup_warn(&arg_device, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
} }
break; break;
} }
if (option_parser_get_n_args(&state) > 0) if (option_parser_get_n_args(&opts) > 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"%s takes no arguments.", program_invocation_short_name); "%s takes no arguments.", program_invocation_short_name);
+3 -4
View File
@@ -377,10 +377,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -395,7 +394,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (strv_length(args) != 1) if (strv_length(args) != 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Need exactly one DEVICE argument."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Need exactly one DEVICE argument.");
+3 -4
View File
@@ -918,10 +918,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -953,7 +952,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (strv_length(args) != 1) if (strv_length(args) != 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Need exactly one DEVICE argument."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Need exactly one DEVICE argument.");
+4 -5
View File
@@ -662,10 +662,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -676,11 +675,11 @@ static int parse_argv(int argc, char *argv[]) {
OPTION('F', "from-dump", "FILE", OPTION('F', "from-dump", "FILE",
"Read DMI information from a binary file"): "Read DMI information from a binary file"):
arg_source_file = arg; arg_source_file = opts.arg;
break; break;
} }
if (option_parser_get_n_args(&state) > 0) if (option_parser_get_n_args(&opts) > 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"This program takes no arguments."); "This program takes no arguments.");
+3 -4
View File
@@ -47,10 +47,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -60,7 +59,7 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (strv_length(args) > 1) if (strv_length(args) > 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Error: unexpected argument."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Error: unexpected argument.");
+3 -4
View File
@@ -84,10 +84,9 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
assert(argv); assert(argv);
assert(remaining_args); assert(remaining_args);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -97,7 +96,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
return version(); return version();
} }
*remaining_args = option_parser_get_args(&state); *remaining_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+3 -4
View File
@@ -54,10 +54,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -67,7 +66,7 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (strv_length(args) != 1) if (strv_length(args) != 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Need exactly one DEVICE argument."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Need exactly one DEVICE argument.");
+16 -19
View File
@@ -225,11 +225,10 @@ static int set_options(int argc, char **argv, char *maj_min_dev) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
int r; int r;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -240,26 +239,26 @@ static int set_options(int argc, char **argv, char *maj_min_dev) {
OPTION('d', "device", "PATH", "Device node for SG_IO commands"): OPTION('d', "device", "PATH", "Device node for SG_IO commands"):
dev_specified = true; dev_specified = true;
strscpy(maj_min_dev, MAX_PATH_LEN, arg); strscpy(maj_min_dev, MAX_PATH_LEN, opts.arg);
break; break;
OPTION('f', "config", "PATH", "Location of config file"): OPTION('f', "config", "PATH", "Location of config file"):
strscpy(config_file, MAX_PATH_LEN, arg); strscpy(config_file, MAX_PATH_LEN, opts.arg);
break; break;
OPTION('p', "page", "0x80|0x83|pre-spc3-83", "SCSI page"): OPTION('p', "page", "0x80|0x83|pre-spc3-83", "SCSI page"):
r = parse_page_code(arg, &default_page_code); r = parse_page_code(opts.arg, &default_page_code);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION('s', "sg-version", "3|4", "Use SGv3 or SGv4"): OPTION('s', "sg-version", "3|4", "Use SGv3 or SGv4"):
r = safe_atoi(arg, &sg_version); r = safe_atoi(opts.arg, &sg_version);
if (r < 0) if (r < 0)
return log_error_errno(r, "Invalid SG version '%s'", arg); return log_error_errno(r, "Invalid SG version '%s'", opts.arg);
if (!IN_SET(sg_version, 3, 4)) if (!IN_SET(sg_version, 3, 4))
return log_error_errno(SYNTHETIC_ERRNO(ERANGE), return log_error_errno(SYNTHETIC_ERRNO(ERANGE),
"Unknown SG version '%s'", arg); "Unknown SG version '%s'", opts.arg);
break; break;
OPTION('b', "denylisted", NULL, "Treat device as denylisted"): {} OPTION('b', "denylisted", NULL, "Treat device as denylisted"): {}
@@ -287,7 +286,7 @@ static int set_options(int argc, char **argv, char *maj_min_dev) {
break; break;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (!strv_isempty(args) && !dev_specified) { if (!strv_isempty(args) && !dev_specified) {
dev_specified = true; dev_specified = true;
strscpy(maj_min_dev, MAX_PATH_LEN, args[0]); strscpy(maj_min_dev, MAX_PATH_LEN, args[0]);
@@ -315,26 +314,24 @@ static int per_dev_options(struct scsi_id_device *dev_scsi, int *good_bad, enum
if (newargc > INT_MAX) if (newargc > INT_MAX)
return log_oom(); /* Close enough :) */ return log_oom(); /* Close enough :) */
OptionParser state = { newargc, newargv }; OptionParser opts = { newargc, newargv };
const Option *opt;
const char *arg;
/* We reuse the option parser, but only a subset of the options is supported here. /* We reuse the option parser, but only a subset of the options is supported here.
* If any others are encountered, return an error. */ * If any others are encountered, return an error. */
FOREACH_OPTION_FULL(&state, c, &opt, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
if (opt->short_code == 'b') if (opts.opt->short_code == 'b')
*good_bad = 0; *good_bad = 0;
else if (opt->short_code == 'g') else if (opts.opt->short_code == 'g')
*good_bad = 1; *good_bad = 1;
else if (opt->short_code == 'p') { else if (opts.opt->short_code == 'p') {
r = parse_page_code(arg, page_code); r = parse_page_code(opts.arg, page_code);
if (r < 0) if (r < 0)
return r; return r;
} else } else
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Option %s not supported in the config file.", "Option %s not supported in the config file.",
strnull(option_get_synopsis("", opt, "/", /* show_metavar=*/ false))); strnull(option_get_synopsis("", opts.opt, "/", /* show_metavar=*/ false)));
return 0; return 0;
} }
+3 -4
View File
@@ -41,10 +41,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -54,7 +53,7 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (strv_length(args) != 1) if (strv_length(args) != 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Need exactly one DEVICE argument."); "Need exactly one DEVICE argument.");
+4 -5
View File
@@ -96,10 +96,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
@@ -108,13 +107,13 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
OPTION_LONG("root", "PATH", "Operate on root directory PATH"): OPTION_LONG("root", "PATH", "Operate on root directory PATH"):
r = parse_path_argument(arg, /* suppress_root= */ true, &arg_root); r = parse_path_argument(opts.arg, /* suppress_root= */ true, &arg_root);
if (r < 0) if (r < 0)
return r; return r;
break; break;
} }
if (option_parser_get_n_args(&state) > 0) if (option_parser_get_n_args(&opts) > 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes no arguments."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes no arguments.");
return 1; return 1;
+7 -8
View File
@@ -64,10 +64,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
return help(); return help();
@@ -76,21 +75,21 @@ static int parse_argv(int argc, char *argv[]) {
return version(); return version();
OPTION_LONG("root", "PATH|auto", "Operate relative to the specified path"): OPTION_LONG("root", "PATH|auto", "Operate relative to the specified path"):
if (streq(arg, "auto")) if (streq(opts.arg, "auto"))
r = free_and_strdup_warn(&arg_root, in_initrd() ? "/sysroot" : NULL); r = free_and_strdup_warn(&arg_root, in_initrd() ? "/sysroot" : NULL);
else { else {
if (!path_is_absolute(arg)) if (!path_is_absolute(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"--root= argument must be 'auto' or absolute path, got: %s", arg); "--root= argument must be 'auto' or absolute path, got: %s", opts.arg);
r = parse_path_argument(arg, /* suppress_root= */ true, &arg_root); r = parse_path_argument(opts.arg, /* suppress_root= */ true, &arg_root);
} }
if (r < 0) if (r < 0)
return r; return r;
break; break;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (strv_length(args) != 1) if (strv_length(args) != 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+16 -17
View File
@@ -124,10 +124,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -165,7 +164,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_COMMON_JSON: OPTION_COMMON_JSON:
r = parse_json_argument(arg, &arg_json_format_flags); r = parse_json_argument(opts.arg, &arg_json_format_flags);
if (r <= 0) if (r <= 0)
return r; return r;
break; break;
@@ -179,25 +178,25 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
break; break;
OPTION_LONG("graceful", "ERROR", "Treat specified Varlink error as success"): OPTION_LONG("graceful", "ERROR", "Treat specified Varlink error as success"):
r = varlink_idl_qualified_symbol_name_is_valid(arg); r = varlink_idl_qualified_symbol_name_is_valid(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to validate Varlink error name '%s': %m", arg); return log_error_errno(r, "Failed to validate Varlink error name '%s': %m", opts.arg);
if (r == 0) if (r == 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Not a valid Varlink error name: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Not a valid Varlink error name: %s", opts.arg);
if (strv_extend(&arg_graceful, arg) < 0) if (strv_extend(&arg_graceful, opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
OPTION_LONG("timeout", "SECS", "Maximum time to wait for method call completion"): OPTION_LONG("timeout", "SECS", "Maximum time to wait for method call completion"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_timeout = USEC_INFINITY; arg_timeout = USEC_INFINITY;
break; break;
} }
r = parse_sec(arg, &arg_timeout); r = parse_sec(opts.arg, &arg_timeout);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --timeout= parameter '%s': %m", arg); return log_error_errno(r, "Failed to parse --timeout= parameter '%s': %m", opts.arg);
if (arg_timeout == 0) if (arg_timeout == 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Timeout cannot be zero."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Timeout cannot be zero.");
@@ -223,17 +222,17 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return log_oom(); return log_oom();
_cleanup_close_ int add_fd = -EBADF; _cleanup_close_ int add_fd = -EBADF;
if (STARTSWITH_SET(arg, "/", "./")) { if (STARTSWITH_SET(opts.arg, "/", "./")) {
/* We usually expect a numeric fd spec, but as an extension let's treat this /* We usually expect a numeric fd spec, but as an extension let's treat this
* as a path to open in read-only mode in case this is clearly an absolute or * as a path to open in read-only mode in case this is clearly an absolute or
* relative path */ * relative path */
add_fd = open(arg, O_CLOEXEC|O_RDONLY|O_NOCTTY); add_fd = open(opts.arg, O_CLOEXEC|O_RDONLY|O_NOCTTY);
if (add_fd < 0) if (add_fd < 0)
return log_error_errno(errno, "Failed to open '%s': %m", arg); return log_error_errno(errno, "Failed to open '%s': %m", opts.arg);
} else { } else {
int parsed_fd = parse_fd(arg); int parsed_fd = parse_fd(opts.arg);
if (parsed_fd < 0) if (parsed_fd < 0)
return log_error_errno(parsed_fd, "Failed to parse --push-fd= parameter: %s", arg); return log_error_errno(parsed_fd, "Failed to parse --push-fd= parameter: %s", opts.arg);
/* Make a copy, so that the same fd could be used multiple times in a reasonable /* Make a copy, so that the same fd could be used multiple times in a reasonable
* way. This also validates the fd early */ * way. This also validates the fd early */
@@ -253,7 +252,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
strv_sort_uniq(arg_graceful); strv_sort_uniq(arg_graceful);
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }
+98 -99
View File
@@ -325,11 +325,9 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv, OPTION_PARSER_STOP_AT_FIRST_NONOPTION }; OptionParser opts = { argc, argv, OPTION_PARSER_STOP_AT_FIRST_NONOPTION };
const Option *current;
const char *arg;
FOREACH_OPTION_FULL(&state, c, &current, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION_COMMON_HELP: OPTION_COMMON_HELP:
@@ -361,7 +359,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_GROUP("Image"): {} OPTION_GROUP("Image"): {}
OPTION('D', "directory", "PATH", "Root directory for the VM"): OPTION('D', "directory", "PATH", "Root directory for the VM"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_directory); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_directory);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -371,31 +369,31 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION('i', "image", "FILE|DEVICE", "Root file system disk image or device for the VM"): OPTION('i', "image", "FILE|DEVICE", "Root file system disk image or device for the VM"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_image); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_image);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("image-format", "FORMAT", "Specify disk image format (raw, qcow2; default: raw)"): OPTION_LONG("image-format", "FORMAT", "Specify disk image format (raw, qcow2; default: raw)"):
arg_image_format = image_format_from_string(arg); arg_image_format = image_format_from_string(opts.arg);
if (arg_image_format < 0) if (arg_image_format < 0)
return log_error_errno(arg_image_format, return log_error_errno(arg_image_format,
"Invalid image format: %s", arg); "Invalid image format: %s", opts.arg);
break; break;
OPTION_LONG("image-disk-type", "TYPE", OPTION_LONG("image-disk-type", "TYPE",
"Specify disk type (virtio-blk, virtio-scsi, nvme, scsi-cd; default: virtio-blk)"): "Specify disk type (virtio-blk, virtio-scsi, nvme, scsi-cd; default: virtio-blk)"):
arg_image_disk_type = disk_type_from_string(arg); arg_image_disk_type = disk_type_from_string(opts.arg);
if (arg_image_disk_type < 0) if (arg_image_disk_type < 0)
return log_error_errno(arg_image_disk_type, return log_error_errno(arg_image_disk_type,
"Invalid image disk type: %s", arg); "Invalid image disk type: %s", opts.arg);
break; break;
OPTION_GROUP("Host Configuration"): {} OPTION_GROUP("Host Configuration"): {}
OPTION_LONG("cpus", "CPUS", "Configure number of CPUs in guest"): {} OPTION_LONG("cpus", "CPUS", "Configure number of CPUs in guest"): {}
OPTION_LONG("qemu-smp", "CPUS", /* help= */ NULL): /* Compat alias */ OPTION_LONG("qemu-smp", "CPUS", /* help= */ NULL): /* Compat alias */
r = free_and_strdup_warn(&arg_cpus, arg); r = free_and_strdup_warn(&arg_cpus, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -403,34 +401,34 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("ram", "BYTES[:MAXBYTES[:SLOTS]]", OPTION_LONG("ram", "BYTES[:MAXBYTES[:SLOTS]]",
"Configure guest's RAM size (and max/slots for hotplug)"): {} "Configure guest's RAM size (and max/slots for hotplug)"): {}
OPTION_LONG("qemu-mem", "BYTES", /* help= */ NULL): /* Compat alias */ OPTION_LONG("qemu-mem", "BYTES", /* help= */ NULL): /* Compat alias */
r = parse_ram(arg); r = parse_ram(opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("kvm", "BOOL", "Enable use of KVM"): {} OPTION_LONG("kvm", "BOOL", "Enable use of KVM"): {}
OPTION_LONG("qemu-kvm", "BOOL", /* help= */ NULL): /* Compat alias */ OPTION_LONG("qemu-kvm", "BOOL", /* help= */ NULL): /* Compat alias */
r = parse_tristate_argument_with_auto("--kvm=", arg, &arg_kvm); r = parse_tristate_argument_with_auto("--kvm=", opts.arg, &arg_kvm);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("vsock", "BOOL", "Override autodetection of VSOCK support"): {} OPTION_LONG("vsock", "BOOL", "Override autodetection of VSOCK support"): {}
OPTION_LONG("qemu-vsock", "BOOL", /* help= */ NULL): /* Compat alias */ OPTION_LONG("qemu-vsock", "BOOL", /* help= */ NULL): /* Compat alias */
r = parse_tristate_argument_with_auto("--vsock=", arg, &arg_vsock); r = parse_tristate_argument_with_auto("--vsock=", opts.arg, &arg_vsock);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("vsock-cid", "CID", "Specify the CID to use for the guest's VSOCK support"): OPTION_LONG("vsock-cid", "CID", "Specify the CID to use for the guest's VSOCK support"):
if (isempty(arg)) if (isempty(opts.arg))
arg_vsock_cid = VMADDR_CID_ANY; arg_vsock_cid = VMADDR_CID_ANY;
else { else {
unsigned cid; unsigned cid;
r = vsock_parse_cid(arg, &cid); r = vsock_parse_cid(opts.arg, &cid);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --vsock-cid: %s", arg); return log_error_errno(r, "Failed to parse --vsock-cid: %s", opts.arg);
if (!VSOCK_CID_IS_REGULAR(cid)) if (!VSOCK_CID_IS_REGULAR(cid))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Specified CID is not regular, refusing: %u", cid); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Specified CID is not regular, refusing: %u", cid);
@@ -439,28 +437,28 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("tpm", "BOOL", "Enable use of a virtual TPM"): OPTION_LONG("tpm", "BOOL", "Enable use of a virtual TPM"):
r = parse_tristate_argument_with_auto("--tpm=", arg, &arg_tpm); r = parse_tristate_argument_with_auto("--tpm=", opts.arg, &arg_tpm);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("tpm-state", "off|auto|PATH", "Where to store TPM state"): OPTION_LONG("tpm-state", "off|auto|PATH", "Where to store TPM state"):
r = isempty(arg) ? false : r = isempty(opts.arg) ? false :
streq(arg, "auto") ? true : streq(opts.arg, "auto") ? true :
parse_boolean(arg); parse_boolean(opts.arg);
if (r >= 0) { if (r >= 0) {
arg_tpm_state_mode = r ? STATE_AUTO : STATE_OFF; arg_tpm_state_mode = r ? STATE_AUTO : STATE_OFF;
arg_tpm_state_path = mfree(arg_tpm_state_path); arg_tpm_state_path = mfree(arg_tpm_state_path);
break; break;
} }
if (!path_is_valid(arg)) if (!path_is_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid path in --tpm-state= parameter: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid path in --tpm-state= parameter: %s", opts.arg);
if (!path_is_absolute(arg) && !startswith(arg, "./")) if (!path_is_absolute(opts.arg) && !startswith(opts.arg, "./"))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Path in --tpm-state= parameter must be absolute or start with './': %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Path in --tpm-state= parameter must be absolute or start with './': %s", opts.arg);
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_tpm_state_path); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_tpm_state_path);
if (r < 0) if (r < 0)
return r; return r;
@@ -468,31 +466,31 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("efi-nvram-template", "PATH", "Set the path to the EFI NVRAM template file to use"): OPTION_LONG("efi-nvram-template", "PATH", "Set the path to the EFI NVRAM template file to use"):
if (!isempty(arg) && !path_is_absolute(arg) && !startswith(arg, "./")) if (!isempty(opts.arg) && !path_is_absolute(opts.arg) && !startswith(opts.arg, "./"))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Absolute path or path starting with './' required."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Absolute path or path starting with './' required.");
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_efi_nvram_template); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_efi_nvram_template);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("efi-nvram-state", "off|auto|PATH", "Where to store EFI Variable NVRAM state"): OPTION_LONG("efi-nvram-state", "off|auto|PATH", "Where to store EFI Variable NVRAM state"):
r = isempty(arg) ? false : r = isempty(opts.arg) ? false :
streq(arg, "auto") ? true : streq(opts.arg, "auto") ? true :
parse_boolean(arg); parse_boolean(opts.arg);
if (r >= 0) { if (r >= 0) {
arg_efi_nvram_state_mode = r ? STATE_AUTO : STATE_OFF; arg_efi_nvram_state_mode = r ? STATE_AUTO : STATE_OFF;
arg_efi_nvram_state_path = mfree(arg_efi_nvram_state_path); arg_efi_nvram_state_path = mfree(arg_efi_nvram_state_path);
break; break;
} }
if (!path_is_valid(arg)) if (!path_is_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid path in --efi-nvram-state= parameter: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid path in --efi-nvram-state= parameter: %s", opts.arg);
if (!path_is_absolute(arg) && !startswith(arg, "./")) if (!path_is_absolute(opts.arg) && !startswith(opts.arg, "./"))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Path in --efi-nvram-state= parameter must be absolute or start with './': %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Path in --efi-nvram-state= parameter must be absolute or start with './': %s", opts.arg);
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_efi_nvram_state_path); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_efi_nvram_state_path);
if (r < 0) if (r < 0)
return r; return r;
@@ -500,14 +498,14 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("linux", "PATH", "Specify the linux kernel for direct kernel boot"): OPTION_LONG("linux", "PATH", "Specify the linux kernel for direct kernel boot"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_linux); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_linux);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("initrd", "PATH", "Specify the initrd for direct kernel boot"): { OPTION_LONG("initrd", "PATH", "Specify the initrd for direct kernel boot"): {
_cleanup_free_ char *initrd_path = NULL; _cleanup_free_ char *initrd_path = NULL;
r = parse_path_argument(arg, /* suppress_root= */ false, &initrd_path); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &initrd_path);
if (r < 0) if (r < 0)
return r; return r;
@@ -528,7 +526,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("secure-boot", "BOOL|auto", "Enable searching for firmware supporting SecureBoot"): { OPTION_LONG("secure-boot", "BOOL|auto", "Enable searching for firmware supporting SecureBoot"): {
int b; int b;
r = parse_tristate_argument_with_auto("--secure-boot=", arg, &b); r = parse_tristate_argument_with_auto("--secure-boot=", opts.arg, &b);
if (r < 0) if (r < 0)
return r; return r;
@@ -545,14 +543,14 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("firmware", "auto|uefi|bios|none|PATH|list|describe", OPTION_LONG("firmware", "auto|uefi|bios|none|PATH|list|describe",
"Select firmware to use, or a firmware definition file (or list/describe available)"): { "Select firmware to use, or a firmware definition file (or list/describe available)"): {
if (isempty(arg) || streq(arg, "auto")) { if (isempty(opts.arg) || streq(opts.arg, "auto")) {
arg_firmware = mfree(arg_firmware); arg_firmware = mfree(arg_firmware);
arg_firmware_type = _FIRMWARE_INVALID; arg_firmware_type = _FIRMWARE_INVALID;
arg_firmware_describe = false; arg_firmware_describe = false;
break; break;
} }
if (streq(arg, "list")) { if (streq(opts.arg, "list")) {
_cleanup_strv_free_ char **l = NULL; _cleanup_strv_free_ char **l = NULL;
r = list_ovmf_config(&l); r = list_ovmf_config(&l);
@@ -567,7 +565,7 @@ static int parse_argv(int argc, char *argv[]) {
return 0; return 0;
} }
if (streq(arg, "describe")) { if (streq(opts.arg, "describe")) {
/* Handled after argument parsing so that --firmware-features= is /* Handled after argument parsing so that --firmware-features= is
* taken into account. */ * taken into account. */
arg_firmware = mfree(arg_firmware); arg_firmware = mfree(arg_firmware);
@@ -577,7 +575,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
} }
Firmware f = firmware_from_string(arg); Firmware f = firmware_from_string(opts.arg);
if (f >= 0) { if (f >= 0) {
arg_firmware = mfree(arg_firmware); arg_firmware = mfree(arg_firmware);
arg_firmware_type = f; arg_firmware_type = f;
@@ -585,12 +583,12 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
} }
if (!path_is_absolute(arg) && !startswith(arg, "./")) if (!path_is_absolute(opts.arg) && !startswith(opts.arg, "./"))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Expected one of 'auto', 'uefi', 'bios', 'none', 'list', 'describe', or an absolute path or path starting with './', got: %s", "Expected one of 'auto', 'uefi', 'bios', 'none', 'list', 'describe', or an absolute path or path starting with './', got: %s",
arg); opts.arg);
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_firmware); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_firmware);
if (r < 0) if (r < 0)
return r; return r;
@@ -601,13 +599,13 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("firmware-features", "FEATURE,...|list", OPTION_LONG("firmware-features", "FEATURE,...|list",
"Require/exclude specific firmware features"): { "Require/exclude specific firmware features"): {
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_firmware_features_include = set_free(arg_firmware_features_include); arg_firmware_features_include = set_free(arg_firmware_features_include);
arg_firmware_features_exclude = set_free(arg_firmware_features_exclude); arg_firmware_features_exclude = set_free(arg_firmware_features_exclude);
break; break;
} }
if (streq(arg, "list")) { if (streq(opts.arg, "list")) {
_cleanup_strv_free_ char **l = NULL; _cleanup_strv_free_ char **l = NULL;
r = list_ovmf_firmware_features(&l); r = list_ovmf_firmware_features(&l);
@@ -622,7 +620,7 @@ static int parse_argv(int argc, char *argv[]) {
return 0; return 0;
} }
_cleanup_strv_free_ char **features = strv_split(arg, ","); _cleanup_strv_free_ char **features = strv_split(opts.arg, ",");
if (!features) if (!features)
return log_oom(); return log_oom();
@@ -636,39 +634,39 @@ static int parse_argv(int argc, char *argv[]) {
} }
OPTION_LONG("discard-disk", "BOOL", "Control processing of discard requests"): OPTION_LONG("discard-disk", "BOOL", "Control processing of discard requests"):
r = parse_boolean_argument("--discard-disk=", arg, &arg_discard_disk); r = parse_boolean_argument("--discard-disk=", opts.arg, &arg_discard_disk);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION('G', "grow-image", "BYTES", "Grow image file to specified size in bytes"): OPTION('G', "grow-image", "BYTES", "Grow image file to specified size in bytes"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_grow_image = 0; arg_grow_image = 0;
break; break;
} }
r = parse_size(arg, 1024, &arg_grow_image); r = parse_size(opts.arg, 1024, &arg_grow_image);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --grow-image= parameter: %s", arg); return log_error_errno(r, "Failed to parse --grow-image= parameter: %s", opts.arg);
break; break;
OPTION_GROUP("Execution"): {} OPTION_GROUP("Execution"): {}
OPTION('s', "smbios11", "STRING", "Pass an arbitrary SMBIOS Type #11 string to the VM"): OPTION('s', "smbios11", "STRING", "Pass an arbitrary SMBIOS Type #11 string to the VM"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_smbios11 = strv_free(arg_smbios11); arg_smbios11 = strv_free(arg_smbios11);
break; break;
} }
if (!utf8_is_valid(arg)) if (!utf8_is_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "SMBIOS Type 11 string is not UTF-8 clean, refusing: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "SMBIOS Type 11 string is not UTF-8 clean, refusing: %s", opts.arg);
if (strv_extend(&arg_smbios11, arg) < 0) if (strv_extend(&arg_smbios11, opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
OPTION_LONG("notify-ready", "BOOL", "Wait for ready notification from the VM"): OPTION_LONG("notify-ready", "BOOL", "Wait for ready notification from the VM"):
r = parse_boolean_argument("--notify-ready=", arg, &arg_notify_ready); r = parse_boolean_argument("--notify-ready=", opts.arg, &arg_notify_ready);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -676,25 +674,25 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_GROUP("System Identity"): {} OPTION_GROUP("System Identity"): {}
OPTION('M', "machine", "NAME", "Set the machine name for the VM"): OPTION('M', "machine", "NAME", "Set the machine name for the VM"):
if (isempty(arg)) if (isempty(opts.arg))
arg_machine = mfree(arg_machine); arg_machine = mfree(arg_machine);
else { else {
if (!hostname_is_valid(arg, 0)) if (!hostname_is_valid(opts.arg, 0))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Invalid machine name: %s", arg); "Invalid machine name: %s", opts.arg);
r = free_and_strdup(&arg_machine, arg); r = free_and_strdup(&arg_machine, opts.arg);
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
} }
break; break;
OPTION_LONG("uuid", "UUID", "Set a specific machine UUID for the VM"): OPTION_LONG("uuid", "UUID", "Set a specific machine UUID for the VM"):
r = id128_from_string_nonzero(arg, &arg_uuid); r = id128_from_string_nonzero(opts.arg, &arg_uuid);
if (r == -ENXIO) if (r == -ENXIO)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Machine UUID may not be all zeroes."); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Machine UUID may not be all zeroes.");
if (r < 0) if (r < 0)
return log_error_errno(r, "Invalid UUID: %s", arg); return log_error_errno(r, "Invalid UUID: %s", opts.arg);
break; break;
OPTION_GROUP("Properties"): {} OPTION_GROUP("Properties"): {}
@@ -702,21 +700,21 @@ static int parse_argv(int argc, char *argv[]) {
OPTION('S', "slice", "SLICE", "Place the VM in the specified slice"): { OPTION('S', "slice", "SLICE", "Place the VM in the specified slice"): {
_cleanup_free_ char *mangled = NULL; _cleanup_free_ char *mangled = NULL;
r = unit_name_mangle_with_suffix(arg, /* operation= */ NULL, UNIT_NAME_MANGLE_WARN, ".slice", &mangled); r = unit_name_mangle_with_suffix(opts.arg, /* operation= */ NULL, UNIT_NAME_MANGLE_WARN, ".slice", &mangled);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to turn '%s' into unit name: %m", arg); return log_error_errno(r, "Failed to turn '%s' into unit name: %m", opts.arg);
free_and_replace(arg_slice, mangled); free_and_replace(arg_slice, mangled);
break; break;
} }
OPTION_LONG("property", "NAME=VALUE", "Set scope unit property"): OPTION_LONG("property", "NAME=VALUE", "Set scope unit property"):
if (strv_extend(&arg_property, arg) < 0) if (strv_extend(&arg_property, opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
OPTION_LONG("register", "BOOLEAN", "Register VM as machine"): OPTION_LONG("register", "BOOLEAN", "Register VM as machine"):
r = parse_tristate_argument_with_auto("--register=", arg, &arg_register); r = parse_tristate_argument_with_auto("--register=", opts.arg, &arg_register);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -730,7 +728,7 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("private-users", "UIDBASE[:NUIDS]", OPTION_LONG("private-users", "UIDBASE[:NUIDS]",
"Configure the UID/GID range to map into the virtiofsd namespace"): "Configure the UID/GID range to map into the virtiofsd namespace"):
r = parse_userns_uid_range(arg, &arg_uid_shift, &arg_uid_range); r = parse_userns_uid_range(opts.arg, &arg_uid_shift, &arg_uid_range);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -739,10 +737,11 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("bind", "SOURCE[:TARGET]", "Mount a file or directory from the host into the VM"): {} OPTION_LONG("bind", "SOURCE[:TARGET]", "Mount a file or directory from the host into the VM"): {}
OPTION_LONG("bind-ro", "SOURCE[:TARGET]", "Mount a file or directory, but read-only"): { OPTION_LONG("bind-ro", "SOURCE[:TARGET]", "Mount a file or directory, but read-only"): {
bool read_only = streq(current->long_code, "bind-ro"); bool read_only = streq(opts.opt->long_code, "bind-ro");
r = runtime_mount_parse(&arg_runtime_mounts, arg, read_only); r = runtime_mount_parse(&arg_runtime_mounts, opts.arg, read_only);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --%s= argument %s: %m", current->long_code, arg); return log_error_errno(r, "Failed to parse --%s= argument %s: %m",
opts.opt->long_code, opts.arg);
break; break;
} }
@@ -751,7 +750,7 @@ static int parse_argv(int argc, char *argv[]) {
DiskType extra_disk_type = _DISK_TYPE_INVALID; DiskType extra_disk_type = _DISK_TYPE_INVALID;
_cleanup_free_ char *drive_path = NULL; _cleanup_free_ char *drive_path = NULL;
r = parse_disk_spec(arg, &format, &extra_disk_type, &drive_path); r = parse_disk_spec(opts.arg, &format, &extra_disk_type, &drive_path);
if (r < 0) if (r < 0)
return r; return r;
@@ -767,10 +766,10 @@ static int parse_argv(int argc, char *argv[]) {
} }
OPTION_LONG("bind-user", "NAME", "Bind user from host to virtual machine"): OPTION_LONG("bind-user", "NAME", "Bind user from host to virtual machine"):
if (!valid_user_group_name(arg, /* flags= */ 0)) if (!valid_user_group_name(opts.arg, /* flags= */ 0))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid user name to bind: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid user name to bind: %s", opts.arg);
if (strv_extend(&arg_bind_user, arg) < 0) if (strv_extend(&arg_bind_user, opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
@@ -778,11 +777,11 @@ static int parse_argv(int argc, char *argv[]) {
"Configure the shell to use for --bind-user= users"): { "Configure the shell to use for --bind-user= users"): {
bool copy = false; bool copy = false;
char *sh = NULL; char *sh = NULL;
r = parse_user_shell(arg, &sh, &copy); r = parse_user_shell(opts.arg, &sh, &copy);
if (r == -ENOMEM) if (r == -ENOMEM)
return log_oom(); return log_oom();
if (r < 0) if (r < 0)
return log_error_errno(r, "Invalid user shell to bind: %s", arg); return log_error_errno(r, "Invalid user shell to bind: %s", opts.arg);
free_and_replace(arg_bind_user_shell, sh); free_and_replace(arg_bind_user_shell, sh);
arg_bind_user_shell_copy = copy; arg_bind_user_shell_copy = copy;
@@ -790,61 +789,61 @@ static int parse_argv(int argc, char *argv[]) {
} }
OPTION_LONG("bind-user-group", "GROUP", "Add an auxiliary group to --bind-user= users"): OPTION_LONG("bind-user-group", "GROUP", "Add an auxiliary group to --bind-user= users"):
if (!valid_user_group_name(arg, /* flags= */ 0)) if (!valid_user_group_name(opts.arg, /* flags= */ 0))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid bind user auxiliary group name: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid bind user auxiliary group name: %s", opts.arg);
if (strv_extend(&arg_bind_user_groups, arg) < 0) if (strv_extend(&arg_bind_user_groups, opts.arg) < 0)
return log_oom(); return log_oom();
break; break;
OPTION_GROUP("Integration"): {} OPTION_GROUP("Integration"): {}
OPTION_LONG("forward-journal", "FILE|DIR", "Forward the VM's journal to the host"): OPTION_LONG("forward-journal", "FILE|DIR", "Forward the VM's journal to the host"):
r = parse_path_argument(arg, /* suppress_root= */ false, &arg_forward_journal); r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_forward_journal);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("forward-journal-max-use", "BYTES", "Maximum disk space for forwarded journal"): OPTION_LONG("forward-journal-max-use", "BYTES", "Maximum disk space for forwarded journal"):
r = parse_size(arg, 1024, &arg_forward_journal_max_use); r = parse_size(opts.arg, 1024, &arg_forward_journal_max_use);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --forward-journal-max-use= value: %s", optarg); return log_error_errno(r, "Failed to parse --forward-journal-max-use= value: %s", optarg);
break; break;
OPTION_LONG("forward-journal-keep-free", "BYTES", "Minimum disk space to keep free"): OPTION_LONG("forward-journal-keep-free", "BYTES", "Minimum disk space to keep free"):
r = parse_size(arg, 1024, &arg_forward_journal_keep_free); r = parse_size(opts.arg, 1024, &arg_forward_journal_keep_free);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --forward-journal-keep-free= value: %s", optarg); return log_error_errno(r, "Failed to parse --forward-journal-keep-free= value: %s", optarg);
break; break;
OPTION_LONG("forward-journal-max-file-size", "BYTES", "Maximum size of individual journal files"): OPTION_LONG("forward-journal-max-file-size", "BYTES", "Maximum size of individual journal files"):
r = parse_size(arg, 1024, &arg_forward_journal_max_file_size); r = parse_size(opts.arg, 1024, &arg_forward_journal_max_file_size);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --forward-journal-max-file-size= value: %s", optarg); return log_error_errno(r, "Failed to parse --forward-journal-max-file-size= value: %s", optarg);
break; break;
OPTION_LONG("forward-journal-max-files", "N", "Maximum number of journal files to keep"): OPTION_LONG("forward-journal-max-files", "N", "Maximum number of journal files to keep"):
r = safe_atou64(arg, &arg_forward_journal_max_files); r = safe_atou64(opts.arg, &arg_forward_journal_max_files);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --forward-journal-max-files= value: %s", optarg); return log_error_errno(r, "Failed to parse --forward-journal-max-files= value: %s", optarg);
break; break;
OPTION_LONG("pass-ssh-key", "BOOL", "Create an SSH key to access the VM"): OPTION_LONG("pass-ssh-key", "BOOL", "Create an SSH key to access the VM"):
r = parse_boolean_argument("--pass-ssh-key=", arg, &arg_pass_ssh_key); r = parse_boolean_argument("--pass-ssh-key=", opts.arg, &arg_pass_ssh_key);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("ssh-key-type", "TYPE", "Choose what type of SSH key to pass"): OPTION_LONG("ssh-key-type", "TYPE", "Choose what type of SSH key to pass"):
if (isempty(arg)) { if (isempty(opts.arg)) {
arg_ssh_key_type = mfree(arg_ssh_key_type); arg_ssh_key_type = mfree(arg_ssh_key_type);
break; break;
} }
if (!string_is_safe(arg, STRING_ALLOW_GLOBS)) if (!string_is_safe(opts.arg, STRING_ALLOW_GLOBS))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid value for --ssh-key-type=: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid value for --ssh-key-type=: %s", opts.arg);
r = free_and_strdup_warn(&arg_ssh_key_type, arg); r = free_and_strdup_warn(&arg_ssh_key_type, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -853,15 +852,15 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("console", "MODE", OPTION_LONG("console", "MODE",
"Console mode (interactive, native, gui, read-only or headless)"): "Console mode (interactive, native, gui, read-only or headless)"):
arg_console_mode = console_mode_from_string(arg); arg_console_mode = console_mode_from_string(opts.arg);
if (arg_console_mode < 0) if (arg_console_mode < 0)
return log_error_errno(arg_console_mode, "Failed to parse specified console mode: %s", arg); return log_error_errno(arg_console_mode, "Failed to parse specified console mode: %s", opts.arg);
break; break;
OPTION_LONG("console-transport", "TRANSPORT", "Console transport (virtio or serial)"): OPTION_LONG("console-transport", "TRANSPORT", "Console transport (virtio or serial)"):
arg_console_transport = console_transport_from_string(arg); arg_console_transport = console_transport_from_string(opts.arg);
if (arg_console_transport < 0) if (arg_console_transport < 0)
return log_error_errno(arg_console_transport, "Failed to parse specified console transport: %s", arg); return log_error_errno(arg_console_transport, "Failed to parse specified console transport: %s", opts.arg);
break; break;
OPTION_LONG("qemu-gui", NULL, /* help= */ NULL): /* Compat alias */ OPTION_LONG("qemu-gui", NULL, /* help= */ NULL): /* Compat alias */
@@ -869,7 +868,7 @@ static int parse_argv(int argc, char *argv[]) {
break; break;
OPTION_LONG("background", "COLOR", "Set ANSI color for background"): OPTION_LONG("background", "COLOR", "Set ANSI color for background"):
r = parse_background_argument(arg, &arg_background); r = parse_background_argument(opts.arg, &arg_background);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -877,14 +876,14 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_GROUP("Credentials"): {} OPTION_GROUP("Credentials"): {}
OPTION_LONG("set-credential", "ID:VALUE", "Pass a credential with literal value to the VM"): OPTION_LONG("set-credential", "ID:VALUE", "Pass a credential with literal value to the VM"):
r = machine_credential_set(&arg_credentials, arg); r = machine_credential_set(&arg_credentials, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_LONG("load-credential", "ID:PATH", OPTION_LONG("load-credential", "ID:PATH",
"Load credential for the VM from file or AF_UNIX stream socket"): "Load credential for the VM from file or AF_UNIX stream socket"):
r = machine_credential_load(&arg_credentials, arg); r = machine_credential_load(&arg_credentials, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
@@ -931,7 +930,7 @@ static int parse_argv(int argc, char *argv[]) {
arg_uid_range = 0x10000; arg_uid_range = 0x10000;
} }
char **args = option_parser_get_args(&state); char **args = option_parser_get_args(&opts);
if (!strv_isempty(args)) { if (!strv_isempty(args)) {
arg_kernel_cmdline_extra = strv_copy(args); arg_kernel_cmdline_extra = strv_copy(args);
if (!arg_kernel_cmdline_extra) if (!arg_kernel_cmdline_extra)
+25 -26
View File
@@ -99,71 +99,70 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
OptionParser state = { argc, argv }; OptionParser opts = { argc, argv };
const char *arg;
FOREACH_OPTION(&state, c, &arg, /* on_error= */ return c) FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) { switch (c) {
OPTION('B', "basename", "BASENAME", "Look for specified basename"): OPTION('B', "basename", "BASENAME", "Look for specified basename"):
if (!filename_part_is_valid(arg)) if (!filename_part_is_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid basename string: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid basename string: %s", opts.arg);
r = free_and_strdup_warn(&arg_filter_basename, arg); r = free_and_strdup_warn(&arg_filter_basename, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_SHORT('V', "VERSION", "Look for specified version"): OPTION_SHORT('V', "VERSION", "Look for specified version"):
if (!version_is_valid(arg)) if (!version_is_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid version string: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid version string: %s", opts.arg);
r = free_and_strdup_warn(&arg_filter_version, arg); r = free_and_strdup_warn(&arg_filter_version, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION_SHORT('A', "ARCH", "Look for specified architecture"): OPTION_SHORT('A', "ARCH", "Look for specified architecture"):
if (streq(arg, "native")) if (streq(opts.arg, "native"))
arg_filter_architecture = native_architecture(); arg_filter_architecture = native_architecture();
else if (streq(arg, "secondary")) { else if (streq(opts.arg, "secondary")) {
#ifdef ARCHITECTURE_SECONDARY #ifdef ARCHITECTURE_SECONDARY
arg_filter_architecture = ARCHITECTURE_SECONDARY; arg_filter_architecture = ARCHITECTURE_SECONDARY;
#else #else
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Local architecture has no secondary architecture."); return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Local architecture has no secondary architecture.");
#endif #endif
} else if (streq(arg, "uname")) } else if (streq(opts.arg, "uname"))
arg_filter_architecture = uname_architecture(); arg_filter_architecture = uname_architecture();
else if (streq(arg, "auto")) else if (streq(opts.arg, "auto"))
arg_filter_architecture = _ARCHITECTURE_INVALID; arg_filter_architecture = _ARCHITECTURE_INVALID;
else { else {
arg_filter_architecture = architecture_from_string(arg); arg_filter_architecture = architecture_from_string(opts.arg);
if (arg_filter_architecture < 0) if (arg_filter_architecture < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown architecture: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown architecture: %s", opts.arg);
} }
break; break;
OPTION('S', "suffix", "SUFFIX", "Look for specified suffix"): OPTION('S', "suffix", "SUFFIX", "Look for specified suffix"):
if (!filename_part_is_valid(arg)) if (!filename_part_is_valid(opts.arg))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid suffix string: %s", arg); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid suffix string: %s", opts.arg);
r = free_and_strdup_warn(&arg_filter_suffix, arg); r = free_and_strdup_warn(&arg_filter_suffix, opts.arg);
if (r < 0) if (r < 0)
return r; return r;
break; break;
OPTION('t', "type", "TYPE", "Look for specified inode type"): OPTION('t', "type", "TYPE", "Look for specified inode type"):
if (isempty(arg)) if (isempty(opts.arg))
arg_filter_type_mask = 0; arg_filter_type_mask = 0;
else { else {
mode_t m; mode_t m;
m = inode_type_from_string(arg); m = inode_type_from_string(opts.arg);
if (m == MODE_INVALID) if (m == MODE_INVALID)
return log_error_errno(m, "Unknown inode type: %s", arg); return log_error_errno(m, "Unknown inode type: %s", opts.arg);
arg_filter_type_mask |= UINT32_C(1) << IFTODT(m); arg_filter_type_mask |= UINT32_C(1) << IFTODT(m);
} }
@@ -193,17 +192,17 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG_FLAGS(OPTION_HELP_ENTRY, "print", "all", OPTION_LONG_FLAGS(OPTION_HELP_ENTRY, "print", "all",
"... print all of the above"): "... print all of the above"):
if (streq(arg, "arch")) /* accept abbreviation too */ if (streq(opts.arg, "arch")) /* accept abbreviation too */
arg_print = PRINT_ARCHITECTURE; arg_print = PRINT_ARCHITECTURE;
else else
arg_print = print_from_string(arg); arg_print = print_from_string(opts.arg);
if (arg_print < 0) if (arg_print < 0)
return log_error_errno(arg_print, "Unknown --print= argument: %s", arg); return log_error_errno(arg_print, "Unknown --print= argument: %s", opts.arg);
break; break;
OPTION_LONG("resolve", "BOOL", "Canonicalize the result path"): OPTION_LONG("resolve", "BOOL", "Canonicalize the result path"):
r = parse_boolean(arg); r = parse_boolean(opts.arg);
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to parse --resolve= value: %m"); return log_error_errno(r, "Failed to parse --resolve= value: %m");
@@ -214,7 +213,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
if (arg_print < 0) if (arg_print < 0)
arg_print = PRINT_PATH; arg_print = PRINT_PATH;
*ret_args = option_parser_get_args(&state); *ret_args = option_parser_get_args(&opts);
return 1; return 1;
} }