mirror of
https://github.com/clearlinux/systemd-stable.git
synced 2026-10-04 07:48:36 +00:00
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:
+4
-4
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user