aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sendf.c20
-rw-r--r--lib/ssh.c11
2 files changed, 22 insertions, 9 deletions
diff --git a/lib/sendf.c b/lib/sendf.c
index 500bf66f0..65f137b05 100644
--- a/lib/sendf.c
+++ b/lib/sendf.c
@@ -516,13 +516,19 @@ int Curl_read(struct connectdata *conn, /* connection data */
}
}
#ifdef USE_LIBSSH2
- else if (conn->protocol & PROT_SCP) {
- nread = Curl_scp_recv(conn, num, buffertofill, bytesfromsocket);
- /* TODO: return CURLE_OK also for nread <= 0
- read failures and timeouts ? */
- }
- else if (conn->protocol & PROT_SFTP) {
- nread = Curl_sftp_recv(conn, num, buffertofill, bytesfromsocket);
+ else if (conn->protocol & (PROT_SCP|PROT_SFTP)) {
+ if(conn->protocol & PROT_SCP)
+ nread = Curl_scp_recv(conn, num, buffertofill, bytesfromsocket);
+ else if (conn->protocol & PROT_SFTP)
+ nread = Curl_sftp_recv(conn, num, buffertofill, bytesfromsocket);
+#ifdef LIBSSH2CHANNEL_EAGAIN
+ if((nread == LIBSSH2CHANNEL_EAGAIN) || (nread == 0))
+ /* EWOULDBLOCK */
+ return -1;
+#endif
+ if(nread < 0)
+ /* since it is negative and not EGAIN, it was a protocol-layer error */
+ return CURLE_RECV_ERROR;
}
#endif /* !USE_LIBSSH2 */
else {
diff --git a/lib/ssh.c b/lib/ssh.c
index 24cba1bac..375447a8b 100644
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -627,9 +627,10 @@ ssize_t Curl_scp_send(struct connectdata *conn, int sockindex,
* a regular CURLcode value.
*/
ssize_t Curl_scp_recv(struct connectdata *conn, int sockindex,
- char *mem, size_t len)
+ char *mem, size_t len)
{
ssize_t nread;
+ (void)sockindex; /* we only support SCP on the fixed known primary socket */
/* libssh2_channel_read() returns int
*
@@ -637,10 +638,16 @@ ssize_t Curl_scp_recv(struct connectdata *conn, int sockindex,
* in the SessionHandle struct
*/
+#ifdef LIBSSH2CHANNEL_EAGAIN
+ /* we prefer the non-blocking API but that didn't exist previously */
+ nread = (ssize_t)
+ libssh2_channel_readnb(conn->data->reqdata.proto.ssh->ssh_channel,
+ mem, len);
+#else
nread = (ssize_t)
libssh2_channel_read(conn->data->reqdata.proto.ssh->ssh_channel,
mem, len);
- (void)sockindex;
+#endif
return nread;
}