Re: Passing SFTP options when using SCP

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

 



I just tried this patch and it seems to work as expected. The only thing I changed was to give initial values to sftp_copy_buflen and sftp_nrequests. If they aren't initialized is there some default that would kick into effect on the receiving side?

I'll be testing this in more detail once I have better access to my the testbed I use. Are you likely to be using 'X' as the command line argument if this gets rolled into a release? I just want to make sure my arguments don't conflict if I do a release earlier than you do.

Chris

On 12/6/22 8:17 PM, Damien Miller wrote:
On Tue, 6 Dec 2022, Chris Rapier wrote:

Hey all,

I might have missed this but is there any effective way of passing sftp
options when using scp? For example, increasing the number of outstanding
requests which would be the -R command line option in sftp.

For my purposes I'm mostly looking at sending different buffer (-B) and
request (-R) options. Even better if there is a way to do that
programmatically. For example, in sftp-client.c I can just change
DEFAULT_NUM_REQUESTS to whatever value I like and every sftp transfer I
initiate will use that.

Just curious. If there isn't I'll try to come up with a method and share it
when I'm done.

There are no options to do this ATM and at least one of the option
letters that sftp uses already has meaning for sftp. These are
rarely used, so maybe it makes sent to put them behind a single
getopt chat that accepts multiple arguments.

diff --git a/scp.c b/scp.c
index c7194c2..4e50be1 100644
--- a/scp.c
+++ b/scp.c
@@ -150,6 +150,10 @@ char *ssh_program = _PATH_SSH_PROGRAM;
  pid_t do_cmd_pid = -1;
  pid_t do_cmd_pid2 = -1;
+/* SFTP copy parameters */
+size_t sftp_copy_buflen;
+size_t sftp_nrequests;
+
  /* Needed for sftp */
  volatile sig_atomic_t interrupted = 0;
@@ -419,7 +423,7 @@ int
  main(int argc, char **argv)
  {
  	int ch, fflag, tflag, status, n;
-	char **newargv, *argv0;
+	char **newargv, *argv0, *cp;
  	const char *errstr;
  	extern char *optarg;
  	extern int optind;
@@ -452,7 +456,7 @@ main(int argc, char **argv)
fflag = Tflag = tflag = 0;
  	while ((ch = getopt(argc, argv,
-	    "12346ABCTdfOpqRrstvD:F:J:M:P:S:c:i:l:o:")) != -1) {
+	    "12346ABCTdfOpqRrstvD:F:J:M:P:S:c:i:l:o:X:")) != -1) {
  		switch (ch) {
  		/* User-visible flags. */
  		case '1':
@@ -533,6 +537,23 @@ main(int argc, char **argv)
  			addargs(&remote_remote_args, "-q");
  			showprogress = 0;
  			break;
+		case 'X':
+			if (strncmp(optarg, "buffer=", 7) == 0) {
+				sftp_copy_buflen = strtol(optarg + 7, &cp, 10);
+				if (sftp_copy_buflen == 0 || *cp != '\0') {
+					fatal("Invalid buffer size \"%s\"",
+					     optarg);
+				}
+			} else if (strncmp(optarg, "nrequests=", 10) == 0) {
+				sftp_nrequests = strtol(optarg + 10, &cp, 10);
+				if (sftp_nrequests == 0 || *cp != '\0') {
+					fatal("Invalid number of requests "
+					    "\"%s\"", optarg);
+				}
+			} else {
+				fatal("Invalid -X option");
+			}
+			break;
/* Server options. */
  		case 'd':
@@ -941,7 +962,8 @@ do_sftp_connect(char *host, char *user, int port, char *sftp_direct,
  		    reminp, remoutp, pidp) < 0)
  			return NULL;
  	}
-	return do_init(*reminp, *remoutp, 32768, 64, limit_kbps);
+	return do_init(*reminp, *remoutp,
+	    sftp_copy_buflen, sftp_nrequests, limit_kbps);
  }
void
_______________________________________________
openssh-unix-dev mailing list
openssh-unix-dev@xxxxxxxxxxx
https://lists.mindrot.org/mailman/listinfo/openssh-unix-dev



[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux