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                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