summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorchristos <christos@NetBSD.org>2021-07-06 14:22:16 +0000
committerchristos <christos@NetBSD.org>2021-07-06 14:22:16 +0000
commit9912dab1438dafcca57c27222e477a7faa2840c9 (patch)
tree4667885d21157386ab1fd1f93d63175f9c203df8 /lib
parent3267ac4f14e1260f8f2aa5894cf059430bf4409a (diff)
Handle EINTR, from RVP.
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/stdio/fflush.c10
-rw-r--r--lib/libc/stdio/fvwrite.c24
2 files changed, 20 insertions, 14 deletions
diff --git a/lib/libc/stdio/fflush.c b/lib/libc/stdio/fflush.c
index 874d19bbc31..e2dfc8e5a4b 100644
--- a/lib/libc/stdio/fflush.c
+++ b/lib/libc/stdio/fflush.c
@@ -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. */
diff --git a/lib/libc/stdio/fvwrite.c b/lib/libc/stdio/fvwrite.c
index a2619ac3d0c..b4be15c1f59 100644
--- a/lib/libc/stdio/fvwrite.c
+++ b/lib/libc/stdio/fvwrite.c
@@ -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);