cURL / Mailing Lists / curl-library / Single Mail

curl-library

[PATCH] lib/file.c: Add option to make writes unbuffered

From: Sebastian Rasmussen <sebrn_at_axis.com>
Date: Fri, 5 Oct 2012 11:15:12 +0200

The default is, as it has been before, buffered writes.

---
 docs/libcurl/curl_easy_setopt.3  |    4 ++++
 docs/libcurl/symbols-in-versions |    1 +
 include/curl/curl.h              |    3 +++
 lib/file.c                       |   11 +++++++++++
 lib/url.c                        |    7 +++++++
 lib/urldata.h                    |    1 +
 6 files changed, 27 insertions(+)
diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3
index 3b0dc6c..2fb1d00 100644
--- a/docs/libcurl/curl_easy_setopt.3
+++ b/docs/libcurl/curl_easy_setopt.3
@@ -2507,6 +2507,10 @@ be assigned to newly created directories on the remote server.  The default
 value is \fI0755\fP, but any valid value can be used.  The only protocols that
 can use this are \fIsftp://\fP, \fIscp://\fP, and \fIfile://\fP.
 (Added in 7.16.4)
+.IP CURLOPT_UNBUFFERED_WRITES
+Pass a long. If set to 1, any writes for file uploads over the file protocol
+will be unbuffered and will be flushed to the file system. Set to 0 (default
+behavior) to keep writes buffered. (Added in 7.27.1)
 .SH TELNET OPTIONS
 .IP CURLOPT_TELNETOPTIONS
 Provide a pointer to a curl_slist with variables to pass to the telnet
diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions
index 1de1ace..e69d449 100644
--- a/docs/libcurl/symbols-in-versions
+++ b/docs/libcurl/symbols-in-versions
@@ -503,6 +503,7 @@ CURLOPT_TLSAUTH_TYPE            7.21.4
 CURLOPT_TLSAUTH_USERNAME        7.21.4
 CURLOPT_TRANSFERTEXT            7.1.1
 CURLOPT_TRANSFER_ENCODING       7.21.6
+CURLOPT_UNBUFFERED_WRITES       7.27.1
 CURLOPT_UNRESTRICTED_AUTH       7.10.4
 CURLOPT_UPLOAD                  7.1
 CURLOPT_URL                     7.1
diff --git a/include/curl/curl.h b/include/curl/curl.h
index 5b39a24..83087b4 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -1536,6 +1536,9 @@ typedef enum {
   /* set the SMTP auth originator */
   CINIT(MAIL_AUTH, OBJECTPOINT, 217),
 
+  /* Enable unbuffered writes to the file system */
+  CINIT(UNBUFFERED_WRITES, LONG, 218),
+
   CURLOPT_LASTENTRY /* the last unused */
 } CURLoption;
 
diff --git a/lib/file.c b/lib/file.c
index 1025022..9ce7549 100644
--- a/lib/file.c
+++ b/lib/file.c
@@ -364,6 +364,10 @@ static CURLcode file_upload(struct connectdata *conn)
     return CURLE_WRITE_ERROR;
   }
 
+  if(data->set.unbuffered_writes) {
+    setbuf(fp, NULL);
+  }
+
   if(-1 != data->set.infilesize)
     /* known size of data to "upload" */
     Curl_pgrsSetUploadSize(data, data->set.infilesize);
@@ -413,6 +417,13 @@ static CURLcode file_upload(struct connectdata *conn)
       break;
     }
 
+    if(data->set.unbuffered_writes) {
+      int fd = fileno(fp);
+      if (fd != -1) {
+        fsync(fd);
+      }
+    }
+
     bytecount += nread;
 
     Curl_pgrsSetUploadCounter(data, bytecount);
diff --git a/lib/url.c b/lib/url.c
index 8bbd3e4..8dc3210 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -757,6 +757,9 @@ CURLcode Curl_init_userdefined(struct UserDefined *set)
   set->tcp_keepintvl = 60;
   set->tcp_keepidle = 60;
 
+  /* the default is to use buffered writes for the file protocol */
+  set->unbuffered_writes = FALSE;
+
   return res;
 }
 
@@ -2609,6 +2612,10 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
     data->set.tcp_keepintvl = va_arg(param, long);
     break;
 
+  case CURLOPT_UNBUFFERED_WRITES:
+    data->set.unbuffered_writes = (0 != va_arg(param, long))?TRUE:FALSE;
+    break;
+
   default:
     /* unknown tag and its companion, just ignore: */
     result = CURLE_UNKNOWN_OPTION;
diff --git a/lib/urldata.h b/lib/urldata.h
index 5f893c9..dfee973 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -1594,6 +1594,7 @@ struct UserDefined {
   bool tcp_keepalive;    /* use TCP keepalives */
   long tcp_keepidle;     /* seconds in idle before sending keepalive probe */
   long tcp_keepintvl;    /* seconds between TCP keepalive probes */
+  bool unbuffered_writes;  /* use unbuffered writes for the file procotol */
 };
 
 struct Names {
-- 
1.7.10.4
--------------010807060303070805020600
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette:  http://curl.haxx.se/mail/etiquette.html
--------------010807060303070805020600--
Received on 2001-09-17