4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials are licensed and made available
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync under the terms and conditions of the BSD License that accompanies this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (c) 1990, 1993
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The Regents of the University of California. All rights reserved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This code is derived from software contributed to Berkeley by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Chris Torek.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Redistribution and use in source and binary forms, with or without
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * modification, are permitted provided that the following conditions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * are met:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 1. Redistributions of source code must retain the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * notice, this list of conditions and the following disclaimer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 2. Redistributions in binary form must reproduce the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * notice, this list of conditions and the following disclaimer in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * documentation and/or other materials provided with the distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 3. Neither the name of the University nor the names of its contributors
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * may be used to endorse or promote products derived from this software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * without specific prior written permission.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * SUCH DAMAGE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetBSD: fvwrite.c,v 1.16.2.1 2007/05/07 19:49:09 pavel Exp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fvwrite.c 8.1 (Berkeley) 6/4/93
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <LibConfig.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <sys/EfiCdefs.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <assert.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <errno.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <stdio.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <stdlib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <string.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "reentrant.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "local.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "fvwrite.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Write some memory regions. Return zero on success, EOF on error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This routine is large and unsightly, but most of the ugliness due
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * to the three different kinds of output buffering is handled here.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync__sfvwrite(FILE *fp, struct __suio *uio)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *p;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct __siov *iov;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int w, s;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *nl;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int nlknown, nldist;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _DIAGASSERT(fp != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _DIAGASSERT(uio != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if(fp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync errno = EINVAL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EOF);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((len = uio->uio_resid) == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* make sure we can write */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (cantwrite(fp)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync errno = EBADF;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EOF);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//#define MIN(a, b) ((a) < (b) ? (a) : (b))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define COPY(n) (void)memcpy((void *)fp->_p, (void *)p, (size_t)(n))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync iov = uio->uio_iov;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync p = iov->iov_base;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync len = iov->iov_len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync iov++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define GETIOV(extra_work) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (len == 0) { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync extra_work; \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync p = iov->iov_base; \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync len = iov->iov_len; \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync iov++; \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (fp->_flags & __SNBF) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Unbuffered: write up to BUFSIZ bytes at a time.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GETIOV(;);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync w = (*fp->_write)(fp->_cookie, p,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (int)MIN(len, BUFSIZ));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (w <= 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto err;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync p += w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync len -= w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while ((uio->uio_resid -= w) != 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((fp->_flags & __SLBF) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Fully buffered: fill partially full buffer, if any,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * and then flush. If there is no partial buffer, write
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * one _bf._size byte chunk directly (without copying).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * String output is a special case: write as many bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * as fit, but pretend we wrote everything. This makes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * snprintf() return the number of bytes needed, rather
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * than the number used, and avoids its write function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (so that the write function can be invalid).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GETIOV(;);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((fp->_flags & (__SALC | __SSTR)) ==
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (__SALC | __SSTR) && fp->_w < (int)len) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t blen = fp->_p - fp->_bf._base;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unsigned char *_base;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int _size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Allocate space exponentially. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _size = fp->_bf._size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _size = (_size << 1) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (_size < (int)(blen + len));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _base = realloc(fp->_bf._base,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (size_t)(_size + 1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (_base == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto err;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fp->_w += _size - fp->_bf._size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fp->_bf._base = _base;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fp->_bf._size = _size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fp->_p = _base + blen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync w = fp->_w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (fp->_flags & __SSTR) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (len < (size_t)w)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync w = (int)len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync COPY(w); /* copy MIN(fp->_w,len), */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fp->_w -= w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fp->_p += w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync w = (int)len; /* but pretend copied all */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (fp->_p > fp->_bf._base && len > (size_t)w) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* fill and flush */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync COPY(w);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* fp->_w -= w; */ /* unneeded */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fp->_p += w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (fflush(fp))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto err;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (len >= (size_t)(w = fp->_bf._size)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* write directly */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync w = (*fp->_write)(fp->_cookie, p, w);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (w <= 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto err;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* fill and done */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync w = (int)len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync COPY(w);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fp->_w -= w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fp->_p += w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync p += w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync len -= w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while ((uio->uio_resid -= w) != 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Line buffered: like fully buffered, but we
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * must check for newlines. Compute the distance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * to the first newline (including the newline),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * or `infinity' if there is none, then pretend
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * that the amount to write is MIN(len,nldist).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nlknown = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nldist = 0; /* XXX just to keep gcc happy */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GETIOV(nlknown = 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!nlknown) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nl = memchr((void *)p, '\n', len); // Divide the string at the first '\n'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nldist = (int)(nl ? nl + 1 - p : len + 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nlknown = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s = (int)(MIN((int)len, nldist));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync w = fp->_w + fp->_bf._size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (fp->_p > fp->_bf._base && s > w) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync COPY(w);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* fp->_w -= w; */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fp->_p += w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (fflush(fp))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto err;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (s >= (w = fp->_bf._size)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync w = (*fp->_write)(fp->_cookie, p, w);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (w <= 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto err;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync w = s;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync COPY(w);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fp->_w -= w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fp->_p += w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((nldist -= w) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* copied the newline: flush and forget */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (fflush(fp))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto err;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nlknown = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync p += w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync len -= w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while ((uio->uio_resid -= w) != 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncerr:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fp->_flags |= __SERR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EOF);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}