blob: 51834f8f99e0b93ec61b5ad853b248ff2a371d8e [file] [log] [blame]
Mike Frysinger6b160e42008-02-15 02:27:19 +00001/*
2 * Common RTC functions
Denis Vlasenkodb12d1d2008-12-07 00:52:58 +00003 *
4 * Licensed under GPLv2, see file LICENSE in this tarball for details.
Mike Frysinger6b160e42008-02-15 02:27:19 +00005 */
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
Denis Vlasenkodefc1ea2008-06-27 02:52:20 +000016int FAST_FUNC rtc_adjtime_is_utc(void)
Mike Frysinger6b160e42008-02-15 02:27:19 +000017{
18 int utc = 0;
Denis Vlasenko5415c852008-07-21 23:05:26 +000019 FILE *f = fopen_for_read(ADJTIME_PATH);
Mike Frysinger6b160e42008-02-15 02:27:19 +000020
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
Denis Vlasenkodefc1ea2008-06-27 02:52:20 +000045int FAST_FUNC rtc_xopen(const char **default_rtc, int flags)
Mike Frysinger6b160e42008-02-15 02:27:19 +000046{
47 int rtc;
48
Mike Frysinger977bc6a2008-02-15 07:19:03 +000049 if (!*default_rtc) {
50 *default_rtc = "/dev/rtc";
51 rtc = open(*default_rtc, flags);
Mike Frysinger6b160e42008-02-15 02:27:19 +000052 if (rtc >= 0)
53 return rtc;
Mike Frysinger977bc6a2008-02-15 07:19:03 +000054 *default_rtc = "/dev/rtc0";
55 rtc = open(*default_rtc, flags);
Mike Frysinger6b160e42008-02-15 02:27:19 +000056 if (rtc >= 0)
57 return rtc;
Mike Frysinger977bc6a2008-02-15 07:19:03 +000058 *default_rtc = "/dev/misc/rtc";
Mike Frysinger6b160e42008-02-15 02:27:19 +000059 }
60
Mike Frysinger977bc6a2008-02-15 07:19:03 +000061 return xopen(*default_rtc, flags);
Mike Frysinger6b160e42008-02-15 02:27:19 +000062}
63
Denis Vlasenkodefc1ea2008-06-27 02:52:20 +000064time_t FAST_FUNC rtc_read_time(int fd, int utc)
Mike Frysinger6b160e42008-02-15 02:27:19 +000065{
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; /* not known */
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}