1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include "libbb.h"
22
23
24
25
26#if ENABLE_FEATURE_FANCY_SLEEP || ENABLE_FEATURE_FLOAT_SLEEP
27static const struct suffix_mult sfx[] = {
28 { "s", 1 },
29 { "m", 60 },
30 { "h", 60*60 },
31 { "d", 24*60*60 },
32 { }
33};
34#endif
35
36int sleep_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
37int sleep_main(int argc UNUSED_PARAM, char **argv)
38{
39#if ENABLE_FEATURE_FLOAT_SLEEP
40 double duration;
41 struct timespec ts;
42#else
43 unsigned duration;
44#endif
45
46 ++argv;
47 if (!*argv)
48 bb_show_usage();
49
50#if ENABLE_FEATURE_FLOAT_SLEEP
51
52 duration = 0;
53 do {
54 char *arg = *argv;
55 if (strchr(arg, '.')) {
56 double d;
57 int len = strspn(arg, "0123456789.");
58 char sv = arg[len];
59 arg[len] = '\0';
60 d = bb_strtod(arg, NULL);
61 if (errno)
62 bb_show_usage();
63 arg[len] = sv;
64 len--;
65 sv = arg[len];
66 arg[len] = '1';
67 duration += d * xatoul_sfx(&arg[len], sfx);
68 arg[len] = sv;
69 } else
70 duration += xatoul_sfx(arg, sfx);
71 } while (*++argv);
72
73 ts.tv_sec = MAXINT(typeof(ts.tv_sec));
74 ts.tv_nsec = 0;
75 if (duration >= 0 && duration < ts.tv_sec) {
76 ts.tv_sec = duration;
77 ts.tv_nsec = (duration - ts.tv_sec) * 1000000000;
78 }
79 do {
80 errno = 0;
81 nanosleep(&ts, &ts);
82 } while (errno == EINTR);
83
84#elif ENABLE_FEATURE_FANCY_SLEEP
85
86 duration = 0;
87 do {
88 duration += xatou_range_sfx(*argv, 0, UINT_MAX - duration, sfx);
89 } while (*++argv);
90 sleep(duration);
91
92#else
93
94 duration = xatou(*argv);
95 sleep(duration);
96
97
98
99
100
101#endif
102
103 return EXIT_SUCCESS;
104}
105