19d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes/*	$OpenBSD: fvwrite.c,v 1.17 2009/11/09 00:18:27 kurt Exp $ */
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*-
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1990, 1993
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This code is derived from software contributed to Berkeley by
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Chris Torek.
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met:
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    documentation and/or other materials provided with the distribution.
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    may be used to endorse or promote products derived from this software
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    without specific prior written permission.
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE.
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdio.h>
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdlib.h>
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <string.h>
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <errno.h>
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "local.h"
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "fvwrite.h"
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Write some memory regions.  Return zero on success, EOF on error.
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This routine is large and unsightly, but most of the ugliness due
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * to the three different kinds of output buffering is handled here.
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
479d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughesint
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__sfvwrite(FILE *fp, struct __suio *uio)
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	size_t len;
519d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes	char *p;
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct __siov *iov;
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int w, s;
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char *nl;
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int nlknown, nldist;
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if ((len = uio->uio_resid) == 0)
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (0);
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* make sure we can write */
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (cantwrite(fp)) {
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		errno = EBADF;
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (EOF);
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	MIN(a, b) ((a) < (b) ? (a) : (b))
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	COPY(n)	  (void)memcpy((void *)fp->_p, (void *)p, (size_t)(n))
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	iov = uio->uio_iov;
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	p = iov->iov_base;
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	len = iov->iov_len;
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	iov++;
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define GETIOV(extra_work) \
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	while (len == 0) { \
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		extra_work; \
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		p = iov->iov_base; \
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = iov->iov_len; \
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		iov++; \
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (fp->_flags & __SNBF) {
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/*
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * Unbuffered: write up to BUFSIZ bytes at a time.
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 */
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		do {
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			GETIOV(;);
859d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes			w = (*fp->_write)(fp->_cookie, p, MIN(len, BUFSIZ));
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (w <= 0)
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				goto err;
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			p += w;
891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			len -= w;
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		} while ((uio->uio_resid -= w) != 0);
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else if ((fp->_flags & __SLBF) == 0) {
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/*
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * Fully buffered: fill partially full buffer, if any,
941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * and then flush.  If there is no partial buffer, write
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * one _bf._size byte chunk directly (without copying).
961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 *
971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * String output is a special case: write as many bytes
981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * as fit, but pretend we wrote everything.  This makes
991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * snprintf() return the number of bytes needed, rather
1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * than the number used, and avoids its write function
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * (so that the write function can be invalid).
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 */
1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		do {
1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			GETIOV(;);
1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if ((fp->_flags & (__SALC | __SSTR)) ==
1069d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes			    (__SALC | __SSTR) && fp->_w < len) {
1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				size_t blen = fp->_p - fp->_bf._base;
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				unsigned char *_base;
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				int _size;
1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/* Allocate space exponentially. */
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				_size = fp->_bf._size;
1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				do {
1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					_size = (_size << 1) + 1;
1159d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes				} while (_size < blen + len);
1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				_base = realloc(fp->_bf._base, _size + 1);
1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				if (_base == NULL)
1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					goto err;
1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				fp->_w += _size - fp->_bf._size;
1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				fp->_bf._base = _base;
1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				fp->_bf._size = _size;
1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				fp->_p = _base + blen;
1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			w = fp->_w;
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (fp->_flags & __SSTR) {
1269d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes				if (len < w)
1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					w = len;
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				COPY(w);	/* copy MIN(fp->_w,len), */
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				fp->_w -= w;
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				fp->_p += w;
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				w = len;	/* but pretend copied all */
1329d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes			} else if (fp->_p > fp->_bf._base && len > w) {
1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/* fill and flush */
1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				COPY(w);
1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/* fp->_w -= w; */ /* unneeded */
1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				fp->_p += w;
1379d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes				if (__sflush(fp))
1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					goto err;
1399d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes			} else if (len >= (w = fp->_bf._size)) {
1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/* write directly */
1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				w = (*fp->_write)(fp->_cookie, p, w);
1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				if (w <= 0)
1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					goto err;
1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			} else {
1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/* fill and done */
1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				w = len;
1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				COPY(w);
1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				fp->_w -= w;
1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				fp->_p += w;
1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			p += w;
1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			len -= w;
1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		} while ((uio->uio_resid -= w) != 0);
1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else {
1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/*
1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * Line buffered: like fully buffered, but we
1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * must check for newlines.  Compute the distance
1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * to the first newline (including the newline),
1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * or `infinity' if there is none, then pretend
1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * that the amount to write is MIN(len,nldist).
1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 */
1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		nlknown = 0;
1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		nldist = 0;	/* XXX just to keep gcc happy */
1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		do {
1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			GETIOV(nlknown = 0);
1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (!nlknown) {
1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				nl = memchr((void *)p, '\n', len);
1689d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes				nldist = nl ? nl + 1 - p : len + 1;
1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				nlknown = 1;
1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
1719d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes			s = MIN(len, nldist);
1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			w = fp->_w + fp->_bf._size;
1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (fp->_p > fp->_bf._base && s > w) {
1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				COPY(w);
1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/* fp->_w -= w; */
1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				fp->_p += w;
1779d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes				if (__sflush(fp))
1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					goto err;
1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			} else if (s >= (w = fp->_bf._size)) {
1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				w = (*fp->_write)(fp->_cookie, p, w);
1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				if (w <= 0)
1829d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes				 	goto err;
1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			} else {
1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				w = s;
1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				COPY(w);
1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				fp->_w -= w;
1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				fp->_p += w;
1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if ((nldist -= w) == 0) {
1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/* copied the newline: flush and forget */
1919d3c2dd11f5e796cd814cddc5b907494f859058eElliott Hughes				if (__sflush(fp))
1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					goto err;
1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				nlknown = 0;
1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			p += w;
1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			len -= w;
1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		} while ((uio->uio_resid -= w) != 0);
1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecterr:
2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fp->_flags |= __SERR;
2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (EOF);
2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
205