Curl_read() now returns a negative return code if EWOULDBLOCK or similar
This commit is contained in:
Родитель
fefc7ea600
Коммит
4931fbce49
13
lib/ftp.c
13
lib/ftp.c
|
@ -267,9 +267,16 @@ int Curl_GetFTPResponse(char *buf,
|
||||||
ftp->cache = NULL; /* clear the pointer */
|
ftp->cache = NULL; /* clear the pointer */
|
||||||
ftp->cache_size = 0; /* zero the size just in case */
|
ftp->cache_size = 0; /* zero the size just in case */
|
||||||
}
|
}
|
||||||
else if(CURLE_OK != Curl_read(conn, sockfd, ptr,
|
else {
|
||||||
BUFSIZE-nread, &gotbytes))
|
int res = Curl_read(conn, sockfd, ptr,
|
||||||
keepon = FALSE;
|
BUFSIZE-nread, &gotbytes);
|
||||||
|
if(res < 0)
|
||||||
|
/* EWOULDBLOCK */
|
||||||
|
continue; /* go looping again */
|
||||||
|
|
||||||
|
if(CURLE_OK != res)
|
||||||
|
keepon = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if(!keepon)
|
if(!keepon)
|
||||||
;
|
;
|
||||||
|
|
|
@ -235,6 +235,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
||||||
int subversion=0;
|
int subversion=0;
|
||||||
struct SessionHandle *data=conn->data;
|
struct SessionHandle *data=conn->data;
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
|
int res;
|
||||||
|
|
||||||
int nread; /* total size read */
|
int nread; /* total size read */
|
||||||
int perline; /* count bytes per line */
|
int perline; /* count bytes per line */
|
||||||
|
@ -317,8 +318,12 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
||||||
* to read, but when we use Curl_read() it may do so. Do confirm
|
* to read, but when we use Curl_read() it may do so. Do confirm
|
||||||
* that this is still ok and then remove this comment!
|
* that this is still ok and then remove this comment!
|
||||||
*/
|
*/
|
||||||
if(CURLE_OK != Curl_read(conn, tunnelsocket, ptr, BUFSIZE-nread,
|
res= Curl_read(conn, tunnelsocket, ptr, BUFSIZE-nread,
|
||||||
&gotbytes))
|
&gotbytes);
|
||||||
|
if(res< 0)
|
||||||
|
/* EWOULDBLOCK */
|
||||||
|
continue; /* go loop yourself */
|
||||||
|
else if(res)
|
||||||
keepon = FALSE;
|
keepon = FALSE;
|
||||||
else if(gotbytes <= 0) {
|
else if(gotbytes <= 0) {
|
||||||
keepon = FALSE;
|
keepon = FALSE;
|
||||||
|
|
26
lib/sendf.c
26
lib/sendf.c
|
@ -266,14 +266,18 @@ CURLcode Curl_client_write(struct SessionHandle *data,
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Internal read-from-socket function. This is meant to deal with plain
|
* Internal read-from-socket function. This is meant to deal with plain
|
||||||
* sockets, SSL sockets and kerberos sockets.
|
* sockets, SSL sockets and kerberos sockets.
|
||||||
|
*
|
||||||
|
* If the read would block (EWOULDBLOCK) we return -1. Otherwise we return
|
||||||
|
* a regular CURLcode value.
|
||||||
*/
|
*/
|
||||||
CURLcode Curl_read(struct connectdata *conn, int sockfd,
|
int Curl_read(struct connectdata *conn,
|
||||||
char *buf, size_t buffersize,
|
int sockfd,
|
||||||
ssize_t *n)
|
char *buf,
|
||||||
|
size_t buffersize,
|
||||||
|
ssize_t *n)
|
||||||
{
|
{
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
|
|
||||||
|
@ -300,7 +304,9 @@ CURLcode Curl_read(struct connectdata *conn, int sockfd,
|
||||||
/* if there's data pending, then we re-invoke SSL_read() */
|
/* if there's data pending, then we re-invoke SSL_read() */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while(loop && SSL_pending(conn->ssl.handle));
|
} while(0);
|
||||||
|
if(loop && SSL_pending(conn->ssl.handle))
|
||||||
|
return -1; /* basicly EWOULDBLOCK */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#endif
|
#endif
|
||||||
|
@ -310,6 +316,16 @@ CURLcode Curl_read(struct connectdata *conn, int sockfd,
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
nread = sread (sockfd, buf, buffersize);
|
nread = sread (sockfd, buf, buffersize);
|
||||||
|
|
||||||
|
if(-1 == nread) {
|
||||||
|
#ifdef WIN32
|
||||||
|
if(EWOULDBLOCK == GetLastError())
|
||||||
|
#else
|
||||||
|
if(EWOULDBLOCK == errno)
|
||||||
|
#endif
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef USE_SSLEAY
|
#ifdef USE_SSLEAY
|
||||||
}
|
}
|
||||||
#endif /* USE_SSLEAY */
|
#endif /* USE_SSLEAY */
|
||||||
|
|
|
@ -45,9 +45,9 @@ CURLcode Curl_client_write(struct SessionHandle *data, int type, char *ptr,
|
||||||
size_t len);
|
size_t len);
|
||||||
|
|
||||||
/* internal read-function, does plain socket, SSL and krb4 */
|
/* internal read-function, does plain socket, SSL and krb4 */
|
||||||
CURLcode Curl_read(struct connectdata *conn, int sockfd,
|
int Curl_read(struct connectdata *conn, int sockfd,
|
||||||
char *buf, size_t buffersize,
|
char *buf, size_t buffersize,
|
||||||
ssize_t *n);
|
ssize_t *n);
|
||||||
/* internal write-function, does plain socket, SSL and krb4 */
|
/* internal write-function, does plain socket, SSL and krb4 */
|
||||||
CURLcode Curl_write(struct connectdata *conn, int sockfd,
|
CURLcode Curl_write(struct connectdata *conn, int sockfd,
|
||||||
void *mem, size_t len,
|
void *mem, size_t len,
|
||||||
|
|
|
@ -1116,6 +1116,7 @@ CURLcode Curl_telnet(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
if(events.lNetworkEvents & FD_READ)
|
if(events.lNetworkEvents & FD_READ)
|
||||||
{
|
{
|
||||||
|
/* This reallu OUGHT to check its return code. */
|
||||||
Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
|
Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
|
||||||
|
|
||||||
telrcv(conn, (unsigned char *)buf, nread);
|
telrcv(conn, (unsigned char *)buf, nread);
|
||||||
|
@ -1176,6 +1177,7 @@ CURLcode Curl_telnet(struct connectdata *conn)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(FD_ISSET(sockfd, &readfd)) {
|
if(FD_ISSET(sockfd, &readfd)) {
|
||||||
|
/* This OUGHT to check the return code... */
|
||||||
Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
|
Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
|
||||||
|
|
||||||
/* if we receive 0 or less here, the server closed the connection and
|
/* if we receive 0 or less here, the server closed the connection and
|
||||||
|
|
|
@ -173,7 +173,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
|
||||||
{
|
{
|
||||||
struct Curl_transfer_keeper *k = &conn->keep;
|
struct Curl_transfer_keeper *k = &conn->keep;
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
CURLcode result;
|
int result;
|
||||||
ssize_t nread; /* number of bytes read */
|
ssize_t nread; /* number of bytes read */
|
||||||
int didwhat=0;
|
int didwhat=0;
|
||||||
|
|
||||||
|
@ -181,18 +181,21 @@ CURLcode Curl_readwrite(struct connectdata *conn,
|
||||||
if((k->keepon & KEEP_READ) &&
|
if((k->keepon & KEEP_READ) &&
|
||||||
FD_ISSET(conn->sockfd, &k->readfd)) {
|
FD_ISSET(conn->sockfd, &k->readfd)) {
|
||||||
|
|
||||||
if ((k->bytecount == 0) && (k->writebytecount == 0))
|
|
||||||
Curl_pgrsTime(data, TIMER_STARTTRANSFER);
|
|
||||||
|
|
||||||
didwhat |= KEEP_READ;
|
|
||||||
|
|
||||||
/* read! */
|
/* read! */
|
||||||
result = Curl_read(conn, conn->sockfd, k->buf,
|
result = Curl_read(conn, conn->sockfd, k->buf,
|
||||||
BUFSIZE -1, &nread);
|
BUFSIZE -1, &nread);
|
||||||
|
|
||||||
if(result)
|
if(0>result)
|
||||||
|
break; /* get out of loop */
|
||||||
|
if(result>0)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
if ((k->bytecount == 0) && (k->writebytecount == 0))
|
||||||
|
Curl_pgrsTime(data, TIMER_STARTTRANSFER);
|
||||||
|
|
||||||
|
|
||||||
|
didwhat |= KEEP_READ;
|
||||||
|
|
||||||
/* NULL terminate, allowing string ops to be used */
|
/* NULL terminate, allowing string ops to be used */
|
||||||
if (0 < (signed int) nread)
|
if (0 < (signed int) nread)
|
||||||
k->buf[nread] = 0;
|
k->buf[nread] = 0;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче