diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2019-03-12 18:56:51 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2019-03-12 18:56:51 +0100 |
commit | 0ddc742c04538fdd8be51fb1d4dbcbd4309952db (patch) | |
tree | aad3cbbb11ccfc718537fbf5497a17fd0eaf68a9 | |
parent | 2452247ea33c1c70263bf4cbc11b3170366ff2ea (diff) | |
download | busybox-w32-0ddc742c04538fdd8be51fb1d4dbcbd4309952db.tar.gz busybox-w32-0ddc742c04538fdd8be51fb1d4dbcbd4309952db.tar.bz2 busybox-w32-0ddc742c04538fdd8be51fb1d4dbcbd4309952db.zip |
watch: support fractional -n SEC
function old new delta
watch_main 212 232 +20
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | include/libbb.h | 2 | ||||
-rw-r--r-- | procps/watch.c | 17 |
2 files changed, 14 insertions, 5 deletions
diff --git a/include/libbb.h b/include/libbb.h index 3366df30f..7a1e13875 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
@@ -1040,9 +1040,11 @@ uint16_t xatou16(const char *numstr) FAST_FUNC; | |||
1040 | #if ENABLE_FLOAT_DURATION | 1040 | #if ENABLE_FLOAT_DURATION |
1041 | typedef double duration_t; | 1041 | typedef double duration_t; |
1042 | void sleep_for_duration(duration_t duration) FAST_FUNC; | 1042 | void sleep_for_duration(duration_t duration) FAST_FUNC; |
1043 | #define DURATION_FMT "f" | ||
1043 | #else | 1044 | #else |
1044 | typedef unsigned duration_t; | 1045 | typedef unsigned duration_t; |
1045 | #define sleep_for_duration(duration) sleep(duration) | 1046 | #define sleep_for_duration(duration) sleep(duration) |
1047 | #define DURATION_FMT "u" | ||
1046 | #endif | 1048 | #endif |
1047 | duration_t parse_duration_str(char *str) FAST_FUNC; | 1049 | duration_t parse_duration_str(char *str) FAST_FUNC; |
1048 | 1050 | ||
diff --git a/procps/watch.c b/procps/watch.c index dbe427aad..059eb1dda 100644 --- a/procps/watch.c +++ b/procps/watch.c | |||
@@ -22,7 +22,7 @@ | |||
22 | //usage: "[-n SEC] [-t] PROG ARGS" | 22 | //usage: "[-n SEC] [-t] PROG ARGS" |
23 | //usage:#define watch_full_usage "\n\n" | 23 | //usage:#define watch_full_usage "\n\n" |
24 | //usage: "Run PROG periodically\n" | 24 | //usage: "Run PROG periodically\n" |
25 | //usage: "\n -n Loop period in seconds (default 2)" | 25 | //usage: "\n -n SEC Loop period (default 2)" |
26 | //usage: "\n -t Don't print header" | 26 | //usage: "\n -t Don't print header" |
27 | //usage: | 27 | //usage: |
28 | //usage:#define watch_example_usage | 28 | //usage:#define watch_example_usage |
@@ -51,8 +51,9 @@ | |||
51 | int watch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 51 | int watch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
52 | int watch_main(int argc UNUSED_PARAM, char **argv) | 52 | int watch_main(int argc UNUSED_PARAM, char **argv) |
53 | { | 53 | { |
54 | duration_t period; | ||
55 | char *period_str = (char*) "2"; | ||
54 | unsigned opt; | 56 | unsigned opt; |
55 | unsigned period = 2; | ||
56 | unsigned width, new_width; | 57 | unsigned width, new_width; |
57 | char *header; | 58 | char *header; |
58 | char *cmd; | 59 | char *cmd; |
@@ -65,7 +66,7 @@ int watch_main(int argc UNUSED_PARAM, char **argv) | |||
65 | 66 | ||
66 | // "+": stop at first non-option (procps 3.x only); -n NUM | 67 | // "+": stop at first non-option (procps 3.x only); -n NUM |
67 | // at least one param | 68 | // at least one param |
68 | opt = getopt32(argv, "^+" "dtn:+" "\0" "-1", &period); | 69 | opt = getopt32(argv, "^+" "dtn:" "\0" "-1", &period_str); |
69 | argv += optind; | 70 | argv += optind; |
70 | 71 | ||
71 | // watch from both procps 2.x and 3.x does concatenation. Example: | 72 | // watch from both procps 2.x and 3.x does concatenation. Example: |
@@ -74,6 +75,7 @@ int watch_main(int argc UNUSED_PARAM, char **argv) | |||
74 | while (*++argv) | 75 | while (*++argv) |
75 | cmd = xasprintf("%s %s", cmd, *argv); // leaks cmd | 76 | cmd = xasprintf("%s %s", cmd, *argv); // leaks cmd |
76 | 77 | ||
78 | period = parse_duration_str(period_str); | ||
77 | width = (unsigned)-1; // make sure first time new_width != width | 79 | width = (unsigned)-1; // make sure first time new_width != width |
78 | header = NULL; | 80 | header = NULL; |
79 | while (1) { | 81 | while (1) { |
@@ -88,7 +90,12 @@ int watch_main(int argc UNUSED_PARAM, char **argv) | |||
88 | if (new_width != width) { | 90 | if (new_width != width) { |
89 | width = new_width; | 91 | width = new_width; |
90 | free(header); | 92 | free(header); |
91 | header = xasprintf("Every %us: %-*s", period, (int)width, cmd); | 93 | header = xasprintf("Every" |
94 | " %"IF_FLOAT_DURATION(".1")DURATION_FMT"s:" | ||
95 | " %-*s", | ||
96 | period, | ||
97 | (int)width, cmd | ||
98 | ); | ||
92 | } | 99 | } |
93 | if (time_len < width) { | 100 | if (time_len < width) { |
94 | strftime_YYYYMMDDHHMMSS( | 101 | strftime_YYYYMMDDHHMMSS( |
@@ -106,7 +113,7 @@ int watch_main(int argc UNUSED_PARAM, char **argv) | |||
106 | // and does not allow it to overflow the screen | 113 | // and does not allow it to overflow the screen |
107 | // (taking into account linewrap!) | 114 | // (taking into account linewrap!) |
108 | system(cmd); | 115 | system(cmd); |
109 | sleep(period); | 116 | sleep_for_duration(period); |
110 | } | 117 | } |
111 | return 0; // gcc thinks we can reach this :) | 118 | return 0; // gcc thinks we can reach this :) |
112 | } | 119 | } |