From 373af0c316f45622b1bc13eb610c6837b5cfc2bf Mon Sep 17 00:00:00 2001 From: gson Date: Sat, 17 Jan 2015 10:57:51 +0000 Subject: Retry read() on EINTR. Fixes premature exit of /dev/null --- progress.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/progress.c b/progress.c index e649989..1688687 100644 --- a/progress.c +++ b/progress.c @@ -1,4 +1,4 @@ -/* $NetBSD: progress.c,v 1.20 2012/06/27 22:07:36 riastradh Exp $ */ +/* $NetBSD: progress.c,v 1.21 2015/01/17 10:57:51 gson Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include #ifndef lint -__RCSID("$NetBSD: progress.c,v 1.20 2012/06/27 22:07:36 riastradh Exp $"); +__RCSID("$NetBSD: progress.c,v 1.21 2015/01/17 10:57:51 gson Exp $"); #endif /* not lint */ #include @@ -228,7 +228,12 @@ main(int argc, char *argv[]) signal(SIGPIPE, broken_pipe); progressmeter(-1); - while ((nr = read(fd, fb_buf, buffersize)) > 0) + while (1) { + do { + nr = read(fd, fb_buf, buffersize); + } while (nr < 0 && errno == EINTR); + if (nr <= 0) + break; for (off = 0; nr; nr -= nw, off += nw, bytes += nw) if ((nw = write(outpipe[1], fb_buf + off, (size_t) nr)) < 0) { @@ -236,6 +241,7 @@ main(int argc, char *argv[]) err(1, "writing %u bytes to output pipe", (unsigned) nr); } + } close(outpipe[1]); gzipstat = 0; -- cgit v1.2.3-56-ge451