From cba9838e8fcfdd653a60f7b01edacdb3a31214a2 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 16 Jan 2002 14:47:00 +0000 Subject: Somewhat ugly fix to deal with non-blocking sockets. We just loop and try again. THIS IS NOT A NICE FIX. --- lib/http.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'lib') 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; } -- cgit v1.2.3