[PATCH 11/16] scp: Remove parsing of `[user@]host'

Michael Witten mfwitten at gmail.com
Tue Dec 8 06:59:50 AWST 2015


Date: Sat, 7 Nov 2015 03:27:36 -0000
The program `dbclient' can already handle parsing such arguments, including determining
the current user's name.

It should be noted that relying on this centralized machinery changes the behavior:
Whereas before, `@host' (i.e., the empty string as the user name) prompted `scp' to
substitute the current user's name, now the empty string is regarded as an
acceptable name and passed through; this is the behavior that `dbclient' implements,
and it might be useful to someone, anyway.
---
 scp.c | 93 +++++++++++++------------------------------------------------------
 1 file changed, 17 insertions(+), 76 deletions(-)

diff --git a/scp.c b/scp.c
index 0adb590..fc992b6 100644
--- a/scp.c
+++ b/scp.c
@@ -172,25 +172,22 @@ do_local_cmd(arglist *a)
  */
 
 static void
-arg_setup(char *host, const char *remuser, char *cmd)
+arg_setup(const char *user_at_host, const char *cmd)
 {
 	replacearg(&args, 0, "%s", ssh_program);
-	addargs(&args, "-l");
-	addargs(&args, "%s", remuser);
-	addargs(&args, "%s", host);
+	addargs(&args, "%s", user_at_host);
 	addargs(&args, "%s", cmd);
 }
 
 int
-do_cmd(char *host, const char *remuser, char *cmd, int *fdin, int *fdout, int argc)
+do_cmd(const char *user_at_host, const char *cmd, int *fdin, int *fdout, int argc)
 {
 	int pin[2], pout[2], reserved[2];
 
 	if (verbose_mode)
 		fprintf(stderr,
-		    "Executing: program %s, host %s, user %s, command %s\n",
-		    ssh_program, host,
-		    remuser, cmd);
+		    "Executing: program %s, login %s, command %s\n",
+		    ssh_program, user_at_host, cmd);
 
 	/*
 	 * Reserve two descriptors so that the real pipes won't get
@@ -211,7 +208,7 @@ do_cmd(char *host, const char *remuser, char *cmd, int *fdin, int *fdout, int ar
 	/* uClinux needs to build the args here before vforking,
 	   otherwise we do it later on. */
 #ifdef USE_VFORK
-	arg_setup(host, remuser, cmd);
+	arg_setup(user_at_host, cmd);
 #endif
 
 	/* Fork a child to execute the command on the remote host using ssh. */
@@ -231,7 +228,7 @@ do_cmd(char *host, const char *remuser, char *cmd, int *fdin, int *fdout, int ar
 		close(pout[1]);
 
 #ifndef USE_VFORK
-		arg_setup(host, remuser, cmd);
+		arg_setup(user_at_host, cmd);
 #endif
 
 		execvp(ssh_program, args.list);
@@ -251,11 +248,7 @@ do_cmd(char *host, const char *remuser, char *cmd, int *fdin, int *fdout, int ar
 	xfree(args.list[args.num-1]);
 	args.list[args.num-1]=NULL;
 	args.num--;
-	/* pop host */
-	xfree(args.list[args.num-1]);
-	args.list[args.num-1]=NULL;
-	args.num--;
-	/* pop user */
+	/* pop user_at_host */
 	xfree(args.list[args.num-1]);
 	args.list[args.num-1]=NULL;
 	args.num--;
@@ -455,8 +448,8 @@ void
 toremote(char *targ, int argc, char **argv)
 {
 	int i, len;
-	const char *suser, *tuser;
+	const char *targ_user_at_host;
-	char *bp, *host, *src, *thost, *arg;
+	char *bp, *src;
 	arglist alist;
 
 	memset(&alist, '\0', sizeof(alist));
@@ -466,24 +459,7 @@ toremote(char *targ, int argc, char **argv)
 	if (*targ == 0)
 		targ = ".";
 
-	arg = xstrdup(argv[argc - 1]);
-	if ((thost = strrchr(arg, '@'))) {
-		/* user at host */
-		*thost++ = 0;
-		tuser = arg;
-		if (*tuser == '\0')
-			tuser = NULL;
-	} else {
-		thost = arg;
-		tuser = NULL;
-	}
-
-	if (tuser == NULL)
-		tuser = get_user_name();
-	else if (!okname(tuser)) {
-		xfree(arg);
-		return;
-	}
+	targ_user_at_host = argv[argc - 1];
 
 	for (i = 0; i < argc - 1; i++) {
 		src = colon(argv[i]);
@@ -505,30 +481,11 @@ toremote(char *targ, int argc, char **argv)
 			*src++ = 0;
 			if (*src == 0)
 				src = ".";
-			host = strrchr(argv[i], '@');
-
-			if (host) {
-				*host++ = 0;
-				host = cleanhostname(host);
-				suser = argv[i];
-				if (*suser == '\0')
-					suser = NULL;
-			} else {
-				host = cleanhostname(argv[i]);
-				suser = NULL;
-			}
-			if (suser == NULL)
-				suser = get_user_name();
-			else if (!okname(suser))
-				continue;
-			addargs(&alist, "-l");
-			addargs(&alist, "%s", suser);
-			addargs(&alist, "%s", host);
+
+			addargs(&alist, "%s", argv[i]); /* [user@]host */
 			addargs(&alist, "%s", cmd);
 			addargs(&alist, "%s", src);
-			addargs(&alist, "%s%s%s:%s",
-			    tuser ? tuser : "", tuser ? "@" : "",
-			    thost, targ);
+			addargs(&alist, "%s:%s", targ_user_at_host, targ);
 			if (do_local_cmd(&alist) != 0)
 				errs = 1;
 		} else {	/* local to remote */
@@ -536,8 +493,7 @@ toremote(char *targ, int argc, char **argv)
 				len = strlen(targ) + CMDNEEDS + 20;
 				bp = xmalloc(len);
 				(void) snprintf(bp, len, "%s -t %s", cmd, targ);
-				host = cleanhostname(thost);
-				if (do_cmd(host, tuser, bp, &remin,
+				if (do_cmd(targ_user_at_host, bp, &remin,
 				    &remout, argc) < 0)
 					exit(1);
 				if (response() < 0)
@@ -553,8 +509,7 @@ void
 tolocal(int argc, char **argv)
 {
 	int i, len;
-	const char *suser;
-	char *bp, *host, *src;
+	char *bp, *src;
 	arglist alist;
 
 	memset(&alist, '\0', sizeof(alist));
@@ -577,24 +532,10 @@ tolocal(int argc, char **argv)
 		*src++ = 0;
 		if (*src == 0)
 			src = ".";
-		if ((host = strrchr(argv[i], '@')) == NULL) {
-			host = argv[i];
-			suser = NULL;
-		} else {
-			*host++ = 0;
-			suser = argv[i];
-			if (*suser == '\0')
-				suser = NULL;
-		}
-		if (suser == NULL)
-			suser = get_user_name();
-		else if (!okname(suser))
-			continue;
-		host = cleanhostname(host);
 		len = strlen(src) + CMDNEEDS + 20;
 		bp = xmalloc(len);
 		(void) snprintf(bp, len, "%s -f %s", cmd, src);
-		if (do_cmd(host, suser, bp, &remin, &remout, argc) < 0) {
+		if (do_cmd(argv[i], bp, &remin, &remout, argc) < 0) {
 			(void) xfree(bp);
 			++errs;
 			continue;
-- 
2.4.3



More information about the Dropbear mailing list