busybox/libbb/rtc.c
<<
>>
Prefs
   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                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
  45int FAST_FUNC rtc_xopen(const char **default_rtc, int flags)
  46{
  47        int rtc;
  48
  49        if (!*default_rtc) {
  50                *default_rtc = "/dev/rtc";
  51                rtc = open(*default_rtc, flags);
  52                if (rtc >= 0)
  53                        return rtc;
  54                *default_rtc = "/dev/rtc0";
  55                rtc = open(*default_rtc, flags);
  56                if (rtc >= 0)
  57                        return rtc;
  58                *default_rtc = "/dev/misc/rtc";
  59        }
  60
  61        return xopen(*default_rtc, flags);
  62}
  63
  64time_t FAST_FUNC rtc_read_time(int fd, int utc)
  65{
  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}
  91