summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdio/fvwrite.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/stdio/fvwrite.c')
-rw-r--r--lib/libc/stdio/fvwrite.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/lib/libc/stdio/fvwrite.c b/lib/libc/stdio/fvwrite.c
index 82a49cb..efcfffb 100644
--- a/lib/libc/stdio/fvwrite.c
+++ b/lib/libc/stdio/fvwrite.c
@@ -64,7 +64,7 @@ __sfvwrite(fp, uio)
register struct __siov *iov;
register int w, s;
char *nl;
- int nlknown, nldist;
+ int nlknown, nldist, firsttime;
if ((len = uio->uio_resid) == 0)
return (0);
@@ -86,12 +86,21 @@ __sfvwrite(fp, uio)
len = iov->iov_len; \
iov++; \
}
+ firsttime = 1;
if (fp->_flags & __SNBF) {
/*
* Unbuffered: write up to BUFSIZ bytes at a time.
*/
do {
GETIOV(;);
+ if (firsttime) {
+ if ((fp->_flags & __SAPP) &&
+ _sseek(fp, (fpos_t)0, SEEK_END) == -1)
+ goto err;
+ /* In case FAPPEND mode is set. */
+ fp->_flags &= ~__SOFF;
+ firsttime = 0;
+ }
w = (*fp->_write)(fp->_cookie, p, MIN(len, BUFSIZ));
if (w <= 0)
goto err;
@@ -147,6 +156,14 @@ __sfvwrite(fp, uio)
goto err;
} else if (len >= (w = fp->_bf._size)) {
/* write directly */
+ if (firsttime) {
+ if ((fp->_flags & __SAPP) &&
+ _sseek(fp, (fpos_t)0, SEEK_END) == -1)
+ goto err;
+ /* In case FAPPEND mode is set. */
+ fp->_flags &= ~__SOFF;
+ firsttime = 0;
+ }
w = (*fp->_write)(fp->_cookie, p, w);
if (w <= 0)
goto err;
@@ -186,6 +203,14 @@ __sfvwrite(fp, uio)
if (__fflush(fp))
goto err;
} else if (s >= (w = fp->_bf._size)) {
+ if (firsttime) {
+ if ((fp->_flags & __SAPP) &&
+ _sseek(fp, (fpos_t)0, SEEK_END) == -1)
+ goto err;
+ /* In case FAPPEND mode is set. */
+ fp->_flags &= ~__SOFF;
+ firsttime = 0;
+ }
w = (*fp->_write)(fp->_cookie, p, w);
if (w <= 0)
goto err;
OpenPOWER on IntegriCloud