xref: /third_party/toybox/toys/other/count.c (revision 0f66f451)
1/* count.c - Progress indicator from stdin to stdout
2 *
3 * Copyright 2002 Rob Landley <rob@landley.net>
4
5USE_COUNT(NEWTOY(count, NULL, TOYFLAG_USR|TOYFLAG_BIN))
6
7config COUNT
8  bool "count"
9  default y
10  help
11    usage: count
12
13    Copy stdin to stdout, displaying simple progress indicator to stderr.
14*/
15
16#include "toys.h"
17
18void count_main(void)
19{
20  struct pollfd pfd = {0, POLLIN, 0};
21  unsigned long long size = 0, last = 0, then = 0, now;
22  char *buf = xmalloc(65536);
23  int len;
24
25  // poll, print if data not ready, update 4x/second otherwise
26  for (;;) {
27    if (!(len = poll(&pfd, 1, (last != size) ? 250 : 0))) continue;
28    if (len<0 && errno != EINTR && errno != ENOMEM) perror_exit(0);
29    if ((len = xread(0, buf, 65536))) {
30      xwrite(1, buf, len);
31      size += len;
32      if ((now = millitime())-then<250) continue;
33    }
34    dprintf(2, "%llu bytes\r", size);
35    if (!len) break;
36  }
37  dprintf(2, "\n");
38}
39