=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/scp.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- src/usr.bin/ssh/scp.c 1999/12/06 20:15:28 1.22 +++ src/usr.bin/ssh/scp.c 2000/01/04 00:07:59 1.23 @@ -45,7 +45,7 @@ */ #include "includes.h" -RCSID("$Id: scp.c,v 1.22 1999/12/06 20:15:28 deraadt Exp $"); +RCSID("$Id: scp.c,v 1.23 2000/01/04 00:07:59 markus Exp $"); #include "ssh.h" #include "xmalloc.h" @@ -74,6 +74,12 @@ /* Name of current file being transferred. */ char *curfile; +/* This is set to non-zero if IPv4 is desired. */ +int IPv4 = 0; + +/* This is set to non-zero if IPv6 is desired. */ +int IPv6 = 0; + /* This is set to non-zero to enable verbose mode. */ int verbose_mode = 0; @@ -145,6 +151,11 @@ args[i++] = SSH_PROGRAM; args[i++] = "-x"; args[i++] = "-oFallBackToRsh no"; + if (IPv4) + args[i++] = "-4"; + if (IPv6) + args[i++] = "-6"; + args[i++] = "-oFallBackToRsh no"; if (verbose_mode) args[i++] = "-v"; if (compress) @@ -242,9 +253,15 @@ extern int optind; fflag = tflag = 0; - while ((ch = getopt(argc, argv, "dfprtvBCc:i:P:q")) != EOF) + while ((ch = getopt(argc, argv, "dfprtvBCc:i:P:q46")) != EOF) switch (ch) { /* User-visible flags. */ + case '4': + IPv4 = 1; + break; + case '6': + IPv6 = 1; + break; case 'p': pflag = 1; break; @@ -334,6 +351,17 @@ exit(errs != 0); } +char * +cleanhostname(host) + char *host; +{ + if (*host == '[' && host[strlen(host) - 1] == ']') { + host[strlen(host) - 1] = '\0'; + return (host + 1); + } else + return host; +} + void toremote(targ, argc, argv) char *targ, *argv[]; @@ -372,6 +400,7 @@ bp = xmalloc(len); if (host) { *host++ = 0; + host = cleanhostname(host); suser = argv[i]; if (*suser == '\0') suser = pwd->pw_name; @@ -383,13 +412,15 @@ suser, host, cmd, src, tuser ? tuser : "", tuser ? "@" : "", thost, targ); - } else + } else { + host = cleanhostname(argv[i]); (void) sprintf(bp, "exec %s%s -x -o'FallBackToRsh no' -n %s %s %s '%s%s%s:%s'", SSH_PROGRAM, verbose_mode ? " -v" : "", - argv[i], cmd, src, + host, cmd, src, tuser ? tuser : "", tuser ? "@" : "", thost, targ); + } if (verbose_mode) fprintf(stderr, "Executing: %s\n", bp); (void) system(bp); @@ -399,7 +430,7 @@ len = strlen(targ) + CMDNEEDS + 20; bp = xmalloc(len); (void) sprintf(bp, "%s -t %s", cmd, targ); - host = thost; + host = cleanhostname(thost); if (do_cmd(host, tuser, bp, &remin, &remout) < 0) exit(1); @@ -449,6 +480,7 @@ else if (!okname(suser)) continue; } + host = cleanhostname(host); len = strlen(src) + CMDNEEDS + 20; bp = xmalloc(len); (void) sprintf(bp, "%s -f %s", cmd, src); @@ -974,18 +1006,26 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: scp.c,v 1.22 1999/12/06 20:15:28 deraadt Exp $ + * $Id: scp.c,v 1.23 2000/01/04 00:07:59 markus Exp $ */ char * colon(cp) char *cp; { + int flag = 0; + if (*cp == ':') /* Leading colon is part of file name. */ return (0); + if (*cp == '[') + flag = 1; for (; *cp; ++cp) { - if (*cp == ':') + if (*cp == '@' && *(cp+1) == '[') + flag = 1; + if (*cp == ']' && *(cp+1) == ':' && flag) + return (cp+1); + if (*cp == ':' && !flag) return (cp); if (*cp == '/') return (0);