summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Wallace <danielwallace@gtmanfred.com>2013-06-09 15:54:39 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-06-09 18:26:41 -0400
commit7085053a437456ab87d726f3697002dd811fdf7a (patch)
treeca12f96e9cb69ee08fa3a5558c42650692dcfb28
parent856323c9cb0ef368367126588d0b43b4846ab0d7 (diff)
Allow for the use of @ in remote host calls
Without this you have to use %40 with the -H flag because dbus doesn't like the @ sign being unescaped.
-rw-r--r--src/hostname/hostnamectl.c5
-rw-r--r--src/locale/localectl.c5
-rw-r--r--src/login/loginctl.c5
-rw-r--r--src/shared/dbus-common.c4
-rw-r--r--src/shared/util.c14
-rw-r--r--src/shared/util.h1
-rw-r--r--src/systemctl/systemctl.c7
-rw-r--r--src/timedate/timedatectl.c5
8 files changed, 33 insertions, 13 deletions
diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c
index d108a2489d..f7d844b975 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,7 @@ static int parse_argv(int argc, char *argv[]) {
case 'H':
arg_transport = TRANSPORT_SSH;
- arg_host = optarg;
+ parse_user_at_host(optarg, &arg_user, &arg_host);
break;
case ARG_SET_TRANSIENT:
diff --git a/src/locale/localectl.c b/src/locale/localectl.c
index b5cd344397..cd7356a1e1 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,7 @@ static int parse_argv(int argc, char *argv[]) {
case 'H':
arg_transport = TRANSPORT_SSH;
- arg_host = optarg;
+ parse_user_at_host(optarg, &arg_user, &arg_host);
break;
case ARG_NO_CONVERT:
diff --git a/src/login/loginctl.c b/src/login/loginctl.c
index caaea8dfaa..b09aa37ff8 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,7 @@ static int parse_argv(int argc, char *argv[]) {
case 'H':
arg_transport = TRANSPORT_SSH;
- arg_host = optarg;
+ parse_user_at_host(optarg, &arg_user, &arg_host);
break;
case ARG_FULL:
diff --git a/src/shared/dbus-common.c b/src/shared/dbus-common.c
index b8c15cb9fc..f579567321 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@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/shared/util.c b/src/shared/util.c
index 2edf9cd875..d0bbf78bf3 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -5847,3 +5847,17 @@ bool id128_is_valid(const char *s) {
return true;
}
+
+void parse_user_at_host(char *arg, char **user, char **host) {
+ assert(arg);
+ assert(user);
+ assert(host);
+
+ *host = strchr(arg, '@');
+ if (*host == NULL)
+ *host = arg;
+ else {
+ *host[0]++ = '\0';
+ *user = arg;
+ }
+}
diff --git a/src/shared/util.h b/src/shared/util.h
index 64e63b8c07..e6f9312e95 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -732,3 +732,4 @@ static inline void _reset_locale_(struct _locale_struct_ *s) {
_saved_locale_.quit = true)
bool id128_is_valid(const char *s) _pure_;
+void parse_user_at_host(char *arg, char **user, char **host);
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 0ba3568a1e..3e4cefec76 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;
@@ -5065,7 +5066,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
case 'H':
arg_transport = TRANSPORT_SSH;
- arg_host = optarg;
+ parse_user_at_host(optarg, &arg_user, &arg_host);
break;
case ARG_RUNTIME:
@@ -6086,7 +6087,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 e8bc4529f3..d2b483efac 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,7 @@ static int parse_argv(int argc, char *argv[]) {
case 'H':
arg_transport = TRANSPORT_SSH;
- arg_host = optarg;
+ parse_user_at_host(optarg, &arg_user, &arg_host);
break;
case ARG_NO_ASK_PASSWORD: