diff options
Diffstat (limited to 'toys/other')
-rw-r--r-- | toys/other/count.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/toys/other/count.c b/toys/other/count.c index f3b6f821..3d388e78 100644 --- a/toys/other/count.c +++ b/toys/other/count.c @@ -17,16 +17,22 @@ config COUNT void count_main(void) { - uint64_t size = 0; + struct pollfd pfd = {0, POLLIN, 0}; + unsigned long long size = 0, last = 0, then = 0, now; + char *buf = xmalloc(65536); int len; - char buf[32]; + // poll, print if data not ready, update 4x/second otherwise for (;;) { - len = xread(0, toybuf, sizeof(toybuf)); + if (!(len = poll(&pfd, 1, (last != size) ? 250 : 0))) continue; + if (len<0 && errno != EINTR && errno != ENOMEM) perror_exit(0); + if ((len = xread(0, buf, 65536))) { + xwrite(1, buf, len); + size += len; + if ((now = millitime())-then<250) continue; + } + dprintf(2, "%llu bytes\r", size); if (!len) break; - size += len; - xwrite(1, toybuf, len); - xwrite(2, buf, sprintf(buf, "%"PRIu64" bytes\r", size)); } - xwrite(2, "\n", 1); + dprintf(2, "\n"); } |