12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- /*
- * Common RTC functions
- */
- #include "libbb.h"
- #include "rtc_.h"
- #if ENABLE_FEATURE_HWCLOCK_ADJTIME_FHS
- # define ADJTIME_PATH "/var/lib/hwclock/adjtime"
- #else
- # define ADJTIME_PATH "/etc/adjtime"
- #endif
- int rtc_adjtime_is_utc(void)
- {
- int utc = 0;
- FILE *f = fopen(ADJTIME_PATH, "r");
- if (f) {
- RESERVE_CONFIG_BUFFER(buffer, 128);
- while (fgets(buffer, sizeof(buffer), f)) {
- int len = strlen(buffer);
- while (len && isspace(buffer[len - 1]))
- len--;
- buffer[len] = 0;
- if (strncmp(buffer, "UTC", 3) == 0) {
- utc = 1;
- break;
- }
- }
- fclose(f);
- RELEASE_CONFIG_BUFFER(buffer);
- }
- return utc;
- }
- int rtc_xopen(const char **default_rtc, int flags)
- {
- int rtc;
- if (!*default_rtc) {
- *default_rtc = "/dev/rtc";
- rtc = open(*default_rtc, flags);
- if (rtc >= 0)
- return rtc;
- *default_rtc = "/dev/rtc0";
- rtc = open(*default_rtc, flags);
- if (rtc >= 0)
- return rtc;
- *default_rtc = "/dev/misc/rtc";
- }
- return xopen(*default_rtc, flags);
- }
- time_t rtc_read_time(int fd, int utc)
- {
- struct tm tm;
- char *oldtz = 0;
- time_t t = 0;
- memset(&tm, 0, sizeof(struct tm));
- xioctl(fd, RTC_RD_TIME, &tm);
- tm.tm_isdst = -1; /* not known */
- if (utc) {
- oldtz = getenv("TZ");
- putenv((char*)"TZ=UTC0");
- tzset();
- }
- t = mktime(&tm);
- if (utc) {
- unsetenv("TZ");
- if (oldtz)
- putenv(oldtz - 3);
- tzset();
- }
- return t;
- }
|