Annotation of /trunk/mkinitrd-magellan/busybox/util-linux/hwclock.c
Parent Directory | 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: 2729 byte(s)
Fri Apr 24 18:33:46 2009 UTC (15 years, 1 month ago) by niro
File MIME type: text/plain
File size: 2729 byte(s)
-updated to busybox-1.13.4
1 | niro | 532 | /* vi: set sw=4 ts=4: */ |
2 | /* | ||
3 | * Mini hwclock implementation for busybox | ||
4 | * | ||
5 | * Copyright (C) 2002 Robert Griebl <griebl@gmx.de> | ||
6 | * | ||
7 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | ||
8 | */ | ||
9 | |||
10 | #include <sys/utsname.h> | ||
11 | niro | 816 | #include "libbb.h" |
12 | #include "rtc_.h" | ||
13 | niro | 532 | |
14 | #if ENABLE_FEATURE_HWCLOCK_LONG_OPTIONS | ||
15 | # ifndef _GNU_SOURCE | ||
16 | # define _GNU_SOURCE | ||
17 | # endif | ||
18 | #endif | ||
19 | |||
20 | niro | 816 | static const char *rtcname; |
21 | niro | 532 | |
22 | static time_t read_rtc(int utc) | ||
23 | { | ||
24 | niro | 816 | time_t ret; |
25 | int fd; | ||
26 | niro | 532 | |
27 | niro | 816 | fd = rtc_xopen(&rtcname, O_RDONLY); |
28 | ret = rtc_read_time(fd, utc); | ||
29 | close(fd); | ||
30 | niro | 532 | |
31 | niro | 816 | return ret; |
32 | niro | 532 | } |
33 | |||
34 | static void write_rtc(time_t t, int utc) | ||
35 | { | ||
36 | struct tm tm; | ||
37 | niro | 816 | int rtc = rtc_xopen(&rtcname, O_WRONLY); |
38 | niro | 532 | |
39 | tm = *(utc ? gmtime(&t) : localtime(&t)); | ||
40 | tm.tm_isdst = 0; | ||
41 | |||
42 | niro | 816 | xioctl(rtc, RTC_SET_TIME, &tm); |
43 | niro | 532 | |
44 | close(rtc); | ||
45 | } | ||
46 | |||
47 | niro | 816 | static void show_clock(int utc) |
48 | niro | 532 | { |
49 | niro | 816 | //struct tm *ptm; |
50 | niro | 532 | time_t t; |
51 | niro | 816 | char *cp; |
52 | niro | 532 | |
53 | t = read_rtc(utc); | ||
54 | niro | 816 | //ptm = localtime(&t); /* Sets 'tzname[]' */ |
55 | niro | 532 | |
56 | niro | 816 | cp = ctime(&t); |
57 | if (cp[0]) | ||
58 | cp[strlen(cp) - 1] = '\0'; | ||
59 | niro | 532 | |
60 | niro | 816 | //printf("%s %.6f seconds %s\n", cp, 0.0, utc ? "" : (ptm->tm_isdst ? tzname[1] : tzname[0])); |
61 | printf("%s 0.000000 seconds\n", cp); | ||
62 | niro | 532 | } |
63 | |||
64 | niro | 816 | static void to_sys_clock(int utc) |
65 | niro | 532 | { |
66 | niro | 816 | struct timeval tv; |
67 | niro | 532 | const struct timezone tz = { timezone/60 - 60*daylight, 0 }; |
68 | |||
69 | tv.tv_sec = read_rtc(utc); | ||
70 | niro | 816 | tv.tv_usec = 0; |
71 | niro | 532 | if (settimeofday(&tv, &tz)) |
72 | bb_perror_msg_and_die("settimeofday() failed"); | ||
73 | } | ||
74 | |||
75 | niro | 816 | static void from_sys_clock(int utc) |
76 | niro | 532 | { |
77 | niro | 816 | struct timeval tv; |
78 | niro | 532 | |
79 | niro | 816 | gettimeofday(&tv, NULL); |
80 | //if (gettimeofday(&tv, NULL)) | ||
81 | // bb_perror_msg_and_die("gettimeofday() failed"); | ||
82 | niro | 532 | write_rtc(tv.tv_sec, utc); |
83 | } | ||
84 | |||
85 | #define HWCLOCK_OPT_LOCALTIME 0x01 | ||
86 | #define HWCLOCK_OPT_UTC 0x02 | ||
87 | #define HWCLOCK_OPT_SHOW 0x04 | ||
88 | #define HWCLOCK_OPT_HCTOSYS 0x08 | ||
89 | #define HWCLOCK_OPT_SYSTOHC 0x10 | ||
90 | niro | 816 | #define HWCLOCK_OPT_RTCFILE 0x20 |
91 | niro | 532 | |
92 | niro | 816 | int hwclock_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
93 | int hwclock_main(int argc UNUSED_PARAM, char **argv) | ||
94 | niro | 532 | { |
95 | unsigned opt; | ||
96 | int utc; | ||
97 | |||
98 | #if ENABLE_FEATURE_HWCLOCK_LONG_OPTIONS | ||
99 | niro | 816 | static const char hwclock_longopts[] ALIGN1 = |
100 | "localtime\0" No_argument "l" | ||
101 | "utc\0" No_argument "u" | ||
102 | "show\0" No_argument "r" | ||
103 | "hctosys\0" No_argument "s" | ||
104 | "systohc\0" No_argument "w" | ||
105 | "file\0" Required_argument "f" | ||
106 | ; | ||
107 | applet_long_options = hwclock_longopts; | ||
108 | niro | 532 | #endif |
109 | niro | 816 | opt_complementary = "r--ws:w--rs:s--wr:l--u:u--l"; |
110 | opt = getopt32(argv, "lurswf:", &rtcname); | ||
111 | niro | 532 | |
112 | /* If -u or -l wasn't given check if we are using utc */ | ||
113 | if (opt & (HWCLOCK_OPT_UTC | HWCLOCK_OPT_LOCALTIME)) | ||
114 | niro | 816 | utc = (opt & HWCLOCK_OPT_UTC); |
115 | niro | 532 | else |
116 | niro | 816 | utc = rtc_adjtime_is_utc(); |
117 | niro | 532 | |
118 | niro | 816 | if (opt & HWCLOCK_OPT_HCTOSYS) |
119 | to_sys_clock(utc); | ||
120 | else if (opt & HWCLOCK_OPT_SYSTOHC) | ||
121 | from_sys_clock(utc); | ||
122 | else | ||
123 | niro | 532 | /* default HWCLOCK_OPT_SHOW */ |
124 | niro | 816 | show_clock(utc); |
125 | |||
126 | return 0; | ||
127 | niro | 532 | } |