1/* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "apr_file_io.h" 18 19 20APR_DECLARE(apr_status_t) apr_file_read_full(apr_file_t *thefile, void *buf, 21 apr_size_t nbytes, 22 apr_size_t *bytes_read) 23{ 24 apr_status_t status; 25 apr_size_t total_read = 0; 26 27 do { 28 apr_size_t amt = nbytes; 29 30 status = apr_file_read(thefile, buf, &amt); 31 buf = (char *)buf + amt; 32 nbytes -= amt; 33 total_read += amt; 34 } while (status == APR_SUCCESS && nbytes > 0); 35 36 if (bytes_read != NULL) 37 *bytes_read = total_read; 38 39 return status; 40} 41 42APR_DECLARE(apr_status_t) apr_file_write_full(apr_file_t *thefile, 43 const void *buf, 44 apr_size_t nbytes, 45 apr_size_t *bytes_written) 46{ 47 apr_status_t status; 48 apr_size_t total_written = 0; 49 50 do { 51 apr_size_t amt = nbytes; 52 53 status = apr_file_write(thefile, buf, &amt); 54 buf = (char *)buf + amt; 55 nbytes -= amt; 56 total_written += amt; 57 } while (status == APR_SUCCESS && nbytes > 0); 58 59 if (bytes_written != NULL) 60 *bytes_written = total_written; 61 62 return status; 63} 64 65APR_DECLARE(apr_status_t) apr_file_writev_full(apr_file_t *thefile, 66 const struct iovec *vec, 67 apr_size_t nvec, 68 apr_size_t *bytes_written) 69{ 70 apr_status_t rv = APR_SUCCESS; 71 apr_size_t i; 72 apr_size_t amt = 0; 73 apr_size_t total = 0; 74 75 for (i = 0; i < nvec; i++) { 76 total += vec[i].iov_len; 77 } 78 79 rv = apr_file_writev(thefile, vec, nvec, &amt); 80 81 if (bytes_written != NULL) 82 *bytes_written = amt; 83 84 if (rv != APR_SUCCESS || (amt == total)) { 85 return rv; 86 } 87 88 for (i = 0; i < nvec && amt; i++) { 89 if (amt >= vec[i].iov_len) { 90 amt -= vec[i].iov_len; 91 } 92 else { 93 break; 94 } 95 } 96 97 if (amt) { 98 rv = apr_file_write_full(thefile, (const char *)vec[i].iov_base + amt, 99 vec[i].iov_len - amt, NULL); 100 } 101 102 for (; i < nvec && rv == APR_SUCCESS; i++) { 103 rv = apr_file_write_full(thefile, vec[i].iov_base, 104 vec[i].iov_len, &amt); 105 } 106 107 if (bytes_written != NULL) 108 *bytes_written = total; 109 110 return rv; 111} 112