diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2011-07-21 20:28:27 +0200 |
---|---|---|
committer | Kay Sievers <kay.sievers@vrfy.org> | 2011-07-21 20:28:27 +0200 |
commit | ff4daf5a348278abed4dbf8afc3c4297b8cb9877 (patch) | |
tree | a9940950447c6ed8b4412d2bb4201df449d9fff1 | |
parent | f68c5a70762da0cbb6228d05a87254a7c6c46ba6 (diff) |
fix hwclock_apply_localtime_delta() to properly handle negative TZ offset
Localtime may be a negative number, i.e. GMT-7. Fix based on a
patch from Kelly Anderson <kelly@silka.with-linux.com>.
-rw-r--r-- | src/main.c | 8 | ||||
-rw-r--r-- | src/timedated.c | 4 | ||||
-rw-r--r-- | src/util.c | 7 | ||||
-rw-r--r-- | src/util.h | 3 |
4 files changed, 11 insertions, 11 deletions
diff --git a/src/main.c b/src/main.c index 0bcd09c4cf..0a99e5a916 100644 --- a/src/main.c +++ b/src/main.c @@ -1056,11 +1056,11 @@ int main(int argc, char *argv[]) { goto finish; if (hwclock_is_localtime() > 0) { - int min; + int err, min; - min = hwclock_apply_localtime_delta(); - if (min < 0) - log_error("Failed to apply local time delta: %s", strerror(-min)); + err = hwclock_apply_localtime_delta(&min); + if (err < 0) + log_error("Failed to apply local time delta: %s", strerror(-err)); else log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min); } diff --git a/src/timedated.c b/src/timedated.c index 55cc904f0c..4abcf1af73 100644 --- a/src/timedated.c +++ b/src/timedated.c @@ -332,7 +332,7 @@ static DBusHandlerResult timedate_message_handler( struct tm *tm; /* 2. Teach kernel new timezone */ - hwclock_apply_localtime_delta(); + hwclock_apply_localtime_delta(NULL); /* 3. Sync RTC from system clock, with the new delta */ assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0); @@ -382,7 +382,7 @@ static DBusHandlerResult timedate_message_handler( /* 2. Teach kernel new timezone */ if (local_rtc) - hwclock_apply_localtime_delta(); + hwclock_apply_localtime_delta(NULL); else hwclock_reset_localtime_delta(); diff --git a/src/util.c b/src/util.c index a0fbdc517e..3187ec3768 100644 --- a/src/util.c +++ b/src/util.c @@ -4905,7 +4905,7 @@ int hwclock_is_localtime(void) { return local; } -int hwclock_apply_localtime_delta(void) { +int hwclock_apply_localtime_delta(int *min) { const struct timeval *tv_null = NULL; struct timespec ts; struct tm *tm; @@ -4926,8 +4926,9 @@ int hwclock_apply_localtime_delta(void) { */ if (settimeofday(tv_null, &tz) < 0) return -errno; - - return minuteswest; + if (min) + *min = minuteswest; + return 0; } int hwclock_reset_localtime_delta(void) { diff --git a/src/util.h b/src/util.h index b8bbd23e8c..7a4bf81c8d 100644 --- a/src/util.h +++ b/src/util.h @@ -434,8 +434,7 @@ int fchmod_umask(int fd, mode_t mode); int conf_files_list(char ***strv, const char *suffix, const char *dir, ...); int hwclock_is_localtime(void); - -int hwclock_apply_localtime_delta(void); +int hwclock_apply_localtime_delta(int *min); int hwclock_reset_localtime_delta(void); int hwclock_get_time(struct tm *tm); int hwclock_set_time(const struct tm *tm); |