1251875Speter/* Licensed to the Apache Software Foundation (ASF) under one or more
2251875Speter * contributor license agreements.  See the NOTICE file distributed with
3251875Speter * this work for additional information regarding copyright ownership.
4251875Speter * The ASF licenses this file to You under the Apache License, Version 2.0
5251875Speter * (the "License"); you may not use this file except in compliance with
6251875Speter * the License.  You may obtain a copy of the License at
7251875Speter *
8251875Speter *     http://www.apache.org/licenses/LICENSE-2.0
9251875Speter *
10251875Speter * Unless required by applicable law or agreed to in writing, software
11251875Speter * distributed under the License is distributed on an "AS IS" BASIS,
12251875Speter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13251875Speter * See the License for the specific language governing permissions and
14251875Speter * limitations under the License.
15251875Speter */
16251875Speter
17251875Speter#include "apr_file_io.h"
18251875Speter
19251875Speter
20251875SpeterAPR_DECLARE(apr_status_t) apr_file_read_full(apr_file_t *thefile, void *buf,
21251875Speter                                             apr_size_t nbytes,
22251875Speter                                             apr_size_t *bytes_read)
23251875Speter{
24251875Speter    apr_status_t status;
25251875Speter    apr_size_t total_read = 0;
26251875Speter
27251875Speter    do {
28251875Speter	apr_size_t amt = nbytes;
29251875Speter
30251875Speter	status = apr_file_read(thefile, buf, &amt);
31251875Speter	buf = (char *)buf + amt;
32251875Speter        nbytes -= amt;
33251875Speter        total_read += amt;
34251875Speter    } while (status == APR_SUCCESS && nbytes > 0);
35251875Speter
36251875Speter    if (bytes_read != NULL)
37251875Speter        *bytes_read = total_read;
38251875Speter
39251875Speter    return status;
40251875Speter}
41251875Speter
42251875SpeterAPR_DECLARE(apr_status_t) apr_file_write_full(apr_file_t *thefile,
43251875Speter                                              const void *buf,
44251875Speter                                              apr_size_t nbytes,
45251875Speter                                              apr_size_t *bytes_written)
46251875Speter{
47251875Speter    apr_status_t status;
48251875Speter    apr_size_t total_written = 0;
49251875Speter
50251875Speter    do {
51251875Speter	apr_size_t amt = nbytes;
52251875Speter
53251875Speter	status = apr_file_write(thefile, buf, &amt);
54251875Speter	buf = (char *)buf + amt;
55251875Speter        nbytes -= amt;
56251875Speter        total_written += amt;
57251875Speter    } while (status == APR_SUCCESS && nbytes > 0);
58251875Speter
59251875Speter    if (bytes_written != NULL)
60251875Speter        *bytes_written = total_written;
61251875Speter
62251875Speter    return status;
63251875Speter}
64251875Speter
65251875SpeterAPR_DECLARE(apr_status_t) apr_file_writev_full(apr_file_t *thefile,
66251875Speter                                               const struct iovec *vec,
67251875Speter                                               apr_size_t nvec,
68251875Speter                                               apr_size_t *bytes_written)
69251875Speter{
70251875Speter    apr_status_t rv = APR_SUCCESS;
71251875Speter    apr_size_t i;
72251875Speter    apr_size_t amt = 0;
73251875Speter    apr_size_t total = 0;
74251875Speter
75251875Speter    for (i = 0; i < nvec; i++) {
76251875Speter        total += vec[i].iov_len;
77251875Speter    }
78251875Speter
79251875Speter    rv = apr_file_writev(thefile, vec, nvec, &amt);
80251875Speter
81251875Speter    if (bytes_written != NULL)
82251875Speter        *bytes_written = amt;
83251875Speter
84251875Speter    if (rv != APR_SUCCESS || (amt == total)) {
85251875Speter        return rv;
86251875Speter    }
87251875Speter
88251875Speter    for (i = 0; i < nvec && amt; i++) {
89251875Speter        if (amt >= vec[i].iov_len) {
90251875Speter            amt -= vec[i].iov_len;
91251875Speter        }
92251875Speter        else {
93251875Speter            break;
94251875Speter        }
95251875Speter    }
96251875Speter
97251875Speter    if (amt) {
98251875Speter        rv = apr_file_write_full(thefile, (const char *)vec[i].iov_base + amt,
99251875Speter                                 vec[i].iov_len - amt, NULL);
100251875Speter    }
101251875Speter
102251875Speter    for (; i < nvec && rv == APR_SUCCESS; i++) {
103251875Speter        rv = apr_file_write_full(thefile, vec[i].iov_base,
104251875Speter                                 vec[i].iov_len, &amt);
105251875Speter    }
106251875Speter
107251875Speter    if (bytes_written != NULL)
108251875Speter        *bytes_written = total;
109251875Speter
110251875Speter    return rv;
111251875Speter}
112