Home | History | Annotate | Download | only in Uefi
      1 /** @file
      2  *
      3  * Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved.<BR>
      4  *
      5  * Redistribution and use in source and binary forms, with or without modification,
      6  * are permitted provided that the following conditions are met:
      7  *
      8  * 1. Redistributions of source code must retain the above copyright notice,
      9  *    this list of conditions and the following disclaimer.
     10  *
     11  * 2. Redistributions in binary form must reproduce the above copyright notice,
     12  *    this list of conditions and the following disclaimer in the documentation
     13  *    and/or other materials provided with the distribution.
     14  *
     15  * 3. All advertising materials mentioning features or use of this software must
     16  *    display the following acknowledgement:
     17  *
     18  *    This product includes software developed by Intel Corporation and its
     19  *    contributors.
     20  *
     21  * 4. Neither the name of Intel Corporation or its contributors may be used to
     22  *    endorse or promote products derived from this software without specific
     23  *    prior written permission.
     24  *
     25  * THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS IS'' AND
     26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     27  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     28  * DISCLAIMED.  IN NO EVENT SHALL INTEL CORPORATION OR CONTRIBUTORS BE LIABLE FOR
     29  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     30  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     31  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     32  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     33  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     34  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     35  *
     36  */
     37 
     38 /*++
     39 
     40 Module Name:
     41 
     42     writev.c
     43 
     44 Abstract:
     45 
     46     Functions implementing the standard "writev" system call interface
     47 
     48 
     49 Revision History
     50 
     51 --*/
     52 #include  <LibConfig.h>
     53 
     54 #ifdef foo
     55 #include <efi_interface.h>
     56 #include <unistd.h>
     57 #include <fcntl.h>
     58 #define KERNEL
     59 #include <errno.h>
     60 #undef KERNEL
     61 #include "./filedesc.h"
     62 
     63 #include <libc_debug.h>
     64 #include <assert.h>
     65 #endif
     66 
     67 #include <stdlib.h>
     68 #include <unistd.h>
     69 #include <sys/uio.h>
     70 #include <string.h>
     71 #ifndef KERNEL
     72 #define KERNEL
     73 #include <errno.h>
     74 #undef KERNEL
     75 #else
     76 #include <errno.h>
     77 #endif
     78 
     79 //
     80 //  Name:
     81 //      writev
     82 //
     83 //  Description:
     84 //      BSD writev interface for libc
     85 //
     86 //  Arguments:
     87 //      File Descriptor (index into file descriptor table)
     88 //      iovec pointer
     89 //      size of iovec array
     90 //
     91 //  Returns:
     92 //      number of bytes written
     93 //
     94 
     95 ssize_t
     96 writev(
     97     int fd,
     98     const struct iovec *iov,
     99     int iovcnt
    100     )
    101 {
    102   const struct iovec   *pVecTmp;
    103   char                 *pBuf;
    104   size_t                TotalBytes;
    105   size_t                i;
    106   size_t                ret;
    107 
    108   //
    109   //  See how much memory we'll need
    110   //
    111 
    112   for (i = 0, TotalBytes = 0, pVecTmp = iov; i < (size_t)iovcnt; i++, pVecTmp++) {
    113     TotalBytes += pVecTmp->iov_len;
    114   }
    115 
    116   //
    117   //  Allocate a contiguous buffer
    118   //
    119 
    120   pBuf = (char*)malloc (TotalBytes);
    121   if (pBuf == NULL) {
    122     errno = ENOMEM;
    123     return -1;
    124   }
    125 
    126   //
    127   //  Copy vectors to the buffer
    128   //
    129 
    130   for (; iovcnt; iovcnt--) {
    131     bcopy(iov->iov_base, pBuf, iov->iov_len);
    132     pBuf += iov->iov_len;
    133     iov++;
    134   }
    135 
    136   //
    137   //  Use standard write(2) then free buffer
    138   //
    139 
    140   ret = write (fd, pBuf, TotalBytes);
    141   free (pBuf);
    142 
    143   return (ret);
    144 }
    145