sleep: if FANCY && DESKTOP, support fractional seconds, minutes,
hours and so on. It's coreutils compat. bloatcheck is atrocious :( function old new delta sleep_main 71 362 +291 bb_strtod - 127 +127 make_device 1269 1294 +25 getoptscmd 708 713 +5 switch_root_main 402 401 -1 display_speed 90 85 -5 show_entry 295 289 -6 parse_expr 841 833 -8 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 3/4 up/down: 448/-20) Total: 428 bytes
This commit is contained in:
@ -36,28 +36,69 @@ static const struct suffix_mult sfx[] = {
|
||||
int sleep_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||
int sleep_main(int argc UNUSED_PARAM, char **argv)
|
||||
{
|
||||
#if ENABLE_FEATURE_FANCY_SLEEP && ENABLE_DESKTOP
|
||||
double duration;
|
||||
struct timespec ts;
|
||||
#else
|
||||
unsigned duration;
|
||||
#endif
|
||||
|
||||
++argv;
|
||||
if (!*argv)
|
||||
bb_show_usage();
|
||||
|
||||
#if ENABLE_FEATURE_FANCY_SLEEP
|
||||
#if ENABLE_FEATURE_FANCY_SLEEP && ENABLE_DESKTOP
|
||||
|
||||
duration = 0;
|
||||
do {
|
||||
duration += xatoul_range_sfx(*argv, 0, UINT_MAX-duration, sfx);
|
||||
char *arg = *argv;
|
||||
if (strchr(arg, '.')) {
|
||||
double d;
|
||||
int len = strspn(arg, "0123456789.");
|
||||
char sv = arg[len];
|
||||
arg[len] = '\0';
|
||||
d = bb_strtod(arg, NULL);
|
||||
if (errno)
|
||||
bb_show_usage();
|
||||
arg[len] = sv;
|
||||
len--;
|
||||
sv = arg[len];
|
||||
arg[len] = '1';
|
||||
duration += d * xatoul_sfx(&arg[len], sfx);
|
||||
arg[len] = sv;
|
||||
} else
|
||||
duration += xatoul_sfx(arg, sfx);
|
||||
} while (*++argv);
|
||||
|
||||
#else /* FEATURE_FANCY_SLEEP */
|
||||
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);
|
||||
|
||||
#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 /* FEATURE_FANCY_SLEEP */
|
||||
|
||||
if (sleep(duration)) {
|
||||
bb_perror_nomsg_and_die();
|
||||
}
|
||||
#endif
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
Reference in New Issue
Block a user