diff options
Diffstat (limited to 'procps/watch.c')
-rw-r--r-- | procps/watch.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/procps/watch.c b/procps/watch.c new file mode 100644 index 000000000..2ad0564cd --- /dev/null +++ b/procps/watch.c | |||
@@ -0,0 +1,80 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * Mini watch implementation for busybox | ||
4 | * | ||
5 | * Copyright (C) 2001 by Michael Habermann <mhabermann@gmx.de> | ||
6 | * Copyrigjt (C) Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) | ||
7 | * | ||
8 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | ||
9 | */ | ||
10 | |||
11 | /* BB_AUDIT SUSv3 N/A */ | ||
12 | /* BB_AUDIT GNU defects -- only option -n is supported. */ | ||
13 | |||
14 | #include "libbb.h" | ||
15 | |||
16 | // procps 2.0.18: | ||
17 | // watch [-d] [-n seconds] | ||
18 | // [--differences[=cumulative]] [--interval=seconds] command | ||
19 | // | ||
20 | // procps-3.2.3: | ||
21 | // watch [-dt] [-n seconds] | ||
22 | // [--differences[=cumulative]] [--interval=seconds] [--no-title] command | ||
23 | // | ||
24 | // (procps 3.x and procps 2.x are forks, not newer/older versions of the same) | ||
25 | |||
26 | int watch_main(int argc, char **argv); | ||
27 | int watch_main(int argc, char **argv) | ||
28 | { | ||
29 | unsigned opt; | ||
30 | unsigned period = 2; | ||
31 | unsigned cmdlen = 1; // 1 for terminal NUL | ||
32 | char *header = NULL; | ||
33 | char *cmd; | ||
34 | char *tmp; | ||
35 | char **p; | ||
36 | |||
37 | opt_complementary = "-1"; // at least one param please | ||
38 | opt = getopt32(argc, argv, "+dtn:", &tmp); | ||
39 | //if (opt & 0x1) // -d (ignore) | ||
40 | //if (opt & 0x2) // -t | ||
41 | if (opt & 0x4) period = xatou(tmp); | ||
42 | argv += optind; | ||
43 | |||
44 | p = argv; | ||
45 | while (*p) | ||
46 | cmdlen += strlen(*p++) + 1; | ||
47 | tmp = cmd = xmalloc(cmdlen); | ||
48 | while (*argv) { | ||
49 | tmp += sprintf(tmp, " %s", *argv); | ||
50 | argv++; | ||
51 | } | ||
52 | cmd++; // skip initial space | ||
53 | |||
54 | while (1) { | ||
55 | printf("\033[H\033[J"); | ||
56 | if (!(opt & 0x2)) { // no -t | ||
57 | int width, len; | ||
58 | char *thyme; | ||
59 | time_t t; | ||
60 | |||
61 | get_terminal_width_height(STDOUT_FILENO, &width, 0); | ||
62 | header = xrealloc(header, width--); | ||
63 | // '%-*s' pads header with spaces to the full width | ||
64 | snprintf(header, width, "Every %ds: %-*s", period, width, cmd); | ||
65 | time(&t); | ||
66 | thyme = ctime(&t); | ||
67 | len = strlen(thyme); | ||
68 | if (len < width) | ||
69 | strcpy(header + width - len, thyme); | ||
70 | puts(header); | ||
71 | } | ||
72 | fflush(stdout); | ||
73 | // TODO: 'real' watch pipes cmd's output to itself | ||
74 | // and does not allow it to overflow the screen | ||
75 | // (taking into account linewrap!) | ||
76 | system(cmd); | ||
77 | sleep(period); | ||
78 | } | ||
79 | return 0; // gcc thinks we can reach this :) | ||
80 | } | ||