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}