diff options
author | gson <gson@NetBSD.org> | 2015-01-17 10:57:51 +0000 |
---|---|---|
committer | gson <gson@NetBSD.org> | 2015-01-17 10:57:51 +0000 |
commit | 373af0c316f45622b1bc13eb610c6837b5cfc2bf (patch) | |
tree | 5c30a2ddc09998c0d733d218db1e9d16b4450660 | |
parent | ec3e17ad37d40fa34763201757f4dd6d3b940028 (diff) | |
download | bsd-progress-373af0c316f45622b1bc13eb610c6837b5cfc2bf.tar.gz bsd-progress-373af0c316f45622b1bc13eb610c6837b5cfc2bf.tar.zst bsd-progress-373af0c316f45622b1bc13eb610c6837b5cfc2bf.zip |
Retry read() on EINTR. Fixes premature exit of
</dev/random progress -e cat >/dev/null
-rw-r--r-- | progress.c | 12 |
1 files changed, 9 insertions, 3 deletions
@@ -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 <sys/cdefs.h> #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 <sys/types.h> @@ -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; |