summaryrefslogtreecommitdiff
path: root/file_io
diff options
context:
space:
mode:
authorpquerna <pquerna@13f79535-47bb-0310-9956-ffa450edef68>2004-12-05 02:17:30 +0000
committerpquerna <pquerna@13f79535-47bb-0310-9956-ffa450edef68>2004-12-05 02:17:30 +0000
commitb4f4f12975476cc57b8163abe0bcf937b83330f5 (patch)
tree6eb56cab80b162bb7728ad44750c68a8300fed53 /file_io
parent6ce9594ae922941baa68b477f279d4c67c0937ab (diff)
downloadlibapr-b4f4f12975476cc57b8163abe0bcf937b83330f5.tar.gz
* file_io/unix/fullrw.c: Add apr_file_writev_full to ensure an iovec is
completely written to the file. * include/apr_file_io.h: Define APR_MAX_IOVEC_SIZE Add public def for apr_file_writev_full. * file_io/unix/readwrite.c: For systems without writev, ensure that they get the correct number of bytes written. * test/*: Add a new test for apr_file_writev_full. git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@109843 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'file_io')
-rw-r--r--file_io/unix/fullrw.c34
-rw-r--r--file_io/unix/readwrite.c2
2 files changed, 36 insertions, 0 deletions
diff --git a/file_io/unix/fullrw.c b/file_io/unix/fullrw.c
index af7b70e38..5412f21af 100644
--- a/file_io/unix/fullrw.c
+++ b/file_io/unix/fullrw.c
@@ -60,3 +60,37 @@ APR_DECLARE(apr_status_t) apr_file_write_full(apr_file_t *thefile,
return status;
}
+
+APR_DECLARE(apr_status_t) apr_file_writev_full(apr_file_t *thefile,
+ const struct iovec *vec,
+ apr_size_t nvec,
+ apr_size_t *bytes_written)
+{
+ apr_status_t status;
+ apr_size_t total = 0;
+
+ do {
+ int i;
+ apr_size_t amt;
+ status = apr_file_writev(thefile, vec, nvec, &amt);
+
+ /* We assume that writev will only write complete iovec areas.
+ * Incomplete writes inside a single area are not supported.
+ * This should be safe according to SuS v2.
+ */
+ for(i = 0; i < nvec; i++) {
+ total += vec[i].iov_len;
+ if(total >= amt) {
+ vec = &vec[i+1];
+ nvec -= i+1;
+ break;
+ }
+ }
+ } while (status == APR_SUCCESS && nvec > 0);
+
+ if (bytes_written != NULL)
+ *bytes_written = total;
+
+ return status;
+}
+
diff --git a/file_io/unix/readwrite.c b/file_io/unix/readwrite.c
index edd692e4b..069adfa96 100644
--- a/file_io/unix/readwrite.c
+++ b/file_io/unix/readwrite.c
@@ -244,6 +244,8 @@ APR_DECLARE(apr_status_t) apr_file_writev(apr_file_t *thefile, const struct iove
int i, tbytes;
apr_status_t rv = APR_SUCCESS;
+ *nbytes = 0;
+
for(i = 0; i < nvec; i++){
tbytes = vec[i].iov_len;
rv = apr_file_write(thefile, vec[i].iov_base, &tbytes);