]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/timedate/timedated.c
tree-wide: remove Lennart's copyright lines
[thirdparty/systemd.git] / src / timedate / timedated.c
index e066320cffe4ade13fa2d8014fa6fe9bab893580..82eb213e9551926bfd4acf868dff8e700d830966 100644 (file)
@@ -1,9 +1,4 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
-/***
-  This file is part of systemd.
-
-  Copyright 2011 Lennart Poettering
-***/
 
 #include <errno.h>
 #include <string.h>
@@ -552,24 +547,33 @@ 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 */
-        clock_set_timezone(NULL);
+        /* 2. Make glibc notice the new timezone */
+        tzset();
+
+        /* 3. Tell the kernel our timezone */
+        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;
                 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);
+
+                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,
                    "MESSAGE_ID=" SD_MESSAGE_TIMEZONE_CHANGE_STR,
                    "TIMEZONE=%s", c->zone,
-                   LOG_MESSAGE("Changed time zone to '%s'.", c->zone),
-                   NULL);
+                   "TIMEZONE_SHORTNAME=%s", tzname[daylight],
+                   "DAYLIGHT=%i", daylight,
+                   LOG_MESSAGE("Changed time zone to '%s' (%s).", c->zone, tzname[daylight]));
 
         (void) sd_bus_emit_properties_changed(sd_bus_message_get_bus(m), "/org/freedesktop/timedate1", "org.freedesktop.timedate1", "Timezone", NULL);
 
@@ -616,7 +620,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);
@@ -624,27 +630,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 {
@@ -656,7 +660,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");
@@ -745,13 +751,15 @@ 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,
                    "REALTIME="USEC_FMT, timespec_load(&ts),
-                   LOG_MESSAGE("Changed local time to %s", ctime(&ts.tv_sec)),
-                   NULL);
+                   LOG_MESSAGE("Changed local time to %s", ctime(&ts.tv_sec)));
 
         return sd_bus_reply_method_return(m, NULL);
 }