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