X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=util-linux%2Fhwclock.c;h=3d28364e99bb4cc65ab0ed391359327f56edc98b;hb=ea4f0847c3d765a782eb9afe3b0f9fb0659cd1bc;hp=867721482848de8b931c31b0a8f1fd95f171b84b;hpb=6ca409e0e4c198fe3081346eebbae3f068fe605a;p=oweals%2Fbusybox.git diff --git a/util-linux/hwclock.c b/util-linux/hwclock.c index 867721482..3d28364e9 100644 --- a/util-linux/hwclock.c +++ b/util-linux/hwclock.c @@ -8,24 +8,8 @@ */ #include -#include #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 +19,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 +82,6 @@ static void from_sys_clock(int utc) write_rtc(tv.tv_sec, utc); } -#ifdef CONFIG_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 @@ -171,8 +89,8 @@ static int check_utc(void) #define HWCLOCK_OPT_SYSTOHC 0x10 #define HWCLOCK_OPT_RTCFILE 0x20 -int hwclock_main(int argc, char **argv); -int hwclock_main(int argc, char **argv) +int hwclock_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int hwclock_main(int argc UNUSED_PARAM, char **argv) { unsigned opt; int utc; @@ -189,23 +107,21 @@ int hwclock_main(int argc, char **argv) applet_long_options = hwclock_longopts; #endif opt_complementary = "r--ws:w--rs:s--wr:l--u:u--l"; - opt = getopt32(argc, argv, "lurswf:", &rtcname); + opt = getopt32(argv, "lurswf:", &rtcname); /* 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; }