master xplshn/aruu / cmd / pseudo / watch.c
 1/* See LICENSE file for copyright and license details. */
 2
 3#include <errno.h>
 4#include <stdio.h>
 5#include <stdlib.h>
 6#include <unistd.h>
 7
 8#include "util.h"
 9#include "wexec.h"
10
11static void
12usage(void)
13{
14  eprintf("usage: %s [-t] [-n interval] command\n", argv0);
15}
16
17// ?man watch: execute periodically
18// ?man arguments: command
19// ?man run a program periodically, showing output fullscreen
20int
21main(int argc, char *argv[])
22{
23  char       cmd[BUFSIZ];
24  char      *end;
25  useconds_t interval = 2 * 1E6;
26  float      period;
27  int        i;
28
29  ARGBEGIN
30  {
31    // ?man -t: sort or specify timestamp
32    case 't':
33      break;
34    // ?man -n:str: print line numbers or counts
35    case 'n':
36      period = strtof(EARGF(usage()), &end);
37      if (*end != '\0' || errno != 0)
38        eprintf("invalid interval\n");
39      if (period < 0)
40        period = 0.1f;
41      interval = period * 1E6;
42      break;
43    default:
44      usage();
45  }
46  ARGEND;
47
48  if (argc < 1)
49    usage();
50
51  if (strlcpy(cmd, argv[0], sizeof(cmd)) >= sizeof(cmd))
52    eprintf("command too long\n");
53  for (i = 1; i < argc; i++) {
54    if (strlcat(cmd, " ", sizeof(cmd)) >= sizeof(cmd))
55      eprintf("command too long\n");
56    if (strlcat(cmd, argv[i], sizeof(cmd)) >= sizeof(cmd))
57      eprintf("command too long\n");
58  }
59
60  for (;;) {
61    printf("\x1b[2J\x1b[H"); /* clear */
62    fflush(NULL);
63    wsystem(cmd);
64    usleep(interval);
65  }
66  return 0;
67}