From: Zbigniew Jędrzejewski-Szmek Date: Mon, 27 Apr 2026 21:58:24 +0000 (+0200) Subject: run: reorder switch cases to match help() output order X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ff902c7ccda2165f7c33231a0174384f0d1331b7;p=thirdparty%2Fsystemd.git run: reorder switch cases to match help() output order Both parse_argv() and parse_argv_sudo_mode() handled options in an order that no longer matched the help text. Reorder the case statements so the source order mirrors what the user sees in --help. In parse_argv_sudo_mode(), drop the case 'i' → ARG_VIA_SHELL fall-through so the cases can be sequenced independently; 'i' now sets arg_via_shell directly. Co-developed-by: Claude Opus 4.7 --- diff --git a/src/run/run.c b/src/run/run.c index 596e1282675..60eaeb12d5b 100644 --- a/src/run/run.c +++ b/src/run/run.c @@ -433,6 +433,17 @@ static int parse_argv(int argc, char *argv[]) { arg_runtime_scope = RUNTIME_SCOPE_SYSTEM; break; + case 'H': + arg_transport = BUS_TRANSPORT_REMOTE; + arg_host = optarg; + break; + + case 'M': + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; + break; + case 'C': r = capsule_name_is_valid(optarg); if (r < 0) @@ -453,6 +464,12 @@ static int parse_argv(int argc, char *argv[]) { arg_unit = optarg; break; + case 'p': + if (strv_extend(&arg_property, optarg) < 0) + return log_oom(); + + break; + case ARG_DESCRIPTION: r = free_and_strdup_warn(&arg_description, optarg); if (r < 0) @@ -475,23 +492,20 @@ static int parse_argv(int argc, char *argv[]) { return r; break; - case ARG_SEND_SIGHUP: - arg_send_sighup = true; + case ARG_NO_BLOCK: + arg_no_block = true; break; case 'r': arg_remain_after_exit = true; break; - case 'H': - arg_transport = BUS_TRANSPORT_REMOTE; - arg_host = optarg; + case ARG_WAIT: + arg_wait = true; break; - case 'M': - r = parse_machine_argument(optarg, &arg_host, &arg_transport); - if (r < 0) - return r; + case ARG_SEND_SIGHUP: + arg_send_sighup = true; break; case ARG_SERVICE_TYPE: @@ -516,21 +530,53 @@ static int parse_argv(int argc, char *argv[]) { arg_nice_set = true; break; - case 'E': - r = strv_env_replace_strdup_passthrough(&arg_environment, optarg); + case ARG_WORKING_DIRECTORY: + r = parse_path_argument(optarg, true, &arg_working_directory); if (r < 0) - return log_error_errno(r, "Cannot assign environment variable %s: %m", optarg); + return r; + same_dir = false; break; - case 'p': - if (strv_extend(&arg_property, optarg) < 0) - return log_oom(); + case 'd': { + _cleanup_free_ char *p = NULL; + + r = safe_getcwd(&p); + if (r < 0) + return log_error_errno(r, "Failed to get current working directory: %m"); + if (empty_or_root(p)) + arg_working_directory = mfree(arg_working_directory); + else + free_and_replace(arg_working_directory, p); + + same_dir = true; break; + } + case ARG_ROOT_DIRECTORY: + r = parse_path_argument(optarg, /* suppress_root= */ false, &arg_root_directory); + if (r < 0) + return r; + + break; + + case 'R': + r = free_and_strdup_warn(&arg_root_directory, "/"); + if (r < 0) + return r; + + break; + + case 'E': + r = strv_env_replace_strdup_passthrough(&arg_environment, optarg); + if (r < 0) + return log_error_errno(r, "Cannot assign environment variable %s: %m", optarg); + + break; + + case 't': /* --pty (and --tty deprecated alias) */ case 'T': /* --pty-late */ - case 't': /* --pty */ arg_stdio |= ARG_STDIO_PTY; arg_pty_late = c == 'T'; break; @@ -556,6 +602,59 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(arg_output, "Unknown output format '%s'.", optarg); break; + case ARG_JSON: + r = parse_json_argument(optarg, &arg_json_format_flags); + if (r <= 0) + return r; + break; + + case 'G': + arg_aggressive_gc = true; + break; + + case 'S': + arg_shell = true; + break; + + case ARG_JOB_MODE: + if (streq(optarg, "help")) + return DUMP_STRING_TABLE(job_mode, JobMode, _JOB_MODE_MAX); + + r = job_mode_from_string(optarg); + if (r < 0) + return log_error_errno(r, "Invalid job mode: %s", optarg); + + arg_job_mode = r; + break; + + case ARG_IGNORE_FAILURE: + arg_ignore_failure = true; + break; + + case ARG_BACKGROUND: + r = parse_background_argument(optarg, &arg_background); + if (r < 0) + return r; + break; + + case ARG_NO_PAGER: + arg_pager_flags |= PAGER_DISABLE; + break; + + case ARG_PATH_PROPERTY: + + if (strv_extend(&arg_path_property, optarg) < 0) + return log_oom(); + + break; + + case ARG_SOCKET_PROPERTY: + + if (strv_extend(&arg_socket_property, optarg) < 0) + return log_oom(); + + break; + case ARG_ON_ACTIVE: r = add_timer_property("OnActiveSec", optarg); if (r < 0) @@ -653,105 +752,6 @@ static int parse_argv(int argc, char *argv[]) { "OnCalendar="); break; - case ARG_PATH_PROPERTY: - - if (strv_extend(&arg_path_property, optarg) < 0) - return log_oom(); - - break; - - case ARG_SOCKET_PROPERTY: - - if (strv_extend(&arg_socket_property, optarg) < 0) - return log_oom(); - - break; - - case ARG_NO_BLOCK: - arg_no_block = true; - break; - - case ARG_WAIT: - arg_wait = true; - break; - - case ARG_WORKING_DIRECTORY: - r = parse_path_argument(optarg, true, &arg_working_directory); - if (r < 0) - return r; - - same_dir = false; - break; - - case 'd': { - _cleanup_free_ char *p = NULL; - - r = safe_getcwd(&p); - if (r < 0) - return log_error_errno(r, "Failed to get current working directory: %m"); - - if (empty_or_root(p)) - arg_working_directory = mfree(arg_working_directory); - else - free_and_replace(arg_working_directory, p); - - same_dir = true; - break; - } - - case ARG_ROOT_DIRECTORY: - r = parse_path_argument(optarg, /* suppress_root= */ false, &arg_root_directory); - if (r < 0) - return r; - - break; - - case 'R': - r = free_and_strdup_warn(&arg_root_directory, "/"); - if (r < 0) - return r; - - break; - - case 'G': - arg_aggressive_gc = true; - break; - - case 'S': - arg_shell = true; - break; - - case ARG_JOB_MODE: - if (streq(optarg, "help")) - return DUMP_STRING_TABLE(job_mode, JobMode, _JOB_MODE_MAX); - - r = job_mode_from_string(optarg); - if (r < 0) - return log_error_errno(r, "Invalid job mode: %s", optarg); - - arg_job_mode = r; - break; - - case ARG_IGNORE_FAILURE: - arg_ignore_failure = true; - break; - - case ARG_BACKGROUND: - r = parse_background_argument(optarg, &arg_background); - if (r < 0) - return r; - break; - - case ARG_NO_PAGER: - arg_pager_flags |= PAGER_DISABLE; - break; - - case ARG_JSON: - r = parse_json_argument(optarg, &arg_json_format_flags); - if (r <= 0) - return r; - break; - case '?': return -EINVAL; @@ -1066,6 +1066,18 @@ static int parse_argv_sudo_mode(int argc, char *argv[]) { break; + case ARG_VIA_SHELL: + arg_via_shell = true; + break; + + case 'i': + r = free_and_strdup_warn(&arg_working_directory, "~"); + if (r < 0) + return r; + + arg_via_shell = true; + break; + case ARG_SETENV: r = strv_env_replace_strdup_passthrough(&arg_environment, optarg); if (r < 0) @@ -1113,16 +1125,6 @@ static int parse_argv_sudo_mode(int argc, char *argv[]) { break; - case 'i': - r = free_and_strdup_warn(&arg_working_directory, "~"); - if (r < 0) - return r; - - _fallthrough_; - case ARG_VIA_SHELL: - arg_via_shell = true; - break; - case ARG_EMPOWER: arg_empower = true; break;