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@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