1
2
3
4
5
6
7#include "libbb.h"
8#include "rtc_.h"
9
10#if ENABLE_FEATURE_HWCLOCK_ADJTIME_FHS
11# define ADJTIME_PATH "/var/lib/hwclock/adjtime"
12#else
13# define ADJTIME_PATH "/etc/adjtime"
14#endif
15
16int FAST_FUNC rtc_adjtime_is_utc(void)
17{
18 int utc = 0;
19 FILE *f = fopen_for_read(ADJTIME_PATH);
20
21 if (f) {
22 RESERVE_CONFIG_BUFFER(buffer, 128);
23
24 while (fgets(buffer, sizeof(buffer), f)) {
25 int len = strlen(buffer);
26
27 while (len && isspace(buffer[len - 1]))
28 len--;
29
30 buffer[len] = 0;
31
32 if (strncmp(buffer, "UTC", 3) == 0) {
33 utc = 1;
34 break;
35 }
36 }
37 fclose(f);
38
39 RELEASE_CONFIG_BUFFER(buffer);
40 }
41
42 return utc;
43}
44
45int FAST_FUNC rtc_xopen(const char **default_rtc, int flags)
46{
47 int rtc;
48
49 if (!*default_rtc) {
50 *default_rtc = "/dev/rtc";
51 rtc = open(*default_rtc, flags);
52 if (rtc >= 0)
53 return rtc;
54 *default_rtc = "/dev/rtc0";
55 rtc = open(*default_rtc, flags);
56 if (rtc >= 0)
57 return rtc;
58 *default_rtc = "/dev/misc/rtc";
59 }
60
61 return xopen(*default_rtc, flags);
62}
63
64time_t FAST_FUNC rtc_read_time(int fd, int utc)
65{
66 struct tm tm;
67 char *oldtz = 0;
68 time_t t = 0;
69
70 memset(&tm, 0, sizeof(struct tm));
71 xioctl(fd, RTC_RD_TIME, &tm);
72 tm.tm_isdst = -1;
73
74 if (utc) {
75 oldtz = getenv("TZ");
76 putenv((char*)"TZ=UTC0");
77 tzset();
78 }
79
80 t = mktime(&tm);
81
82 if (utc) {
83 unsetenv("TZ");
84 if (oldtz)
85 putenv(oldtz - 3);
86 tzset();
87 }
88
89 return t;
90}
91