*** scp.c.orig	Wed May 12 13:19:28 1999
--- scp.c	Mon Jan 10 22:56:13 2000
***************
*** 180,185 ****
--- 180,193 ----
  #define STDERR_FILENO 2
  #endif
  
+ /* This is set to non-zero if IPv4 is desired. */
+ int IPv4 = 0;
+ 
+ #ifdef ENABLE_IPV6
+ /* This is set to non-zero if IPv6 is desired. */
+ int IPv6 = 0;
+ #endif
+ 
  /* This is set to non-zero to enable verbose mode. */
  int verbose = 0;
  
***************
*** 295,302 ****
--- 303,319 ----
          }
        args[i++] = "-x";
        args[i++] = "-a";
+ #ifdef ENABLE_ANOTHER_PORT_TRY
+       args[i++] = "-A";
+ #endif /* ENABLE_ANOTHER_PORT_TRY */
        args[i++] = "-oFallBackToRsh no";
        args[i++] = "-oClearAllForwardings yes";
+       if (IPv4)
+ 	args[i++] = "-4";
+ #ifdef ENABLE_IPV6
+       if (IPv6)
+ 	args[i++] = "-6";
+ #endif
        if (verbose)
          args[i++] = "-v";
        if (compress)
***************
*** 441,448 ****
              statistics = 0;
  
          fflag = tflag = 0;
!         while ((ch = getopt(argc, argv, "aAqQdfprtvBCL1c:i:P:o:S:")) != EOF)
                  switch(ch) {                    /* User-visible flags. */
                  case 'S':
                          ssh_program = optarg;
                          break;
--- 458,477 ----
              statistics = 0;
  
          fflag = tflag = 0;
! 	while ((ch = getopt(argc, argv, "aAqQdfprtvBCL1c:i:P:o:S:4"
! #ifdef ENABLE_IPV6
! 		"6"
! #endif
! 		)) != EOF)
                  switch(ch) {                    /* User-visible flags. */
+ 		case '4':
+ 	       		IPv4 = 1;
+ 			break;
+ #ifdef ENABLE_IPV6
+ 		case '6':
+ 	       		IPv6 = 1;
+ 			break;
+ #endif
                  case 'S':
                          ssh_program = optarg;
                          break;
***************
*** 589,594 ****
--- 618,634 ----
          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[];
***************
*** 644,649 ****
--- 684,690 ----
                          bp = xmalloc(len);
                          if (host) {
                                  *host++ = 0;
+ 				host = cleanhostname(host);
                                  suser = argv[i];
                                  if (*suser == '\0')
                                          suser = pwd->pw_name;
***************
*** 655,667 ****
                                      suser, host, cmd, src,
                                      tuser ? tuser : "", tuser ? "@" : "",
                                      thost, targ);
!                         } else
                                  (void)snprintf(bp, len,
                                      "exec %s%s %s -x -o'FallBackToRsh no' -o'ClearAllForwardings yes' -n %s %s %s '%s%s%s:%s'",
                                      ssh_program, verbose ? " -v" : "", options,
!                                     argv[i], cmd, src,
                                      tuser ? tuser : "", tuser ? "@" : "",
                                      thost, targ);
                          if (verbose)
                            fprintf(stderr, "Executing: %s\n", bp);
                          if (system(bp)) errs++;
--- 696,710 ----
                                      suser, host, cmd, src,
                                      tuser ? tuser : "", tuser ? "@" : "",
                                      thost, targ);
!                         } else {
!                                 host = cleanhostname(argv[i]);
                                  (void)snprintf(bp, len,
                                      "exec %s%s %s -x -o'FallBackToRsh no' -o'ClearAllForwardings yes' -n %s %s %s '%s%s%s:%s'",
                                      ssh_program, verbose ? " -v" : "", options,
!                                     host, cmd, src,
                                      tuser ? tuser : "", tuser ? "@" : "",
                                      thost, targ);
+ 			}
                          if (verbose)
                            fprintf(stderr, "Executing: %s\n", bp);
                          if (system(bp)) errs++;
***************
*** 671,677 ****
                                  len = strlen(targ) + CMDNEEDS + 20;
                                  bp = xmalloc(len);
                                  (void)snprintf(bp, len, "%s -t %s", cmd, targ);
!                                 host = thost;
                                  if (do_cmd(host,  tuser,
                                             bp, &remin, &remout) < 0)
                                    exit(1);
--- 714,720 ----
                                  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, &remout) < 0)
                                    exit(1);
***************
*** 721,726 ****
--- 764,770 ----
                          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);
***************
*** 1365,1375 ****
  colon(cp)
          char *cp;
  {
          if (*cp == ':')         /* Leading colon is part of file name. */
                  return (0);
  
          for (; *cp; ++cp) {
!                 if (*cp == ':')
                          return (cp);
                  if (*cp == '/')
                          return (0);
--- 1409,1427 ----
  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 == '@' && *(cp+1) == '[')
! 			flag = 1;
! 		if (*cp == ']' && *(cp+1) == ':' && flag)
! 			return (cp+1);
! 		if (*cp == ':' && !flag)
                          return (cp);
                  if (*cp == '/')
                          return (0);
