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