summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpquerna <pquerna@13f79535-47bb-0310-9956-ffa450edef68>2005-03-15 22:24:00 +0000
committerpquerna <pquerna@13f79535-47bb-0310-9956-ffa450edef68>2005-03-15 22:24:00 +0000
commita5d186d3157df0227dc3a8206bc3e8ca75a8b14e (patch)
tree1e8c4c6e20546a2c7202ccea977605d55ab8b4a6
parent7f9dcc6f9475950de3e0c18f1e6f97e1afed078d (diff)
downloadlibapr-a5d186d3157df0227dc3a8206bc3e8ca75a8b14e.tar.gz
backport fix for writev_full from trunk.
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/branches/1.1.x@157597 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--file_io/unix/fullrw.c29
1 files changed, 9 insertions, 20 deletions
diff --git a/file_io/unix/fullrw.c b/file_io/unix/fullrw.c
index 7d1f85b32..71ffe0f55 100644
--- a/file_io/unix/fullrw.c
+++ b/file_io/unix/fullrw.c
@@ -66,30 +66,19 @@ APR_DECLARE(apr_status_t) apr_file_writev_full(apr_file_t *thefile,
apr_size_t nvec,
apr_size_t *bytes_written)
{
- apr_status_t status;
+ apr_status_t rv = APR_SUCCESS;
+ int i;
+ apr_size_t amt = 0;
apr_size_t total = 0;
- do {
- apr_size_t i, 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);
+ for (i = 0; i < nvec && rv == APR_SUCCESS; i++) {
+ rv = apr_file_write_full(thefile, vec[i].iov_base,
+ vec[i].iov_len, &amt);
+ total += amt;
+ }
if (bytes_written != NULL)
*bytes_written = total;
- return status;
+ return rv;
}
-