Home | History | Annotate | Line # | Download | only in lib
      1 /*	$NetBSD: pread.c,v 1.8 2019/09/13 02:19:46 manu Exp $	 */
      2 
      3 /*
      4  * Copyright (c) 1996
      5  *	Matthias Drochner.  All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  *
     27  */
     28 
     29 /* read into destination in flat addr space */
     30 
     31 #include <lib/libsa/stand.h>
     32 
     33 #include "libi386.h"
     34 
     35 #ifdef SAVE_MEMORY
     36 #define BUFSIZE (1*1024)
     37 #else
     38 #define BUFSIZE (4*1024)
     39 #endif
     40 
     41 static char     *buf;
     42 
     43 ssize_t
     44 pread(int fd, void *dest, size_t size)
     45 {
     46 	size_t             rsize;
     47 
     48 	if (!buf)
     49 		buf = alloc(BUFSIZE);
     50 
     51 	rsize = size;
     52 	while (rsize > 0) {
     53 		size_t count;
     54 		ssize_t got;
     55 
     56 		count = (rsize < BUFSIZE ? rsize : BUFSIZE);
     57 
     58 		got = read(fd, buf, count);
     59 		if (got < 0)
     60 			return -1;
     61 
     62 		/* put to physical space */
     63 		vpbcopy(buf, dest, got);
     64 
     65 		dest += got;
     66 		rsize -= got;
     67 		if (got < count)
     68 			break;	/* EOF */
     69 	}
     70 	return size - rsize;
     71 }
     72