Module Name: src Committed By: christos Date: Mon Jul 5 07:26:00 UTC 2021
Modified Files: src/lib/libc/stdio: fflush.c Log Message: Account for partial writes when interrupted (from FreeBSD). To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/lib/libc/stdio/fflush.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/stdio/fflush.c diff -u src/lib/libc/stdio/fflush.c:1.18 src/lib/libc/stdio/fflush.c:1.19 --- src/lib/libc/stdio/fflush.c:1.18 Tue Mar 27 11:05:42 2012 +++ src/lib/libc/stdio/fflush.c Mon Jul 5 03:26:00 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: fflush.c,v 1.18 2012/03/27 15:05:42 christos Exp $ */ +/* $NetBSD: fflush.c,v 1.19 2021/07/05 07:26:00 christos Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -37,7 +37,7 @@ #if 0 static char sccsid[] = "@(#)fflush.c 8.1 (Berkeley) 6/4/93"; #else -__RCSID("$NetBSD: fflush.c,v 1.18 2012/03/27 15:05:42 christos Exp $"); +__RCSID("$NetBSD: fflush.c,v 1.19 2021/07/05 07:26:00 christos Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -45,6 +45,8 @@ __RCSID("$NetBSD: fflush.c,v 1.18 2012/0 #include <assert.h> #include <errno.h> #include <stdio.h> +#include <string.h> + #include "reentrant.h" #include "local.h" @@ -106,6 +108,14 @@ __sflush(FILE *fp) for (; n > 0; n -= t, p += t) { t = (*fp->_write)(fp->_cookie, (char *)p, n); if (t <= 0) { + /* Reset _p and _w. */ + if (p > fp->_p) { + /* Some was written. */ + memmove(fp->_p, p, n); + fp->_p += n; + if ((fp->_flags & (__SLBF | __SNBF)) == 0) + fp->_w -= n; + } fp->_flags |= __SERR; return EOF; }