Magellan Linux

Annotation of /trunk/mkinitrd-magellan/busybox/coreutils/sleep.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 816 - (hide annotations) (download)
Fri Apr 24 18:33:46 2009 UTC (15 years, 1 month ago) by niro
File MIME type: text/plain
File size: 2237 byte(s)
-updated to busybox-1.13.4
1 niro 532 /* vi: set sw=4 ts=4: */
2     /*
3     * sleep implementation for busybox
4     *
5     * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org>
6     *
7     * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8     */
9    
10     /* BB_AUDIT SUSv3 compliant */
11     /* BB_AUDIT GNU issues -- fancy version matches except args must be ints. */
12     /* http://www.opengroup.org/onlinepubs/007904975/utilities/sleep.html */
13    
14     /* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org)
15     *
16     * Rewritten to do proper arg and error checking.
17     * Also, added a 'fancy' configuration to accept multiple args with
18     * time suffixes for seconds, minutes, hours, and days.
19     */
20    
21 niro 816 #include "libbb.h"
22 niro 532
23 niro 816 /* This is a NOFORK applet. Be very careful! */
24    
25    
26     #if ENABLE_FEATURE_FANCY_SLEEP || ENABLE_FEATURE_FLOAT_SLEEP
27 niro 532 static const struct suffix_mult sfx[] = {
28     { "s", 1 },
29     { "m", 60 },
30     { "h", 60*60 },
31     { "d", 24*60*60 },
32 niro 816 { }
33 niro 532 };
34     #endif
35    
36 niro 816 int sleep_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
37     int sleep_main(int argc UNUSED_PARAM, char **argv)
38 niro 532 {
39 niro 816 #if ENABLE_FEATURE_FLOAT_SLEEP
40     double duration;
41     struct timespec ts;
42     #else
43     unsigned duration;
44     #endif
45 niro 532
46 niro 816 ++argv;
47     if (!*argv)
48 niro 532 bb_show_usage();
49    
50 niro 816 #if ENABLE_FEATURE_FLOAT_SLEEP
51    
52 niro 532 duration = 0;
53     do {
54 niro 816 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 niro 532 } while (*++argv);
72    
73 niro 816 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 niro 532 }
79 niro 816 do {
80     errno = 0;
81     nanosleep(&ts, &ts);
82     } while (errno == EINTR);
83 niro 532
84 niro 816 #elif ENABLE_FEATURE_FANCY_SLEEP
85 niro 532
86 niro 816 duration = 0;
87     do {
88     duration += xatou_range_sfx(*argv, 0, UINT_MAX - duration, sfx);
89     } while (*++argv);
90     sleep(duration);
91 niro 532
92 niro 816 #else /* simple */
93 niro 532
94 niro 816 duration = xatou(*argv);
95     sleep(duration);
96     // Off. If it's really needed, provide example why
97     //if (sleep(duration)) {
98     // bb_perror_nomsg_and_die();
99     //}
100    
101     #endif
102    
103 niro 532 return EXIT_SUCCESS;
104     }