1*4a5d661aSToomas Soome /* 2*4a5d661aSToomas Soome * $NetBSD: pread.c,v 1.2 1997/03/22 01:48:38 thorpej Exp $ 3*4a5d661aSToomas Soome */ 4*4a5d661aSToomas Soome 5*4a5d661aSToomas Soome /*- 6*4a5d661aSToomas Soome * Copyright (c) 1996 7*4a5d661aSToomas Soome * Matthias Drochner. All rights reserved. 8*4a5d661aSToomas Soome * 9*4a5d661aSToomas Soome * Redistribution and use in source and binary forms, with or without 10*4a5d661aSToomas Soome * modification, are permitted provided that the following conditions 11*4a5d661aSToomas Soome * are met: 12*4a5d661aSToomas Soome * 1. Redistributions of source code must retain the above copyright 13*4a5d661aSToomas Soome * notice, this list of conditions and the following disclaimer. 14*4a5d661aSToomas Soome * 2. Redistributions in binary form must reproduce the above copyright 15*4a5d661aSToomas Soome * notice, this list of conditions and the following disclaimer in the 16*4a5d661aSToomas Soome * documentation and/or other materials provided with the distribution. 17*4a5d661aSToomas Soome * 3. All advertising materials mentioning features or use of this software 18*4a5d661aSToomas Soome * must display the following acknowledgement: 19*4a5d661aSToomas Soome * This product includes software developed for the NetBSD Project 20*4a5d661aSToomas Soome * by Matthias Drochner. 21*4a5d661aSToomas Soome * 4. The name of the author may not be used to endorse or promote products 22*4a5d661aSToomas Soome * derived from this software without specific prior written permission. 23*4a5d661aSToomas Soome * 24*4a5d661aSToomas Soome * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 25*4a5d661aSToomas Soome * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 26*4a5d661aSToomas Soome * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27*4a5d661aSToomas Soome * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 28*4a5d661aSToomas Soome * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 29*4a5d661aSToomas Soome * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 30*4a5d661aSToomas Soome * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 31*4a5d661aSToomas Soome * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32*4a5d661aSToomas Soome * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 33*4a5d661aSToomas Soome * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34*4a5d661aSToomas Soome */ 35*4a5d661aSToomas Soome 36*4a5d661aSToomas Soome #include <sys/cdefs.h> 37*4a5d661aSToomas Soome __FBSDID("$FreeBSD$"); 38*4a5d661aSToomas Soome 39*4a5d661aSToomas Soome /* read into destination in flat addr space */ 40*4a5d661aSToomas Soome 41*4a5d661aSToomas Soome #include <stand.h> 42*4a5d661aSToomas Soome 43*4a5d661aSToomas Soome #include "libi386.h" 44*4a5d661aSToomas Soome 45*4a5d661aSToomas Soome #ifdef SAVE_MEMORY 46*4a5d661aSToomas Soome #define BUFSIZE (1*1024) 47*4a5d661aSToomas Soome #else 48*4a5d661aSToomas Soome #define BUFSIZE (4*1024) 49*4a5d661aSToomas Soome #endif 50*4a5d661aSToomas Soome 51*4a5d661aSToomas Soome static char buf[BUFSIZE]; 52*4a5d661aSToomas Soome 53*4a5d661aSToomas Soome int 54*4a5d661aSToomas Soome pread(fd, dest, size) 55*4a5d661aSToomas Soome int fd; 56*4a5d661aSToomas Soome vm_offset_t dest; 57*4a5d661aSToomas Soome int size; 58*4a5d661aSToomas Soome { 59*4a5d661aSToomas Soome int rsize; 60*4a5d661aSToomas Soome 61*4a5d661aSToomas Soome rsize = size; 62*4a5d661aSToomas Soome while (rsize > 0) { 63*4a5d661aSToomas Soome int count, got; 64*4a5d661aSToomas Soome 65*4a5d661aSToomas Soome count = (rsize < BUFSIZE ? rsize : BUFSIZE); 66*4a5d661aSToomas Soome 67*4a5d661aSToomas Soome got = read(fd, buf, count); 68*4a5d661aSToomas Soome if (got < 0) 69*4a5d661aSToomas Soome return (-1); 70*4a5d661aSToomas Soome 71*4a5d661aSToomas Soome /* put to physical space */ 72*4a5d661aSToomas Soome vpbcopy(buf, dest, got); 73*4a5d661aSToomas Soome 74*4a5d661aSToomas Soome dest += got; 75*4a5d661aSToomas Soome rsize -= got; 76*4a5d661aSToomas Soome if (got < count) 77*4a5d661aSToomas Soome break; /* EOF */ 78*4a5d661aSToomas Soome } 79*4a5d661aSToomas Soome return (size - rsize); 80*4a5d661aSToomas Soome } 81