Module Name: src
Committed By: christos
Date: Tue Jul 6 14:22:16 UTC 2021
Modified Files:
src/lib/libc/stdio: fflush.c fvwrite.c
Log Message:
Handle EINTR, from RVP.
To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.20 src/lib/libc/stdio/fflush.c
cvs rdiff -u -r1.25 -r1.26 src/lib/libc/stdio/fvwrite.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.19 src/lib/libc/stdio/fflush.c:1.20
--- src/lib/libc/stdio/fflush.c:1.19 Mon Jul 5 03:26:00 2021
+++ src/lib/libc/stdio/fflush.c Tue Jul 6 10:22:16 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: fflush.c,v 1.19 2021/07/05 07:26:00 christos Exp $ */
+/* $NetBSD: fflush.c,v 1.20 2021/07/06 14:22:16 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.19 2021/07/05 07:26:00 christos Exp $");
+__RCSID("$NetBSD: fflush.c,v 1.20 2021/07/06 14:22:16 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@@ -107,7 +107,11 @@ __sflush(FILE *fp)
for (; n > 0; n -= t, p += t) {
t = (*fp->_write)(fp->_cookie, (char *)p, n);
- if (t <= 0) {
+ if (t < 0) {
+ if (errno == EINTR) {
+ t = 0;
+ continue;
+ }
/* Reset _p and _w. */
if (p > fp->_p) {
/* Some was written. */
Index: src/lib/libc/stdio/fvwrite.c
diff -u src/lib/libc/stdio/fvwrite.c:1.25 src/lib/libc/stdio/fvwrite.c:1.26
--- src/lib/libc/stdio/fvwrite.c:1.25 Tue Mar 27 11:05:42 2012
+++ src/lib/libc/stdio/fvwrite.c Tue Jul 6 10:22:16 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: fvwrite.c,v 1.25 2012/03/27 15:05:42 christos Exp $ */
+/* $NetBSD: fvwrite.c,v 1.26 2021/07/06 14:22:16 christos Exp $ */
/*-
* Copyright (c) 1990, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)fvwrite.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: fvwrite.c,v 1.25 2012/03/27 15:05:42 christos Exp $");
+__RCSID("$NetBSD: fvwrite.c,v 1.26 2021/07/06 14:22:16 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@@ -97,15 +97,21 @@ __sfvwrite(FILE *fp, struct __suio *uio)
len = iov->iov_len; \
iov++; \
}
+#define WRITE(nw) \
+ w = (*fp->_write)(fp->_cookie, p, nw); \
+ if (w < 0) { \
+ if (errno != EINTR) \
+ goto err; \
+ w = 0; \
+ } else \
+ w = w
if (fp->_flags & __SNBF) {
/*
* Unbuffered: write up to BUFSIZ bytes at a time.
*/
do {
GETIOV(;);
- w = (*fp->_write)(fp->_cookie, p, MIN(len, BUFSIZ));
- if (w <= 0)
- goto err;
+ WRITE(MIN(len, BUFSIZ));
p += w;
len -= w;
} while ((uio->uio_resid -= w) != 0);
@@ -160,9 +166,7 @@ __sfvwrite(FILE *fp, struct __suio *uio)
goto err;
} else if (len >= (size_t)(w = fp->_bf._size)) {
/* write directly */
- w = (*fp->_write)(fp->_cookie, p, (size_t)w);
- if (w <= 0)
- goto err;
+ WRITE((size_t)w);
} else {
/* fill and done */
w = len;
@@ -199,9 +203,7 @@ __sfvwrite(FILE *fp, struct __suio *uio)
if (fflush(fp))
goto err;
} else if (s >= (w = fp->_bf._size)) {
- w = (*fp->_write)(fp->_cookie, p, (size_t)w);
- if (w <= 0)
- goto err;
+ WRITE((size_t)w);
} else {
w = s;
COPY(w);