diff options
Diffstat (limited to 'util-linux/hwclock.c')
-rw-r--r-- | util-linux/hwclock.c | 115 |
1 files changed, 16 insertions, 99 deletions
diff --git a/util-linux/hwclock.c b/util-linux/hwclock.c index f91379b..b581d26 100644 --- a/util-linux/hwclock.c +++ b/util-linux/hwclock.c @@ -10,22 +10,7 @@ #include <sys/utsname.h> #include <getopt.h> #include "libbb.h" - -/* Copied from linux/rtc.h to eliminate the kernel dependency */ -struct linux_rtc_time { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; -}; - -#define RTC_SET_TIME _IOW('p', 0x0a, struct linux_rtc_time) /* Set RTC time */ -#define RTC_RD_TIME _IOR('p', 0x09, struct linux_rtc_time) /* Read RTC time */ +#include "rtc_.h" #if ENABLE_FEATURE_HWCLOCK_LONG_OPTIONS # ifndef _GNU_SOURCE @@ -35,56 +20,22 @@ struct linux_rtc_time { static const char *rtcname; -static int xopen_rtc(int flags) -{ - int rtc; - - if (!rtcname) { - rtc = open("/dev/rtc", flags); - if (rtc >= 0) - return rtc; - rtc = open("/dev/rtc0", flags); - if (rtc >= 0) - return rtc; - rtcname = "/dev/misc/rtc"; - } - return xopen(rtcname, flags); -} - static time_t read_rtc(int utc) { - struct tm tm; - char *oldtz = 0; - time_t t = 0; - int rtc = xopen_rtc(O_RDONLY); + time_t ret; + int fd; - memset(&tm, 0, sizeof(struct tm)); - xioctl(rtc, RTC_RD_TIME, &tm); - tm.tm_isdst = -1; /* not known */ + fd = rtc_xopen(rtcname, O_RDONLY); + ret = rtc_read_time(fd, utc); + close(fd); - close(rtc); - - 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; + return ret; } static void write_rtc(time_t t, int utc) { struct tm tm; - int rtc = xopen_rtc(O_WRONLY); + int rtc = rtc_xopen(rtcname, O_WRONLY); tm = *(utc ? gmtime(&t) : localtime(&t)); tm.tm_isdst = 0; @@ -132,38 +83,6 @@ static void from_sys_clock(int utc) write_rtc(tv.tv_sec, utc); } -#if ENABLE_FEATURE_HWCLOCK_ADJTIME_FHS -# define ADJTIME_PATH "/var/lib/hwclock/adjtime" -#else -# define ADJTIME_PATH "/etc/adjtime" -#endif -static int check_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; -} - #define HWCLOCK_OPT_LOCALTIME 0x01 #define HWCLOCK_OPT_UTC 0x02 #define HWCLOCK_OPT_SHOW 0x04 @@ -193,19 +112,17 @@ int hwclock_main(int argc, char **argv) /* If -u or -l wasn't given check if we are using utc */ if (opt & (HWCLOCK_OPT_UTC | HWCLOCK_OPT_LOCALTIME)) - utc = opt & HWCLOCK_OPT_UTC; + utc = (opt & HWCLOCK_OPT_UTC); else - utc = check_utc(); + utc = rtc_adjtime_is_utc(); - if (opt & HWCLOCK_OPT_HCTOSYS) { + if (opt & HWCLOCK_OPT_HCTOSYS) to_sys_clock(utc); - return 0; - } - if (opt & HWCLOCK_OPT_SYSTOHC) { + else if (opt & HWCLOCK_OPT_SYSTOHC) from_sys_clock(utc); - return 0; - } - /* default HWCLOCK_OPT_SHOW */ - show_clock(utc); + else + /* default HWCLOCK_OPT_SHOW */ + show_clock(utc); + return 0; } |