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>.
This commit is contained in:
Kay Sievers
2011-07-21 20:28:27 +02:00
parent f68c5a7076
commit ff4daf5a34
4 changed files with 11 additions and 11 deletions
+4 -4
View File
@@ -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);
}
+2 -2
View File
@@ -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();
+4 -3
View File
@@ -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) {
+1 -2
View File
@@ -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);