diff options
author | Daniel Stenberg <daniel@haxx.se> | 2002-01-16 14:47:00 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2002-01-16 14:47:00 +0000 |
commit | cba9838e8fcfdd653a60f7b01edacdb3a31214a2 (patch) | |
tree | fc5ea69bb5e90e623285f8d72707fb9a638720a3 | |
parent | b6dba9f5dda70e2a038b7aad394fbace7ccbeb82 (diff) |
Somewhat ugly fix to deal with non-blocking sockets. We just loop and try
again. THIS IS NOT A NICE FIX.
-rw-r--r-- | lib/http.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/lib/http.c b/lib/http.c index 795a6f79c..42668b398 100644 --- a/lib/http.c +++ b/lib/http.c @@ -128,8 +128,10 @@ static CURLcode add_buffer_send(int sockfd, struct connectdata *conn, send_buffer *in, long *bytes_written) { - size_t amount; - CURLcode result; + ssize_t amount; + CURLcode res; + char *ptr; + int size; if(conn->data->set.verbose) { fputs("> ", conn->data->set.err); @@ -137,7 +139,25 @@ CURLcode add_buffer_send(int sockfd, struct connectdata *conn, send_buffer *in, fwrite(in->buffer, in->size_used, 1, conn->data->set.err); } - result = Curl_write(conn, sockfd, in->buffer, in->size_used, &amount); + /* The looping below is required since we use non-blocking sockets, but due + to the circumstances we will just loop and try again and again etc */ + + ptr = in->buffer; + size = in->size_used; + do { + res = Curl_write(conn, sockfd, ptr, size, &amount); + + if(CURLE_OK != res) + break; + + if(amount != size) { + size += amount; + ptr += amount; + } + else + break; + + } while(1); if(in->buffer) free(in->buffer); @@ -145,7 +165,7 @@ CURLcode add_buffer_send(int sockfd, struct connectdata *conn, send_buffer *in, *bytes_written = amount; - return result; + return res; } |