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);

Reply via email to