pread.c revision 1.3
11.3Schristos/*	$NetBSD: pread.c,v 1.3 1999/01/28 20:22:32 christos Exp $	 */
21.1Sperry
31.1Sperry/*
41.1Sperry * Copyright (c) 1996
51.1Sperry *	Matthias Drochner.  All rights reserved.
61.1Sperry *
71.1Sperry * Redistribution and use in source and binary forms, with or without
81.1Sperry * modification, are permitted provided that the following conditions
91.1Sperry * are met:
101.1Sperry * 1. Redistributions of source code must retain the above copyright
111.1Sperry *    notice, this list of conditions and the following disclaimer.
121.1Sperry * 2. Redistributions in binary form must reproduce the above copyright
131.1Sperry *    notice, this list of conditions and the following disclaimer in the
141.1Sperry *    documentation and/or other materials provided with the distribution.
151.1Sperry * 3. All advertising materials mentioning features or use of this software
161.1Sperry *    must display the following acknowledgement:
171.1Sperry *	This product includes software developed for the NetBSD Project
181.1Sperry *	by Matthias Drochner.
191.1Sperry * 4. The name of the author may not be used to endorse or promote products
201.1Sperry *    derived from this software without specific prior written permission.
211.1Sperry *
221.1Sperry * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
231.1Sperry * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
241.1Sperry * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
251.1Sperry * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
261.1Sperry * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
271.1Sperry * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
281.1Sperry * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
291.1Sperry * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
301.1Sperry * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
311.1Sperry * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
321.1Sperry *
331.1Sperry */
341.1Sperry
351.1Sperry/* read into destination in flat addr space */
361.1Sperry
371.1Sperry#include <lib/libsa/stand.h>
381.1Sperry
391.1Sperry#include "libi386.h"
401.1Sperry
411.1Sperry#ifdef SAVE_MEMORY
421.1Sperry#define BUFSIZE (1*1024)
431.1Sperry#else
441.1Sperry#define BUFSIZE (4*1024)
451.1Sperry#endif
461.1Sperry
471.2Sthorpejstatic char     buf[BUFSIZE];
481.1Sperry
491.3Schristosssize_t
501.2Sthorpejpread(fd, dest, size)
511.3Schristos	int	fd;
521.3Schristos	void	*dest;
531.3Schristos	size_t	size;
541.1Sperry{
551.2Sthorpej	int             rsize;
561.1Sperry
571.2Sthorpej	rsize = size;
581.2Sthorpej	while (rsize > 0) {
591.2Sthorpej		int             count, got;
601.2Sthorpej
611.2Sthorpej		count = (rsize < BUFSIZE ? rsize : BUFSIZE);
621.2Sthorpej
631.2Sthorpej		got = read(fd, buf, count);
641.2Sthorpej		if (got < 0)
651.2Sthorpej			return (-1);
661.2Sthorpej
671.2Sthorpej		/* put to physical space */
681.2Sthorpej		vpbcopy(buf, dest, got);
691.2Sthorpej
701.2Sthorpej		dest += got;
711.2Sthorpej		rsize -= got;
721.2Sthorpej		if (got < count)
731.2Sthorpej			break;	/* EOF */
741.2Sthorpej	}
751.2Sthorpej	return (size - rsize);
761.1Sperry}
77