diff options
author | Denys Vlasenko | 2018-08-03 18:17:12 +0200 |
---|---|---|
committer | Denys Vlasenko | 2018-08-03 18:17:12 +0200 |
commit | 4c20d9f2b0223874e2b5ac1235d5f33fdd02589b (patch) | |
tree | e533a2de1fe3e146bb1dcd410e7c6ff6b68fa0a6 /coreutils | |
parent | 9b1c8bf89be668a533505e5fb4405bac6eed651c (diff) | |
download | busybox-4c20d9f2b0223874e2b5ac1235d5f33fdd02589b.zip busybox-4c20d9f2b0223874e2b5ac1235d5f33fdd02589b.tar.gz |
extend fractional duration support to "top -d N.N" and "timeout"
function old new delta
parse_duration_str - 168 +168
sleep_for_duration - 157 +157
top_main 885 928 +43
timeout_main 269 312 +43
handle_input 571 614 +43
duration_suffixes - 40 +40
sfx 40 - -40
sleep_main 364 79 -285
------------------------------------------------------------------------------
(add/remove: 4/1 grow/shrink: 3/1 up/down: 494/-325) Total: 169 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/sleep.c | 78 | ||||
-rw-r--r-- | coreutils/timeout.c | 6 |
2 files changed, 9 insertions, 75 deletions
diff --git a/coreutils/sleep.c b/coreutils/sleep.c index 9b9581c..1266658 100644 --- a/coreutils/sleep.c +++ b/coreutils/sleep.c @@ -32,13 +32,6 @@ //config: depends on SLEEP //config: help //config: Allow sleep to pause for specified minutes, hours, and days. -//config: -//config:config FEATURE_FLOAT_SLEEP -//config: bool "Enable fractional arguments" -//config: default y -//config: depends on FEATURE_FANCY_SLEEP -//config: help -//config: Allow for fractional numeric parameters. /* Do not make this applet NOFORK. It breaks ^C-ing of pauses in shells */ //applet:IF_SLEEP(APPLET(sleep, BB_DIR_BIN, BB_SUID_DROP)) @@ -66,89 +59,28 @@ #include "libbb.h" -#if ENABLE_FEATURE_FANCY_SLEEP || ENABLE_FEATURE_FLOAT_SLEEP -static const struct suffix_mult sfx[] = { - { "s", 1 }, - { "m", 60 }, - { "h", 60*60 }, - { "d", 24*60*60 }, - { "", 0 } -}; -#endif - int sleep_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int sleep_main(int argc UNUSED_PARAM, char **argv) { -#if ENABLE_FEATURE_FLOAT_SLEEP - double duration; - struct timespec ts; -#else - unsigned duration; -#endif + duration_t duration; ++argv; if (!*argv) bb_show_usage(); -#if ENABLE_FEATURE_FLOAT_SLEEP - -# if ENABLE_LOCALE_SUPPORT +#if ENABLE_FEATURE_FANCY_SLEEP +# if ENABLE_FLOAT_DURATION /* undo busybox.c setlocale */ setlocale(LC_NUMERIC, "C"); # endif duration = 0; do { - char *arg = *argv; - if (strchr(arg, '.')) { - double d; - char *pp; - int len = strspn(arg, "0123456789."); - char sv = arg[len]; - arg[len] = '\0'; - errno = 0; - d = strtod(arg, &pp); - if (errno || *pp) - bb_show_usage(); - arg += len; - *arg-- = sv; - sv = *arg; - *arg = '1'; - duration += d * xatoul_sfx(arg, sfx); - *arg = sv; - } else { - duration += xatoul_sfx(arg, sfx); - } + duration += parse_duration_str(*argv); } while (*++argv); - - ts.tv_sec = MAXINT(typeof(ts.tv_sec)); - ts.tv_nsec = 0; - if (duration >= 0 && duration < ts.tv_sec) { - ts.tv_sec = duration; - ts.tv_nsec = (duration - ts.tv_sec) * 1000000000; - } - do { - errno = 0; - nanosleep(&ts, &ts); - } while (errno == EINTR); - -#elif ENABLE_FEATURE_FANCY_SLEEP - - duration = 0; - do { - duration += xatou_range_sfx(*argv, 0, UINT_MAX - duration, sfx); - } while (*++argv); - sleep(duration); - + sleep_for_duration(duration); #else /* simple */ - duration = xatou(*argv); sleep(duration); - // Off. If it's really needed, provide example why - //if (sleep(duration)) { - // bb_perror_nomsg_and_die(); - //} - #endif - return EXIT_SUCCESS; } diff --git a/coreutils/timeout.c b/coreutils/timeout.c index 4a6117f..663303c 100644 --- a/coreutils/timeout.c +++ b/coreutils/timeout.c @@ -52,7 +52,8 @@ int timeout_main(int argc UNUSED_PARAM, char **argv) int signo; int status; int parent = 0; - int timeout = 10; + unsigned timeout; + const char *timeout_s = "10"; pid_t pid; #if !BB_MMU char *sv1, *sv2; @@ -63,11 +64,12 @@ int timeout_main(int argc UNUSED_PARAM, char **argv) /* -t SECONDS; -p PARENT_PID */ /* '+': stop at first non-option */ - getopt32(argv, "+s:t:+" USE_FOR_NOMMU("p:+"), &opt_s, &timeout, &parent); + getopt32(argv, "+s:t:" USE_FOR_NOMMU("p:+"), &opt_s, &timeout_s, &parent); /*argv += optind; - no, wait for bb_daemonize_or_rexec! */ signo = get_signum(opt_s); if (signo < 0) bb_error_msg_and_die("unknown signal '%s'", opt_s); + timeout = parse_duration_str((char*)timeout_s); /* We want to create a grandchild which will watch * and kill the grandparent. Other methods: |