]>
git.proxmox.com Git - mirror_edk2.git/blob - StdLib/LibC/Uefi/writev.c
2 * Copyright (c) 1999, 2000
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
9 * 1. Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software must
17 * display the following acknowledgement:
19 * This product includes software developed by Intel Corporation and its
22 * 4. Neither the name of Intel Corporation or its contributors may be used to
23 * endorse or promote products derived from this software without specific
24 * prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29 * DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR CONTRIBUTORS BE LIABLE FOR
30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
33 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47 Functions implementing the standard "writev" system call interface
53 #include <LibConfig.h>
56 #include <efi_interface.h>
62 #include "./filedesc.h"
64 #include <libc_debug.h>
85 // BSD writev interface for libc
88 // File Descriptor (index into file descriptor table)
90 // size of iovec array
93 // number of bytes written
99 const struct iovec
*iov
,
103 const struct iovec
*pVecTmp
;
104 char *pBuf
, *pBufTmp
;
105 size_t TotalBytes
, i
, ret
;
108 // See how much memory we'll need
111 for (i
= 0, TotalBytes
= 0, pVecTmp
= iov
; i
< (size_t)iovcnt
; i
++, pVecTmp
++) {
112 TotalBytes
+= pVecTmp
->iov_len
;
116 // Allocate a contiguous buffer
119 pBuf
= (char*)malloc (TotalBytes
);
126 // Copy vectors to the buffer
129 for (pBufTmp
= pBuf
; iovcnt
; iovcnt
--) {
130 bcopy(iov
->iov_base
, pBuf
, iov
->iov_len
);
131 pBuf
+= iov
->iov_len
;
136 // Use standard write(2) then free buffer
139 ret
= write (fd
, pBuf
, TotalBytes
);