From: Daniel Stenberg Date: Fri, 2 Feb 2007 15:26:57 +0000 (+0000) Subject: prefer using the (upcoming) non-blocking libssh2 API X-Git-Tag: curl-7_16_2~379 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=abe90019d33362264b84dd56a73f25216e757e04;p=thirdparty%2Fcurl.git prefer using the (upcoming) non-blocking libssh2 API --- diff --git a/lib/sendf.c b/lib/sendf.c index 500bf66f06..65f137b05f 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 24cba1bac9..375447a8b8 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; }