1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * 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 #ifndef HAVE_SYS_UIO_H 18 19 #include <cutils/uio.h> 20 #include <unistd.h> 21 22 int readv( int fd, struct iovec* vecs, int count ) 23 { 24 int total = 0; 25 26 for ( ; count > 0; count--, vecs++ ) { 27 const char* buf = vecs->iov_base; 28 int len = vecs->iov_len; 29 30 while (len > 0) { 31 int ret = read( fd, buf, len ); 32 if (ret < 0) { 33 if (total == 0) 34 total = -1; 35 goto Exit; 36 } 37 if (ret == 0) 38 goto Exit; 39 40 total += ret; 41 buf += ret; 42 len -= ret; 43 } 44 } 45 Exit: 46 return total; 47 } 48 49 int writev( int fd, const struct iovec* vecs, int count ) 50 { 51 int total = 0; 52 53 for ( ; count > 0; count--, vecs++ ) { 54 const char* buf = (const char*)vecs->iov_base; 55 int len = (int)vecs->iov_len; 56 57 while (len > 0) { 58 int ret = write( fd, buf, len ); 59 if (ret < 0) { 60 if (total == 0) 61 total = -1; 62 goto Exit; 63 } 64 if (ret == 0) 65 goto Exit; 66 67 total += ret; 68 buf += ret; 69 len -= ret; 70 } 71 } 72 Exit: 73 return total; 74 } 75 76 #endif /* !HAVE_SYS_UIO_H */ 77