From: Daniel Silverstone Date: Wed, 26 Apr 2023 08:44:57 +0000 (+0100) Subject: ssh: Add support for libssh2 read timeout X-Git-Tag: curl-8_1_0~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e915b6904c02294dc5ccd9b7c95d46af2839dd1c;p=thirdparty%2Fcurl.git ssh: Add support for libssh2 read timeout Hook the new (1.11.0 or newer) libssh2 support for setting a read timeout into the SERVER_RESPONSE_TIMEOUT option. With this done, clients can use the standard curl response timeout setting to also control the time that libssh2 will wait for packets from a slow server. This is necessary to enable use of very slow SFTP servers. Signed-off-by: Daniel Silverstone Closes #10965 --- diff --git a/docs/libcurl/opts/CURLOPT_SERVER_RESPONSE_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_SERVER_RESPONSE_TIMEOUT.3 index 69d892e655..46d6fdaa74 100644 --- a/docs/libcurl/opts/CURLOPT_SERVER_RESPONSE_TIMEOUT.3 +++ b/docs/libcurl/opts/CURLOPT_SERVER_RESPONSE_TIMEOUT.3 @@ -45,7 +45,7 @@ This option was formerly known as \fBCURLOPT_FTP_RESPONSE_TIMEOUT\fP. .SH DEFAULT None .SH PROTOCOLS -FTP, IMAP, POP3 and SMTP +FTP, IMAP, POP3, SMTP, and SSH .SH EXAMPLE .nf CURL *curl = curl_easy_init(); @@ -60,6 +60,9 @@ if(curl) { .fi .SH AVAILABILITY Added in 7.10.8. Used under this name since 7.20.0 + +Support for SSH is predicated on a new enough (1.11.0) version of libssh2 +being available when compiling libcurl. .SH RETURN VALUE Returns CURLE_OK if supported, and CURLE_UNKNOWN_OPTION if not. Returns CURLE_BAD_FUNCTION_ARGUMENT if set to a negative value or a value that when diff --git a/lib/vssh/libssh2.c b/lib/vssh/libssh2.c index dd39a844c6..14c2784fe3 100644 --- a/lib/vssh/libssh2.c +++ b/lib/vssh/libssh2.c @@ -3280,6 +3280,16 @@ static CURLcode ssh_connect(struct Curl_easy *data, bool *done) return CURLE_FAILED_INIT; } +#ifdef HAVE_LIBSSH2_VERSION + /* Set the packet read timeout if the libssh2 version supports it */ +#if LIBSSH2_VERSION_NUM >= 0x010B00 + if(data->set.server_response_timeout > 0) { + libssh2_session_set_read_timeout(sshc->ssh_session, + data->set.server_response_timeout / 1000); + } +#endif +#endif + #ifndef CURL_DISABLE_PROXY if(conn->http_proxy.proxytype == CURLPROXY_HTTPS) { /*