diff options
author | Paul Querna <pquerna@apache.org> | 2004-12-05 02:17:30 +0000 |
---|---|---|
committer | Paul Querna <pquerna@apache.org> | 2004-12-05 02:17:30 +0000 |
commit | cf6ff58d912496758b4859995c05c91d1d566175 (patch) | |
tree | 6eb56cab80b162bb7728ad44750c68a8300fed53 /file_io/unix | |
parent | eadf90c92999b78f389ef8df68b13dbf197e6ad4 (diff) | |
download | apr-cf6ff58d912496758b4859995c05c91d1d566175.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: https://svn.apache.org/repos/asf/apr/apr/trunk@109843 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'file_io/unix')
-rw-r--r-- | file_io/unix/fullrw.c | 34 | ||||
-rw-r--r-- | file_io/unix/readwrite.c | 2 |
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); |