From 299d26dab7af8d7712944c61c21129a81d7bb889 Mon Sep 17 00:00:00 2001
From: Matt Johnston <matt@ucc.asn.au>
Date: Mon, 22 Sep 2008 15:47:35 +0000
Subject: [PATCH] - Work around rsync and scp parsing and modifying the
 user@host argument, which break's dbclient's multihop syntax

--HG--
extra : convert_revision : cf704125a4785278aeb79f62bf025638e1b28e4c
---
 cli-runopts.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/cli-runopts.c b/cli-runopts.c
index ca588991..0641ec74 100644
--- a/cli-runopts.c
+++ b/cli-runopts.c
@@ -412,7 +412,20 @@ static void parse_multihop_hostname(const char* orighostarg, const char* argv0)
 	char *last_hop = NULL;;
 	char *remainder = NULL;
 
-	userhostarg = m_strdup(orighostarg);
+	/* both scp and rsync parse a user@host argument
+	 * and turn it into "-l user host". This breaks
+	 * for our multihop syntax, so we suture it back together.
+	 * This will break usernames that have both '@' and ',' in them,
+	 * though that should be fairly uncommon. */
+	if (cli_opts.username 
+			&& strchr(cli_opts.username, ',') 
+			&& strchr(cli_opts.username, '@')) {
+		unsigned int len = strlen(orighostarg) + strlen(cli_opts.username) + 2;
+		userhostarg = m_malloc(len);
+		snprintf(userhostarg, len, "%s@%s", cli_opts.username, orighostarg);
+	} else {
+		userhostarg = m_strdup(orighostarg);
+	}
 
 	last_hop = strrchr(userhostarg, ',');
 	if (last_hop) {
-- 
GitLab