/** @file * * Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved.
* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. All advertising materials mentioning features or use of this software must * display the following acknowledgement: * * This product includes software developed by Intel Corporation and its * contributors. * * 4. Neither the name of Intel Corporation or its contributors may be used to * endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /*++ Module Name: writev.c Abstract: Functions implementing the standard "writev" system call interface Revision History --*/ #include #ifdef foo #include #include #include #define KERNEL #include #undef KERNEL #include "./filedesc.h" #include #include #endif #include #include #include #include #ifndef KERNEL #define KERNEL #include #undef KERNEL #else #include #endif // // Name: // writev // // Description: // BSD writev interface for libc // // Arguments: // File Descriptor (index into file descriptor table) // iovec pointer // size of iovec array // // Returns: // number of bytes written // ssize_t writev( int fd, const struct iovec *iov, int iovcnt ) { const struct iovec *pVecTmp; char *pBuf; size_t TotalBytes; size_t i; size_t ret; // // See how much memory we'll need // for (i = 0, TotalBytes = 0, pVecTmp = iov; i < (size_t)iovcnt; i++, pVecTmp++) { TotalBytes += pVecTmp->iov_len; } // // Allocate a contiguous buffer // pBuf = (char*)malloc (TotalBytes); if (pBuf == NULL) { errno = ENOMEM; return -1; } // // Copy vectors to the buffer // for (; iovcnt; iovcnt--) { bcopy(iov->iov_base, pBuf, iov->iov_len); pBuf += iov->iov_len; iov++; } // // Use standard write(2) then free buffer // ret = write (fd, pBuf, TotalBytes); free (pBuf); return (ret); }