sl@0: /*- sl@0: * © Portions copyright (c) 2006 Nokia Corporation. All rights reserved. sl@0: * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan sl@0: * (Royal Institute of Technology, Stockholm, Sweden). sl@0: * All rights reserved. sl@0: * sl@0: * Redistribution and use in source and binary forms, with or without sl@0: * modification, are permitted provided that the following conditions sl@0: * are met: sl@0: * sl@0: * 1. Redistributions of source code must retain the above copyright sl@0: * notice, this list of conditions and the following disclaimer. sl@0: * sl@0: * 2. Redistributions in binary form must reproduce the above copyright sl@0: * notice, this list of conditions and the following disclaimer in the sl@0: * documentation and/or other materials provided with the distribution. sl@0: * sl@0: * 3. Neither the name of the Institute nor the names of its contributors sl@0: * may be used to endorse or promote products derived from this software sl@0: * without specific prior written permission. sl@0: * sl@0: * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND sl@0: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE sl@0: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE sl@0: * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE sl@0: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL sl@0: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS sl@0: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) sl@0: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT sl@0: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY sl@0: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF sl@0: * SUCH DAMAGE. sl@0: */ sl@0: sl@0: #ifndef __SYMBIAN32__ sl@0: #ifdef HAVE_CONFIG_H sl@0: #include sl@0: RCSID("$Id: readv.c,v 1.1.2.1.2.4 2006/11/23 11:59:59 sivanand Exp $"); sl@0: #endif sl@0: sl@0: #include "roken.h" sl@0: sl@0: #endif sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #define min(X , Y) ((X) < (Y) ? (X) :(Y) ) sl@0: sl@0: sl@0: EXPORT_C ssize_t sl@0: readv(int d, const struct iovec *iov, int iovcnt) sl@0: { sl@0: ssize_t ret, nb; sl@0: size_t tot = 0; sl@0: int VecIter = 0 ; sl@0: char *buf, *p; sl@0: sl@0: if(iovcnt > IOV_MAX) sl@0: { sl@0: errno = EINVAL ; sl@0: return -1 ; sl@0: } sl@0: if(iovcnt < 0 ) sl@0: { sl@0: errno = EINVAL ; sl@0: return -1 ; sl@0: } sl@0: sl@0: for(VecIter = 0; VecIter < iovcnt ; ++VecIter) sl@0: { sl@0: if(iov[VecIter].iov_base == NULL) sl@0: { sl@0: if(VecIter != 0) sl@0: { sl@0: break ; //Break from the for loop sl@0: } sl@0: errno = EFAULT ; sl@0: return -1 ; sl@0: } sl@0: if((int)iov[VecIter].iov_len >= 0 ) sl@0: { sl@0: tot += iov[VecIter].iov_len; sl@0: } sl@0: sl@0: else sl@0: { sl@0: errno = EINVAL ; sl@0: return -1 ; sl@0: } sl@0: sl@0: } sl@0: sl@0: buf = malloc(tot); sl@0: sl@0: if (tot != 0 && buf == NULL) { sl@0: errno = ENOMEM; sl@0: return -1; sl@0: } sl@0: sl@0: nb = ret = read (d, buf, tot); sl@0: p = buf; sl@0: sl@0: while (nb > 0) { sl@0: ssize_t cnt = min(nb, iov->iov_len); sl@0: memcpy (iov->iov_base, p, cnt); sl@0: p += cnt; sl@0: nb -= cnt; sl@0: iov += 1 ; //Newly added sl@0: } sl@0: free(buf); sl@0: return ret; sl@0: } sl@0: