From: Kay Sievers Date: Thu, 21 Jul 2011 18:28:27 +0000 (+0200) Subject: fix hwclock_apply_localtime_delta() to properly handle negative TZ offset X-Git-Tag: v31~38 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=ff4daf5a348278abed4dbf8afc3c4297b8cb9877 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 . --- diff --git a/src/main.c b/src/main.c index 0bcd09c4c..0a99e5a91 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 55cc904f0..4abcf1af7 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 a0fbdc517..3187ec376 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 b8bbd23e8..7a4bf81c8 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);