sl@0: /*- 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: * © Portions Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. sl@0: sl@0: */ sl@0: sl@0: #ifndef __SYMBIAN32__ sl@0: #ifdef HAVE_CONFIG_H sl@0: #include sl@0: RCSID("$Id: writev.c,v 1.1.2.1.2.4 2006/11/23 12:00:53 sivanand Exp $"); sl@0: #endif sl@0: #include "roken.h" 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: #include sl@0: #include sl@0: sl@0: sl@0: ssize_t sl@0: _writev(int d, const struct iovec *iov, int iovcnt) sl@0: { sl@0: ssize_t ret; sl@0: size_t tot = 0; sl@0: int VecIter; 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: 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: buf = malloc(tot); sl@0: if (tot != 0 && buf == NULL) { sl@0: errno = ENOMEM; sl@0: return -1; sl@0: } sl@0: p = buf; sl@0: for (VecIter = 0; VecIter < iovcnt; ++VecIter) { sl@0: sl@0: if(iov[VecIter].iov_base == NULL) sl@0: { sl@0: break ; //Break from the for loop sl@0: } sl@0: memcpy (p, iov[VecIter].iov_base, iov[VecIter].iov_len); sl@0: p += iov[VecIter].iov_len; sl@0: } sl@0: ret = write (d, buf, tot); sl@0: free (buf); sl@0: return ret; sl@0: } sl@0: sl@0: #ifdef __SYMBIAN_COMPILE_UNUSED__ sl@0: ssize_t sl@0: _wwritev(int d, const struct iovec *iov, int iovcnt) sl@0: { sl@0: ssize_t ret; sl@0: size_t tot = 0; sl@0: int VecIter; sl@0: FILE *fp ; sl@0: sl@0: wchar_t *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: 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: buf = (wchar_t *)malloc(tot*sizeof(wchar_t)); sl@0: if (tot != 0 && buf == NULL) { sl@0: errno = ENOMEM; sl@0: return -1; sl@0: } sl@0: p = buf; sl@0: for (VecIter = 0; VecIter < iovcnt; ++VecIter) sl@0: { sl@0: sl@0: if(iov[VecIter].iov_base == NULL) sl@0: { sl@0: break ; //Break from the for loop sl@0: } sl@0: wmemcpy (p, iov[VecIter].iov_base, iov[VecIter].iov_len); sl@0: p += iov[VecIter].iov_len; sl@0: } sl@0: fp = fdopen(d,"a+"); sl@0: ret = fwprintf(fp,buf); sl@0: //ret = write (d, buf, tot); sl@0: free (buf); sl@0: return ret; sl@0: } sl@0: sl@0: #endif //__SYMBIAN_COMPILE_UNUSED__ sl@0: sl@0: EXPORT_C sl@0: writev(int fd, const struct iovec *iov, int iovcnt) sl@0: { sl@0: return _writev(fd , iov , iovcnt) ; sl@0: } sl@0: sl@0: