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 char 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
40 return utc;
41}
42
43int FAST_FUNC rtc_xopen(const char **default_rtc, int flags)
44{
45 int rtc;
46
47 if (!*default_rtc) {
48 *default_rtc = "/dev/rtc";
49 rtc = open(*default_rtc, flags);
50 if (rtc >= 0)
51 return rtc;
52 *default_rtc = "/dev/rtc0";
53 rtc = open(*default_rtc, flags);
54 if (rtc >= 0)
55 return rtc;
56 *default_rtc = "/dev/misc/rtc";
57 }
58
59 return xopen(*default_rtc, flags);
60}
61
62void FAST_FUNC rtc_read_tm(struct tm *ptm, int fd)
63{
64 memset(ptm, 0, sizeof(*ptm));
65 xioctl(fd, RTC_RD_TIME, ptm);
66 ptm->tm_isdst = -1;
67}
68
69time_t FAST_FUNC rtc_tm2time(struct tm *ptm, int utc)
70{
71 char *oldtz = oldtz;
72 time_t t;
73
74 if (utc) {
75 oldtz = getenv("TZ");
76 putenv((char*)"TZ=UTC0");
77 tzset();
78 }
79
80 t = mktime(ptm);
81
82 if (utc) {
83 unsetenv("TZ");
84 if (oldtz)
85 putenv(oldtz - 3);
86 tzset();
87 }
88
89 return t;
90}
91