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