os/ossrv/genericopenlibs/openenvcore/libc/src/readv.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*-
sl@0
     2
 * © Portions copyright (c) 2006 Nokia Corporation.  All rights reserved.
sl@0
     3
 * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan
sl@0
     4
 * (Royal Institute of Technology, Stockholm, Sweden).
sl@0
     5
 * All rights reserved.
sl@0
     6
 *
sl@0
     7
 * Redistribution and use in source and binary forms, with or without
sl@0
     8
 * modification, are permitted provided that the following conditions
sl@0
     9
 * are met:
sl@0
    10
 *
sl@0
    11
 * 1. Redistributions of source code must retain the above copyright
sl@0
    12
 *    notice, this list of conditions and the following disclaimer.
sl@0
    13
 *
sl@0
    14
 * 2. Redistributions in binary form must reproduce the above copyright
sl@0
    15
 *    notice, this list of conditions and the following disclaimer in the
sl@0
    16
 *    documentation and/or other materials provided with the distribution.
sl@0
    17
 *
sl@0
    18
 * 3. Neither the name of the Institute nor the names of its contributors
sl@0
    19
 *    may be used to endorse or promote products derived from this software
sl@0
    20
 *    without specific prior written permission.
sl@0
    21
 *
sl@0
    22
 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
sl@0
    23
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
sl@0
    24
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
sl@0
    25
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
sl@0
    26
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
sl@0
    27
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
sl@0
    28
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
sl@0
    29
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
sl@0
    30
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
sl@0
    31
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
sl@0
    32
 * SUCH DAMAGE.
sl@0
    33
 */
sl@0
    34
sl@0
    35
#ifndef __SYMBIAN32__
sl@0
    36
#ifdef HAVE_CONFIG_H
sl@0
    37
#include <config.h>
sl@0
    38
RCSID("$Id: readv.c,v 1.1.2.1.2.4 2006/11/23 11:59:59 sivanand Exp $");
sl@0
    39
#endif
sl@0
    40
sl@0
    41
#include "roken.h"
sl@0
    42
sl@0
    43
#endif
sl@0
    44
sl@0
    45
#include <sys/types.h>
sl@0
    46
#include <sys/uio.h>
sl@0
    47
#include <unistd.h>
sl@0
    48
#include <stdlib.h>
sl@0
    49
#include <errno.h>
sl@0
    50
#include <string.h>
sl@0
    51
#include <sys/syslimits.h>
sl@0
    52
sl@0
    53
#define min(X , Y)   ((X) < (Y) ? (X) :(Y) )
sl@0
    54
sl@0
    55
sl@0
    56
EXPORT_C ssize_t
sl@0
    57
readv(int d, const struct iovec *iov, int iovcnt)
sl@0
    58
{
sl@0
    59
    ssize_t ret, nb;
sl@0
    60
    size_t tot = 0;
sl@0
    61
    int VecIter = 0 ;
sl@0
    62
    char *buf, *p;
sl@0
    63
    
sl@0
    64
    if(iovcnt > IOV_MAX) 
sl@0
    65
    	{
sl@0
    66
    	errno = EINVAL ;
sl@0
    67
    	return -1 ;
sl@0
    68
    	}
sl@0
    69
    	if(iovcnt < 0 ) 
sl@0
    70
    		{
sl@0
    71
    		errno = EINVAL ;
sl@0
    72
    		return -1 ;
sl@0
    73
    		}
sl@0
    74
sl@0
    75
    for(VecIter = 0; VecIter  < iovcnt ; ++VecIter)
sl@0
    76
    	{
sl@0
    77
    	 if(iov[VecIter].iov_base == NULL) 
sl@0
    78
    	 { 
sl@0
    79
    	    if(VecIter != 0) 
sl@0
    80
    	    {
sl@0
    81
    	     break ;	 //Break from the for loop 
sl@0
    82
    	    }
sl@0
    83
    	 	errno = EFAULT ;
sl@0
    84
    	 	return -1 ;
sl@0
    85
    	 }
sl@0
    86
    	 if((int)iov[VecIter].iov_len >= 0 ) 
sl@0
    87
    	 {
sl@0
    88
    	 tot += iov[VecIter].iov_len;
sl@0
    89
    	 }
sl@0
    90
    	 
sl@0
    91
    	 else 
sl@0
    92
    	 {
sl@0
    93
    	  errno = EINVAL ;
sl@0
    94
    	  return -1 ;	
sl@0
    95
    	 }
sl@0
    96
    	 
sl@0
    97
    	}
sl@0
    98
  
sl@0
    99
    buf = malloc(tot);    	
sl@0
   100
    
sl@0
   101
    if (tot != 0 && buf == NULL) {
sl@0
   102
        errno = ENOMEM;
sl@0
   103
        return -1;
sl@0
   104
    }
sl@0
   105
    
sl@0
   106
    nb = ret = read (d, buf, tot);
sl@0
   107
    p = buf;
sl@0
   108
    
sl@0
   109
    while (nb > 0) {
sl@0
   110
        ssize_t cnt = min(nb, iov->iov_len);
sl@0
   111
        memcpy (iov->iov_base, p, cnt);
sl@0
   112
        p += cnt;
sl@0
   113
        nb -= cnt;
sl@0
   114
        iov += 1 ;      //Newly added
sl@0
   115
    }
sl@0
   116
    free(buf);
sl@0
   117
    return ret;
sl@0
   118
}
sl@0
   119