1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-22 08:08:50 -05:00

Curl_read() now returns a negative return code if EWOULDBLOCK or similar

This commit is contained in:
Daniel Stenberg 2002-01-14 23:14:59 +00:00
parent fefc7ea600
commit 4931fbce49
6 changed files with 53 additions and 20 deletions

View File

@ -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)
; ;

View File

@ -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;

View File

@ -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 */

View File

@ -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,

View File

@ -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

View File

@ -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;