summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@vrfy.org>2011-07-21 20:28:27 +0200
committerKay Sievers <kay.sievers@vrfy.org>2011-07-21 20:28:27 +0200
commitff4daf5a348278abed4dbf8afc3c4297b8cb9877 (patch)
treea9940950447c6ed8b4412d2bb4201df449d9fff1
parentf68c5a70762da0cbb6228d05a87254a7c6c46ba6 (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.c8
-rw-r--r--src/timedated.c4
-rw-r--r--src/util.c7
-rw-r--r--src/util.h3
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);