- djm@cvs.openbsd.org 2010/11/26 05:52:49
     [scp.c]
     Pass through ssh command-line flags and options when doing remote-remote
     transfers, e.g. to enable agent forwarding which is particularly useful
     in this case; bz#1837 ok dtucker@
diff --git a/ChangeLog b/ChangeLog
index 5c3ae03..7c72977 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -29,6 +29,11 @@
      [session.c]
      replace close() loop for fds 3->64 with closefrom();
      ok markus deraadt dtucker
+   - djm@cvs.openbsd.org 2010/11/26 05:52:49
+     [scp.c]
+     Pass through ssh command-line flags and options when doing remote-remote
+     transfers, e.g. to enable agent forwarding which is particularly useful
+     in this case; bz#1837 ok dtucker@
 
 20101124
  - (dtucker) [platform.c session.c] Move the getluid call out of session.c and
diff --git a/scp.c b/scp.c
index a4066c6..774e602 100644
--- a/scp.c
+++ b/scp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: scp.c,v 1.167 2010/09/22 22:58:51 djm Exp $ */
+/* $OpenBSD: scp.c,v 1.168 2010/11/26 05:52:49 djm Exp $ */
 /*
  * scp - secure remote copy.  This is basically patched BSD rcp which
  * uses ssh to do the data transfer (instead of using rcmd).
@@ -122,6 +122,7 @@
 
 /* Struct for addargs */
 arglist args;
+arglist remote_remote_args;
 
 /* Bandwidth limit */
 long long limit_kbps = 0;
@@ -334,12 +335,13 @@
 	__progname = ssh_get_progname(argv[0]);
 
 	memset(&args, '\0', sizeof(args));
-	args.list = NULL;
+	memset(&remote_remote_args, '\0', sizeof(remote_remote_args));
+	args.list = remote_remote_args.list = NULL;
 	addargs(&args, "%s", ssh_program);
 	addargs(&args, "-x");
-	addargs(&args, "-oForwardAgent no");
-	addargs(&args, "-oPermitLocalCommand no");
-	addargs(&args, "-oClearAllForwardings yes");
+	addargs(&args, "-oForwardAgent=no");
+	addargs(&args, "-oPermitLocalCommand=no");
+	addargs(&args, "-oClearAllForwardings=yes");
 
 	fflag = tflag = 0;
 	while ((ch = getopt(argc, argv, "dfl:prtvBCc:i:P:q1246S:o:F:")) != -1)
@@ -351,20 +353,26 @@
 		case '6':
 		case 'C':
 			addargs(&args, "-%c", ch);
+			addargs(&remote_remote_args, "-%c", ch);
 			break;
 		case 'o':
 		case 'c':
 		case 'i':
 		case 'F':
+			addargs(&remote_remote_args, "-%c", ch);
+			addargs(&remote_remote_args, "%s", optarg);
 			addargs(&args, "-%c", ch);
 			addargs(&args, "%s", optarg);
 			break;
 		case 'P':
+			addargs(&remote_remote_args, "-p");
+			addargs(&remote_remote_args, "%s", optarg);
 			addargs(&args, "-p");
 			addargs(&args, "%s", optarg);
 			break;
 		case 'B':
-			addargs(&args, "-oBatchmode yes");
+			addargs(&remote_remote_args, "-oBatchmode=yes");
+			addargs(&args, "-oBatchmode=yes");
 			break;
 		case 'l':
 			limit_kbps = strtonum(optarg, 1, 100 * 1024 * 1024,
@@ -385,10 +393,12 @@
 			break;
 		case 'v':
 			addargs(&args, "-v");
+			addargs(&remote_remote_args, "-v");
 			verbose_mode = 1;
 			break;
 		case 'q':
 			addargs(&args, "-q");
+			addargs(&remote_remote_args, "-q");
 			showprogress = 0;
 			break;
 
@@ -492,6 +502,7 @@
 	char *bp, *host, *src, *suser, *thost, *tuser, *arg;
 	arglist alist;
 	int i;
+	u_int j;
 
 	memset(&alist, '\0', sizeof(alist));
 	alist.list = NULL;
@@ -522,12 +533,13 @@
 		if (src) {	/* remote to remote */
 			freeargs(&alist);
 			addargs(&alist, "%s", ssh_program);
-			if (verbose_mode)
-				addargs(&alist, "-v");
 			addargs(&alist, "-x");
-			addargs(&alist, "-oClearAllForwardings yes");
+			addargs(&alist, "-oClearAllForwardings=yes");
 			addargs(&alist, "-n");
-
+			for (j = 0; j < remote_remote_args.num; j++) {
+				addargs(&alist, "%s",
+				    remote_remote_args.list[j]);
+			}
 			*src++ = 0;
 			if (*src == 0)
 				src = ".";