]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tree-wide: check --machine= specification 37851/head
authorMike Yuan <me@yhndnzj.com>
Mon, 16 Jun 2025 23:48:08 +0000 (01:48 +0200)
committerMike Yuan <me@yhndnzj.com>
Tue, 17 Jun 2025 00:10:37 +0000 (02:10 +0200)
Addresses https://github.com/systemd/systemd/pull/37741#discussion_r2128482378

16 files changed:
src/analyze/analyze.c
src/busctl/busctl.c
src/home/homectl.c
src/hostname/hostnamectl.c
src/import/importctl.c
src/locale/localectl.c
src/login/loginctl.c
src/mount/mount-tool.c
src/portable/portablectl.c
src/run/run.c
src/shared/parse-argument.c
src/shared/parse-argument.h
src/stdio-bridge/stdio-bridge.c
src/systemctl/systemctl.c
src/sysupdate/updatectl.c
src/timedate/timedatectl.c

index 5c547197c8d7c051f271677bbb834762674b4ffa..bb5855ecc607b2b9e3ca4f98cb6a39e646a46f94 100644 (file)
@@ -453,8 +453,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'M':
-                        arg_transport = BUS_TRANSPORT_MACHINE;
-                        arg_host = optarg;
+                        r = parse_machine_argument(optarg, &arg_host, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case ARG_MAN:
index 8fe28ef015e76a472fda7b358a6788307ffbdf14..5853641e54ce0962d362c5872f8716748447dc44 100644 (file)
@@ -2265,8 +2265,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'M':
-                        arg_transport = BUS_TRANSPORT_MACHINE;
-                        arg_host = optarg;
+                        r = parse_machine_argument(optarg, &arg_host, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case 'C':
index c933d45f786636c343ff47d5ae926b6fbbb00b19..54b0d67bc71f23bd7949c67373bfb9fedb2e9c7a 100644 (file)
@@ -3418,8 +3418,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'M':
-                        arg_transport = BUS_TRANSPORT_MACHINE;
-                        arg_host = optarg;
+                        r = parse_machine_argument(optarg, &arg_host, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case 'I':
index fd0449c399bc54a2497b526892535e41488f1ef8..d1bf6294220c859a52fb86c4aa655afc06ffc3bb 100644 (file)
@@ -33,7 +33,7 @@
 
 static bool arg_ask_password = true;
 static BusTransport arg_transport = BUS_TRANSPORT_LOCAL;
-static char *arg_host = NULL;
+static const char *arg_host = NULL;
 static bool arg_transient = false;
 static bool arg_pretty = false;
 static bool arg_static = false;
@@ -791,8 +791,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'M':
-                        arg_transport = BUS_TRANSPORT_MACHINE;
-                        arg_host = optarg;
+                        r = parse_machine_argument(optarg, &arg_host, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case ARG_TRANSIENT:
index e555b2f770a5e3e582dee6e86ed292fec8980c6a..5fd8af72efe55f0327b54f62b1067af7539ed679 100644 (file)
@@ -1111,8 +1111,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'M':
-                        arg_transport = BUS_TRANSPORT_MACHINE;
-                        arg_host = optarg;
+                        r = parse_machine_argument(optarg, &arg_host, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case ARG_READ_ONLY:
index 7c729249ac27675b807bee7a17fd153810ddaac0..b60da006b3f7cd50ce039f2da5befda473e824c8 100644 (file)
@@ -18,6 +18,7 @@
 #include "main-func.h"
 #include "memory-util.h"
 #include "pager.h"
+#include "parse-argument.h"
 #include "polkit-agent.h"
 #include "pretty-print.h"
 #include "runtime-scope.h"
@@ -452,7 +453,7 @@ static int parse_argv(int argc, char *argv[]) {
                 {}
         };
 
-        int c;
+        int r, c;
 
         assert(argc >= 0);
         assert(argv);
@@ -489,8 +490,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'M':
-                        arg_transport = BUS_TRANSPORT_MACHINE;
-                        arg_host = optarg;
+                        r = parse_machine_argument(optarg, &arg_host, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case '?':
index 1cbbd4ecf72918cf62e3673adac78325bbd1a8b8..2c3394cc2cddfd05db6fe5b43d2c3cc4b5e2e777 100644 (file)
@@ -47,7 +47,7 @@ static sd_json_format_flags_t arg_json_format_flags = SD_JSON_FORMAT_OFF;
 static const char *arg_kill_whom = NULL;
 static int arg_signal = SIGTERM;
 static BusTransport arg_transport = BUS_TRANSPORT_LOCAL;
-static char *arg_host = NULL;
+static const char *arg_host = NULL;
 static bool arg_ask_password = true;
 static unsigned arg_lines = 10;
 static OutputMode arg_output = OUTPUT_SHORT;
@@ -1654,8 +1654,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'M':
-                        arg_transport = BUS_TRANSPORT_MACHINE;
-                        arg_host = optarg;
+                        r = parse_machine_argument(optarg, &arg_host, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case '?':
index 3d468e0621595544b830e0217fb86e9be254be66..a684c0bef8af2e3fffec8021683117712b35bdf2 100644 (file)
@@ -279,8 +279,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'M':
-                        arg_transport = BUS_TRANSPORT_MACHINE;
-                        arg_host = optarg;
+                        r = parse_machine_argument(optarg, &arg_host, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case ARG_DISCOVER:
index 4b8e1cd88a2855523850d7b08534e9454bb68b51..c7803021b20518e37166ec070c8a2ebb93ed9d0e 100644 (file)
@@ -21,6 +21,7 @@
 #include "main-func.h"
 #include "os-util.h"
 #include "pager.h"
+#include "parse-argument.h"
 #include "parse-util.h"
 #include "path-util.h"
 #include "polkit-agent.h"
@@ -35,7 +36,7 @@ static bool arg_legend = true;
 static bool arg_ask_password = true;
 static bool arg_quiet = false;
 static const char *arg_profile = "default";
-static const chararg_copy_mode = NULL;
+static const char *arg_copy_mode = NULL;
 static bool arg_runtime = false;
 static bool arg_reload = true;
 static bool arg_cat = false;
@@ -1318,7 +1319,6 @@ static int help(int argc, char *argv[], void *userdata) {
 }
 
 static int parse_argv(int argc, char *argv[]) {
-        int r;
 
         enum {
                 ARG_VERSION = 0x100,
@@ -1360,15 +1360,12 @@ static int parse_argv(int argc, char *argv[]) {
                 {}
         };
 
+        int r, c;
+
         assert(argc >= 0);
         assert(argv);
 
-        for (;;) {
-                int c;
-
-                c = getopt_long(argc, argv, "hH:M:qp:", options, NULL);
-                if (c < 0)
-                        break;
+        while ((c = getopt_long(argc, argv, "hH:M:qp:", options, NULL)) >= 0)
 
                 switch (c) {
 
@@ -1396,8 +1393,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'M':
-                        arg_transport = BUS_TRANSPORT_MACHINE;
-                        arg_host = optarg;
+                        r = parse_machine_argument(optarg, &arg_host, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case 'q':
@@ -1476,7 +1474,6 @@ static int parse_argv(int argc, char *argv[]) {
                 default:
                         assert_not_reached();
                 }
-        }
 
         return 1;
 }
index ab620bb5cd15c4f6db24223138c33144f03e6e31..5bbd55da9b0192ca6b6acb69430e9f8d92252221 100644 (file)
@@ -457,8 +457,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'M':
-                        arg_transport = BUS_TRANSPORT_MACHINE;
-                        arg_host = optarg;
+                        r = parse_machine_argument(optarg, &arg_host, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case ARG_SERVICE_TYPE:
@@ -900,8 +901,9 @@ static int parse_argv_sudo_mode(int argc, char *argv[]) {
                         break;
 
                 case ARG_MACHINE:
-                        arg_transport = BUS_TRANSPORT_MACHINE;
-                        arg_host = optarg;
+                        r = parse_machine_argument(optarg, &arg_host, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case ARG_UNIT:
index 1575962d44afda0b34b73702cd0af8aee2c73580..107e3cb8ab1876fd997b1ccd9aff64b80d413950 100644 (file)
@@ -1,7 +1,9 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 
 #include "alloc-util.h"
+#include "bus-util.h"
 #include "format-table.h"
+#include "hostname-util.h"
 #include "log.h"
 #include "parse-argument.h"
 #include "parse-util.h"
@@ -143,3 +145,23 @@ int parse_signal_argument(const char *s, int *ret) {
         *ret = r;
         return 1; /* work to do */
 }
+
+int parse_machine_argument(const char *s, const char **ret_host, BusTransport *ret_transport) {
+        int r;
+
+        assert(s);
+        assert(ret_host);
+
+        r = machine_spec_valid(s);
+        if (r < 0)
+                return log_error_errno(r, "Failed to validate --machine= argument '%s': %m", s);
+        if (r == 0)
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid --machine= specified: %s", s);
+
+        *ret_host = s;
+
+        if (ret_transport)
+                *ret_transport = BUS_TRANSPORT_MACHINE;
+
+        return 0;
+}
index 06c47d904426553e87508c11ca57b9db83607f90..0f44223af3cb8b9ae208d72deb5764dc15140559 100644 (file)
@@ -8,3 +8,4 @@ int parse_tristate_argument(const char *optname, const char *s, int *ret);
 int parse_json_argument(const char *s, sd_json_format_flags_t *ret);
 int parse_path_argument(const char *path, bool suppress_root, char **arg);
 int parse_signal_argument(const char *s, int *ret);
+int parse_machine_argument(const char *s, const char **ret_host, BusTransport *ret_transport);
index 0de59aaecfe9fa0ac79eb7e203730a789e8e1e69..804762ab2e84edea92a320445d637c3f9f96a793 100644 (file)
@@ -14,6 +14,7 @@
 #include "io-util.h"
 #include "log.h"
 #include "main-func.h"
+#include "parse-argument.h"
 #include "time-util.h"
 
 static const char *arg_bus_path = DEFAULT_SYSTEM_BUS_ADDRESS;
@@ -35,9 +36,9 @@ static int help(void) {
 }
 
 static int parse_argv(int argc, char *argv[]) {
+
         enum {
                 ARG_VERSION = 0x100,
-                ARG_MACHINE,
                 ARG_USER,
                 ARG_SYSTEM,
         };
@@ -52,7 +53,7 @@ static int parse_argv(int argc, char *argv[]) {
                 {},
         };
 
-        int c;
+        int r, c;
 
         assert(argc >= 0);
         assert(argv);
@@ -80,8 +81,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'M':
-                        arg_bus_path = optarg;
-                        arg_transport = BUS_TRANSPORT_MACHINE;
+                        r = parse_machine_argument(optarg, &arg_bus_path, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case '?':
index 0c8a2c96c623757521ec68e7249c629ee93a85d8..c62a514777edb12858679f8e45b576e5cd31d607 100644 (file)
@@ -788,8 +788,9 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'M':
-                        arg_transport = BUS_TRANSPORT_MACHINE;
-                        arg_host = optarg;
+                        r = parse_machine_argument(optarg, &arg_host, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case ARG_RUNTIME:
index 8e830fd6568004853630158572018a909c5bff0f..0336a6ac75363e07564af43f1fcd491afe1cb379 100644 (file)
@@ -36,7 +36,7 @@ static bool arg_reboot = false;
 static bool arg_offline = false;
 static bool arg_now = false;
 static BusTransport arg_transport = BUS_TRANSPORT_LOCAL;
-static char *arg_host = NULL;
+static const char *arg_host = NULL;
 
 #define SYSUPDATE_HOST_PATH "/org/freedesktop/sysupdate1/target/host"
 #define SYSUPDATE_TARGET_INTERFACE "org.freedesktop.sysupdate1.Target"
index 44a64bb6b68ece705d0e37a63855546428a67f3a..0bbc740d4693893b3bd29a091165e498332c6d45 100644 (file)
@@ -22,6 +22,7 @@
 #include "log.h"
 #include "main-func.h"
 #include "pager.h"
+#include "parse-argument.h"
 #include "parse-util.h"
 #include "polkit-agent.h"
 #include "pretty-print.h"
@@ -37,7 +38,7 @@
 static PagerFlags arg_pager_flags = 0;
 static bool arg_ask_password = true;
 static BusTransport arg_transport = BUS_TRANSPORT_LOCAL;
-static char *arg_host = NULL;
+static const char *arg_host = NULL;
 static bool arg_adjust_system_clock = false;
 static bool arg_monitor = false;
 static char **arg_property = NULL;
@@ -996,8 +997,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'M':
-                        arg_transport = BUS_TRANSPORT_MACHINE;
-                        arg_host = optarg;
+                        r = parse_machine_argument(optarg, &arg_host, &arg_transport);
+                        if (r < 0)
+                                return r;
                         break;
 
                 case ARG_NO_ASK_PASSWORD: