apr  1.7.0
About: APR (Apache Portable Runtime) project offers software libraries that provide a predictable and consistent interface to underlying platform-specific implementations (APR core library).
  Fossies Dox: apr-1.7.0.tar.bz2  ("inofficial" and yet experimental doxygen-generated source code documentation)  

fullrw.c
Go to the documentation of this file.
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 
20 APR_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 {
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 
42 APR_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 {
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 
65 APR_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 {
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 }
bytes_written
const void apr_size_t apr_size_t * bytes_written
Definition: apr_file_io.h:567
status
int int status
Definition: apr_thread_proc.h:769
nvec
const struct iovec apr_size_t nvec
Definition: apr_file_io.h:519
APR_DECLARE
APR_DECLARE(apr_status_t)
Definition: fullrw.c:20
thefile
apr_file_t * thefile
Definition: apr_file_io.h:594
buf
char * buf
Definition: apr_errno.h:52
vec
const struct iovec * vec
Definition: apr_file_io.h:519
apr_file_t
Definition: apr_arch_file_io.h:97
apr_file_io.h
APR File I/O Handling.
apr_status_t
int apr_status_t
Definition: apr_errno.h:44
bytes_read
void apr_size_t apr_size_t * bytes_read
Definition: apr_file_io.h:542
APR_SUCCESS
#define APR_SUCCESS
Definition: apr_errno.h:225
nbytes
void apr_size_t * nbytes
Definition: apr_file_io.h:482