blob: fcd6c64d71fa0939f7da9c7381d47dc1a2bda753 [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) {
Denys Vlasenko695fa512010-01-06 18:16:39 +010022 char buffer[128];
Mike Frysinger6b160e42008-02-15 02:27:19 +000023
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);
Mike Frysinger6b160e42008-02-15 02:27:19 +000038 }
39
40 return utc;
41}
42
Denis Vlasenkodefc1ea2008-06-27 02:52:20 +000043int FAST_FUNC rtc_xopen(const char **default_rtc, int flags)
Mike Frysinger6b160e42008-02-15 02:27:19 +000044{
45 int rtc;
46
Mike Frysinger977bc6a2008-02-15 07:19:03 +000047 if (!*default_rtc) {
48 *default_rtc = "/dev/rtc";
49 rtc = open(*default_rtc, flags);
Mike Frysinger6b160e42008-02-15 02:27:19 +000050 if (rtc >= 0)
51 return rtc;
Mike Frysinger977bc6a2008-02-15 07:19:03 +000052 *default_rtc = "/dev/rtc0";
53 rtc = open(*default_rtc, flags);
Mike Frysinger6b160e42008-02-15 02:27:19 +000054 if (rtc >= 0)
55 return rtc;
Mike Frysinger977bc6a2008-02-15 07:19:03 +000056 *default_rtc = "/dev/misc/rtc";
Mike Frysinger6b160e42008-02-15 02:27:19 +000057 }
58
Mike Frysinger977bc6a2008-02-15 07:19:03 +000059 return xopen(*default_rtc, flags);
Mike Frysinger6b160e42008-02-15 02:27:19 +000060}
61
Denys Vlasenkodc698bb2010-01-09 19:10:49 +010062void FAST_FUNC rtc_read_tm(struct tm *ptm, int fd)
Mike Frysinger6b160e42008-02-15 02:27:19 +000063{
Denys Vlasenkodc698bb2010-01-09 19:10:49 +010064 memset(ptm, 0, sizeof(*ptm));
65 xioctl(fd, RTC_RD_TIME, ptm);
66 ptm->tm_isdst = -1; /* "not known" */
Denys Vlasenko5e3b1402010-01-06 22:43:39 +010067}
Mike Frysinger6b160e42008-02-15 02:27:19 +000068
Denys Vlasenkodc698bb2010-01-09 19:10:49 +010069time_t FAST_FUNC rtc_tm2time(struct tm *ptm, int utc)
Denys Vlasenko5e3b1402010-01-06 22:43:39 +010070{
71 char *oldtz = oldtz; /* for compiler */
72 time_t t;
Mike Frysinger6b160e42008-02-15 02:27:19 +000073
74 if (utc) {
75 oldtz = getenv("TZ");
76 putenv((char*)"TZ=UTC0");
77 tzset();
78 }
79
Denys Vlasenkodc698bb2010-01-09 19:10:49 +010080 t = mktime(ptm);
Mike Frysinger6b160e42008-02-15 02:27:19 +000081
82 if (utc) {
83 unsetenv("TZ");
84 if (oldtz)
85 putenv(oldtz - 3);
86 tzset();
87 }
88
89 return t;
90}