mirror of https://github.com/acidanthera/audk.git
144 lines
3.5 KiB
C
144 lines
3.5 KiB
C
|
/*
|
||
|
* Copyright (c) 1999, 2000
|
||
|
* 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 <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, *pBufTmp;
|
||
|
size_t TotalBytes, i, 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 (pBufTmp = pBuf; 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);
|
||
|
}
|