[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