]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
run: reorder switch cases to match help() output order
authorZbigniew Jędrzejewski-Szmek <zbyszek@amutable.com>
Mon, 27 Apr 2026 21:58:24 +0000 (23:58 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@amutable.com>
Tue, 28 Apr 2026 15:13:24 +0000 (17:13 +0200)
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 <noreply@anthropic.com>
src/run/run.c

index 596e12826753cae127607c12f6762f43a1ee6e5c..60eaeb12d5b9c973604a23256fc76ad2a85ad079 100644 (file)
@@ -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;