From 8a50b96f81753cf35ca8dc8de135a81bd8111ec9 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 29 May 2018 12:36:40 +0200 Subject: [PATCH 1/2] timedated: show the short timezone name when changing timezones in logs --- src/timedate/timedated.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index e066320cff..b7a2091062 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -552,14 +552,17 @@ static int method_set_timezone(sd_bus_message *m, void *userdata, sd_bus_error * return sd_bus_error_set_errnof(error, r, "Failed to set time zone: %m"); } - /* 2. Tell the kernel our timezone */ + /* 2. Make glibc notice the new timezone */ + tzset(); + + /* 3. Tell the kernel our timezone */ clock_set_timezone(NULL); if (c->local_rtc) { struct timespec ts; struct tm *tm; - /* 3. Sync RTC from system clock, with the new delta */ + /* 4. Sync RTC from system clock, with the new delta */ assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0); assert_se(tm = localtime(&ts.tv_sec)); clock_set_hwclock(tm); @@ -568,7 +571,9 @@ static int method_set_timezone(sd_bus_message *m, void *userdata, sd_bus_error * log_struct(LOG_INFO, "MESSAGE_ID=" SD_MESSAGE_TIMEZONE_CHANGE_STR, "TIMEZONE=%s", c->zone, - LOG_MESSAGE("Changed time zone to '%s'.", c->zone), + "TIMEZONE_SHORTNAME=%s", tzname[daylight], + "DAYLIGHT=%i", daylight, + LOG_MESSAGE("Changed time zone to '%s' (%s).", c->zone, tzname[daylight]), NULL); (void) sd_bus_emit_properties_changed(sd_bus_message_get_bus(m), "/org/freedesktop/timedate1", "org.freedesktop.timedate1", "Timezone", NULL); From 2a7ff45f09c983000d5ffd3869064e1f81a43669 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 29 May 2018 12:39:16 +0200 Subject: [PATCH 2/2] timedated: add some debug logging when a number of kernel calls fail --- src/timedate/timedated.c | 42 +++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index b7a2091062..d504f7c6f9 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -556,7 +556,9 @@ static int method_set_timezone(sd_bus_message *m, void *userdata, sd_bus_error * tzset(); /* 3. Tell the kernel our timezone */ - clock_set_timezone(NULL); + r = clock_set_timezone(NULL); + if (r < 0) + log_debug_errno(r, "Failed to tell kernel about timezone, ignoring: %m"); if (c->local_rtc) { struct timespec ts; @@ -565,7 +567,10 @@ static int method_set_timezone(sd_bus_message *m, void *userdata, sd_bus_error * /* 4. Sync RTC from system clock, with the new delta */ assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0); assert_se(tm = localtime(&ts.tv_sec)); - clock_set_hwclock(tm); + + r = clock_set_hwclock(tm); + if (r < 0) + log_debug_errno(r, "Failed to sync time to hardware clock, ignoring: %m"); } log_struct(LOG_INFO, @@ -621,7 +626,9 @@ static int method_set_local_rtc(sd_bus_message *m, void *userdata, sd_bus_error } /* 2. Tell the kernel our timezone */ - clock_set_timezone(NULL); + r = clock_set_timezone(NULL); + if (r < 0) + log_debug_errno(r, "Failed to tell kernel about timezone, ignoring: %m"); /* 3. Synchronize clocks */ assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0); @@ -629,27 +636,25 @@ static int method_set_local_rtc(sd_bus_message *m, void *userdata, sd_bus_error if (fix_system) { struct tm tm; - /* Sync system clock from RTC; first, - * initialize the timezone fields of - * struct tm. */ + /* Sync system clock from RTC; first, initialize the timezone fields of struct tm. */ if (c->local_rtc) tm = *localtime(&ts.tv_sec); else tm = *gmtime(&ts.tv_sec); - /* Override the main fields of - * struct tm, but not the timezone - * fields */ - if (clock_get_hwclock(&tm) >= 0) { - - /* And set the system clock - * with this */ + /* Override the main fields of struct tm, but not the timezone fields */ + r = clock_get_hwclock(&tm); + if (r < 0) + log_debug_errno(r, "Failed to get hardware clock, ignoring: %m"); + else { + /* And set the system clock with this */ if (c->local_rtc) ts.tv_sec = mktime(&tm); else ts.tv_sec = timegm(&tm); - clock_settime(CLOCK_REALTIME, &ts); + if (clock_settime(CLOCK_REALTIME, &ts) < 0) + log_debug_errno(errno, "Failed to update system clock, ignoring: %m"); } } else { @@ -661,7 +666,9 @@ static int method_set_local_rtc(sd_bus_message *m, void *userdata, sd_bus_error else tm = gmtime(&ts.tv_sec); - clock_set_hwclock(tm); + r = clock_set_hwclock(tm); + if (r < 0) + log_debug_errno(r, "Failed to sync time to hardware clock, ignoring: %m"); } log_info("RTC configured to %s time.", c->local_rtc ? "local" : "UTC"); @@ -750,7 +757,10 @@ static int method_set_time(sd_bus_message *m, void *userdata, sd_bus_error *erro tm = localtime(&ts.tv_sec); else tm = gmtime(&ts.tv_sec); - clock_set_hwclock(tm); + + r = clock_set_hwclock(tm); + if (r < 0) + log_debug_errno(r, "Failed to update hardware clock, ignoring: %m"); log_struct(LOG_INFO, "MESSAGE_ID=" SD_MESSAGE_TIME_CHANGE_STR,