| /** @file | |
| * | |
| * Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved.<BR> | |
| * | |
| * 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 <LibConfig.h> | |
| #ifdef foo | |
| #include <efi_interface.h> | |
| #include <unistd.h> | |
| #include <fcntl.h> | |
| #define KERNEL | |
| #include <errno.h> | |
| #undef KERNEL | |
| #include "./filedesc.h" | |
| #include <libc_debug.h> | |
| #include <assert.h> | |
| #endif | |
| #include <stdlib.h> | |
| #include <unistd.h> | |
| #include <sys/uio.h> | |
| #include <string.h> | |
| #ifndef KERNEL | |
| #define KERNEL | |
| #include <errno.h> | |
| #undef KERNEL | |
| #else | |
| #include <errno.h> | |
| #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); | |
| } |