]> granicus.if.org Git - curl/commitdiff
Curl_read() now returns a negative return code if EWOULDBLOCK or similar
authorDaniel Stenberg <daniel@haxx.se>
Mon, 14 Jan 2002 23:14:59 +0000 (23:14 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 14 Jan 2002 23:14:59 +0000 (23:14 +0000)
lib/ftp.c
lib/http.c
lib/sendf.c
lib/sendf.h
lib/telnet.c
lib/transfer.c

index 1acf2dd7e426207f897458a05c20dfa897b9aa64..2def61f087f15c27eb30296bcd36d8f715e3746b 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -267,9 +267,16 @@ int Curl_GetFTPResponse(char *buf,
         ftp->cache = NULL;   /* clear the pointer */
         ftp->cache_size = 0; /* zero the size just in case */
       }
-      else if(CURLE_OK != Curl_read(conn, sockfd, ptr,
-                                    BUFSIZE-nread, &gotbytes))
-        keepon = FALSE;
+      else {
+        int res = Curl_read(conn, sockfd, ptr,
+                            BUFSIZE-nread, &gotbytes);
+        if(res < 0)
+          /* EWOULDBLOCK */
+          continue; /* go looping again */
+
+        if(CURLE_OK != res)
+          keepon = FALSE;
+      }
 
       if(!keepon)
         ;
index ffb442089276ea73b6efedb0105c0c379cc72627..795a6f79cff7fa3ef8bded0d313cecea63464777 100644 (file)
@@ -235,6 +235,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
   int subversion=0;
   struct SessionHandle *data=conn->data;
   CURLcode result;
+  int res;
 
   int nread;   /* total size read */
   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
        * that this is still ok and then remove this comment!
        */
-      if(CURLE_OK != Curl_read(conn, tunnelsocket, ptr, BUFSIZE-nread,
-                               &gotbytes))
+      res= Curl_read(conn, tunnelsocket, ptr, BUFSIZE-nread,
+                     &gotbytes);
+      if(res< 0)
+        /* EWOULDBLOCK */
+        continue; /* go loop yourself */
+      else if(res)
         keepon = FALSE;
       else if(gotbytes <= 0) {
         keepon = FALSE;
index 78581f5855cad47ab0bdac58583ee979ccd0a411..afb6991d67c389481d137ad2a32ce6cbb78c4733 100644 (file)
@@ -266,14 +266,18 @@ CURLcode Curl_client_write(struct SessionHandle *data,
   return CURLE_OK;
 }
 
-
 /*
  * Internal read-from-socket function. This is meant to deal with plain
  * 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,
-                   char *buf, size_t buffersize,
-                   ssize_t *n)
+int Curl_read(struct connectdata *conn,
+              int sockfd,
+              char *buf,
+              size_t buffersize,
+              ssize_t *n)
 {
   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() */
         break;
       }
-    } while(loop && SSL_pending(conn->ssl.handle));
+    } while(0);
+    if(loop && SSL_pending(conn->ssl.handle))
+      return -1; /* basicly EWOULDBLOCK */
   }
   else {
 #endif
@@ -310,6 +316,16 @@ CURLcode Curl_read(struct connectdata *conn, int sockfd,
     else
 #endif
       nread = sread (sockfd, buf, buffersize);
+
+    if(-1 == nread) {
+#ifdef WIN32
+      if(EWOULDBLOCK == GetLastError())
+#else
+      if(EWOULDBLOCK == errno)
+#endif
+        return -1;
+    }
+
 #ifdef USE_SSLEAY
   }
 #endif /* USE_SSLEAY */
index b231914161c49ee9dce88a4ff7afed3c0bbc0911..7b6cff7de18271162cfb56f3088f175773432b20 100644 (file)
@@ -45,9 +45,9 @@ CURLcode Curl_client_write(struct SessionHandle *data, int type, char *ptr,
                            size_t len);
 
 /* internal read-function, does plain socket, SSL and krb4 */
-CURLcode Curl_read(struct connectdata *conn, int sockfd,
-                   char *buf, size_t buffersize,
-                   ssize_t *n);
+int Curl_read(struct connectdata *conn, int sockfd,
+              char *buf, size_t buffersize,
+              ssize_t *n);
 /* internal write-function, does plain socket, SSL and krb4 */
 CURLcode Curl_write(struct connectdata *conn, int sockfd,
                     void *mem, size_t len,
index a46e0196cc64e402b88b093898ca604eac1476e1..5dfed69701f40c114daedd6f6b4736df67e03485 100644 (file)
@@ -1116,6 +1116,7 @@ CURLcode Curl_telnet(struct connectdata *conn)
         {
           if(events.lNetworkEvents & FD_READ)
           {
+            /* This reallu OUGHT to check its return code. */
             Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
             
             telrcv(conn, (unsigned char *)buf, nread);
@@ -1176,6 +1177,7 @@ CURLcode Curl_telnet(struct connectdata *conn)
       }
 
       if(FD_ISSET(sockfd, &readfd)) {
+        /* This OUGHT to check the return code... */
         Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
 
         /* if we receive 0 or less here, the server closed the connection and
index 2985cd6548889820fce8535afc6f9137f8c535cc..4111653b1fdd6c72d7cc44f8875509d56f28dc31 100644 (file)
@@ -173,7 +173,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
 {
   struct Curl_transfer_keeper *k = &conn->keep;
   struct SessionHandle *data = conn->data;
-  CURLcode result;
+  int result;
   ssize_t nread; /* number of bytes read */
   int didwhat=0;
 
@@ -181,18 +181,21 @@ CURLcode Curl_readwrite(struct connectdata *conn,
     if((k->keepon & KEEP_READ) &&
        FD_ISSET(conn->sockfd, &k->readfd)) {
 
-      if ((k->bytecount == 0) && (k->writebytecount == 0))
-        Curl_pgrsTime(data, TIMER_STARTTRANSFER);
-
-      didwhat |= KEEP_READ;
-
       /* read! */
       result = Curl_read(conn, conn->sockfd, k->buf,
                          BUFSIZE -1, &nread);
 
-      if(result)
+      if(0>result)
+        break; /* get out of loop */
+      if(result>0)
         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 */
       if (0 < (signed int) nread)
         k->buf[nread] = 0;