1/*
2 * Common RTC functions
3 *
4 * Licensed under GPLv2, see file LICENSE in this tarball for details.
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; /* "not known" */
67}
68
69time_t FAST_FUNC rtc_tm2time(struct tm *ptm, int utc)
70{
71	char *oldtz = oldtz; /* for compiler */
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