master xplshn/aruu / cmd / pseudo / watch.c
 1/* See LICENSE file for copyright and license details. */
 2
 3
 4#include <errno.h>
 5#include <stdio.h>
 6#include <stdlib.h>
 7#include <unistd.h>
 8
 9#include "util.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	// ?man -t: sort or specify timestamp
31	case 't':
32		break;
33	// ?man -n:str: print line numbers or counts
34	case 'n':
35		period = strtof(EARGF(usage()), &end);
36		if (*end != '\0' || errno != 0)
37			eprintf("invalid interval\n");
38		if (period < 0)
39			period = 0.1f;
40		interval = period * 1E6;
41		break;
42	default:
43		usage();
44	} ARGEND;
45
46	if (argc < 1)
47		usage();
48
49	if (strlcpy(cmd, argv[0], sizeof(cmd)) >= sizeof(cmd))
50		eprintf("command too long\n");
51	for (i = 1; i < argc; i++) {
52		if (strlcat(cmd, " ", sizeof(cmd)) >= sizeof(cmd))
53			eprintf("command too long\n");
54		if (strlcat(cmd, argv[i], sizeof(cmd)) >= sizeof(cmd))
55			eprintf("command too long\n");
56	}
57
58	for (;;) {
59		printf("\x1b[2J\x1b[H"); /* clear */
60		fflush(NULL);
61		system(cmd);
62		usleep(interval);
63	}
64	return 0;
65}