[systemd-devel] [PATCH] Allow for the use of @ in remote host calls

Daniel Wallace danielwallace at gtmanfred.com
Sat Jun 8 18:21:09 PDT 2013


Without this you have to use %40 with the -H flag because dbus doesn't
like the @ sign being unescaped.
---
 src/hostname/hostnamectl.c | 12 ++++++++++--
 src/locale/localectl.c     | 12 ++++++++++--
 src/login/loginctl.c       | 12 ++++++++++--
 src/shared/dbus-common.c   |  4 ++--
 src/systemctl/systemctl.c  | 14 +++++++++++---
 src/timedate/timedatectl.c | 12 ++++++++++--
 6 files changed, 53 insertions(+), 13 deletions(-)

diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c
index d108a24..178f9bc 100644
--- a/src/hostname/hostnamectl.c
+++ b/src/hostname/hostnamectl.c
@@ -44,7 +44,8 @@ static enum transport {
         TRANSPORT_POLKIT
 } arg_transport = TRANSPORT_NORMAL;
 static bool arg_ask_password = true;
-static const char *arg_host = NULL;
+static char *arg_host = NULL;
+static char *arg_user = NULL;
 static bool arg_set_transient = false;
 static bool arg_set_pretty = false;
 static bool arg_set_static = false;
@@ -421,7 +422,14 @@ static int parse_argv(int argc, char *argv[]) {
 
                 case 'H':
                         arg_transport = TRANSPORT_SSH;
-                        arg_host = optarg;
+                        arg_host = strchr(optarg, '@');
+                        if (arg_host == NULL)
+                                arg_host = optarg;
+                        else {
+                                arg_host[0] = '\0';
+                                arg_host++;
+                                arg_user = optarg;
+                        }
                         break;
 
                 case ARG_SET_TRANSIENT:
diff --git a/src/locale/localectl.c b/src/locale/localectl.c
index b5cd344..30a6724 100644
--- a/src/locale/localectl.c
+++ b/src/locale/localectl.c
@@ -46,7 +46,8 @@ static enum transport {
         TRANSPORT_POLKIT
 } arg_transport = TRANSPORT_NORMAL;
 static bool arg_ask_password = true;
-static const char *arg_host = NULL;
+static char *arg_host = NULL;
+static char *arg_user = NULL;
 static bool arg_convert = true;
 
 static void pager_open_if_enabled(void) {
@@ -777,7 +778,14 @@ static int parse_argv(int argc, char *argv[]) {
 
                 case 'H':
                         arg_transport = TRANSPORT_SSH;
-                        arg_host = optarg;
+                        arg_host = strchr(optarg, '@');
+                        if (arg_host == NULL)
+                                arg_host = optarg;
+                        else {
+                                arg_host[0] = '\0';
+                                arg_host++;
+                                arg_user = optarg;
+                        }
                         break;
 
                 case ARG_NO_CONVERT:
diff --git a/src/login/loginctl.c b/src/login/loginctl.c
index caaea8d..ed24377 100644
--- a/src/login/loginctl.c
+++ b/src/login/loginctl.c
@@ -50,7 +50,8 @@ static enum transport {
         TRANSPORT_POLKIT
 } arg_transport = TRANSPORT_NORMAL;
 static bool arg_ask_password = true;
-static const char *arg_host = NULL;
+static char *arg_host = NULL;
+static char *arg_user = NULL;
 
 static void pager_open_if_enabled(void) {
 
@@ -1421,7 +1422,14 @@ static int parse_argv(int argc, char *argv[]) {
 
                 case 'H':
                         arg_transport = TRANSPORT_SSH;
-                        arg_host = optarg;
+                        arg_host = strchr(optarg, '@');
+                        if (arg_host == NULL)
+                                arg_host = optarg;
+                        else {
+                                arg_host[0] = '\0';
+                                arg_host++;
+                                arg_user = optarg;
+                        }
                         break;
 
                 case ARG_FULL:
diff --git a/src/shared/dbus-common.c b/src/shared/dbus-common.c
index b8c15cb..f579567 100644
--- a/src/shared/dbus-common.c
+++ b/src/shared/dbus-common.c
@@ -178,9 +178,9 @@ int bus_connect_system_ssh(const char *user, const char *host, DBusConnection **
         assert(user || host);
 
         if (user && host)
-                asprintf(&p, "unixexec:path=ssh,argv1=-xT,argv2=%s@%s,argv3=systemd-stdio-bridge", user, host);
+                asprintf(&p, "unixexec:path=ssh,argv1=-xT,argv2=%s%%40%s,argv3=systemd-stdio-bridge", user, host);
         else if (user)
-                asprintf(&p, "unixexec:path=ssh,argv1=-xT,argv2=%s at localhost,argv3=systemd-stdio-bridge", user);
+                asprintf(&p, "unixexec:path=ssh,argv1=-xT,argv2=%s%%40localhost,argv3=systemd-stdio-bridge", user);
         else if (host)
                 asprintf(&p, "unixexec:path=ssh,argv1=-xT,argv2=%s,argv3=systemd-stdio-bridge", host);
 
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 58a6fd4..cc6db5d 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -129,7 +129,8 @@ static enum transport {
         TRANSPORT_SSH,
         TRANSPORT_POLKIT
 } arg_transport = TRANSPORT_NORMAL;
-static const char *arg_host = NULL;
+static char *arg_host = NULL;
+static char *arg_user = NULL;
 static unsigned arg_lines = 10;
 static OutputMode arg_output = OUTPUT_SHORT;
 static bool arg_plain = false;
@@ -5077,7 +5078,14 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
 
                 case 'H':
                         arg_transport = TRANSPORT_SSH;
-                        arg_host = optarg;
+                        arg_host = strchr(optarg, '@');
+                        if (arg_host == NULL)
+                                arg_host = optarg;
+                        else {
+                                arg_host[0] = '\0';
+                                arg_host++;
+                                arg_user = optarg;
+                        }
                         break;
 
                 case ARG_RUNTIME:
@@ -6098,7 +6106,7 @@ int main(int argc, char*argv[]) {
                         bus_connect_system_polkit(&bus, &error);
                         private_bus = false;
                 } else if (arg_transport == TRANSPORT_SSH) {
-                        bus_connect_system_ssh(NULL, arg_host, &bus, &error);
+                        bus_connect_system_ssh(arg_user, arg_host, &bus, &error);
                         private_bus = false;
                 } else
                         assert_not_reached("Uh, invalid transport...");
diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c
index e8bc452..b2cc8ec 100644
--- a/src/timedate/timedatectl.c
+++ b/src/timedate/timedatectl.c
@@ -44,7 +44,8 @@ static enum transport {
         TRANSPORT_POLKIT
 } arg_transport = TRANSPORT_NORMAL;
 static bool arg_ask_password = true;
-static const char *arg_host = NULL;
+static char *arg_host = NULL;
+static char *arg_user = NULL;
 
 static void pager_open_if_enabled(void) {
 
@@ -560,7 +561,14 @@ static int parse_argv(int argc, char *argv[]) {
 
                 case 'H':
                         arg_transport = TRANSPORT_SSH;
-                        arg_host = optarg;
+                        arg_host = strchr(optarg, '@');
+                        if (arg_host == NULL)
+                                arg_host = optarg;
+                        else {
+                                arg_host[0] = '\0';
+                                arg_host++;
+                                arg_user = optarg;
+                        }
                         break;
 
                 case ARG_NO_ASK_PASSWORD:
-- 
1.8.3



More information about the systemd-devel mailing list