chiark / gitweb /
timedatectl: many fixes
authorLennart Poettering <lennart@poettering.net>
Thu, 2 Apr 2015 10:15:53 +0000 (12:15 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 2 Apr 2015 10:17:41 +0000 (12:17 +0200)
- print runtime warnings with log_warning()

- save and restore $TZ properly

- Get rid of exit() pseudo error handling

- Using time() is OK when connecting to a local container or when
  showing data about local host, but certainly not for remote hosts.

src/timedate/timedatectl.c

index 1d10c19..89913cc 100644 (file)
@@ -77,31 +77,30 @@ static void print_status_info(const StatusInfo *i) {
         struct tm tm;
         time_t sec;
         bool have_time = false;
+        const char *old_tz = NULL, *tz;
         int r;
 
         assert(i);
 
-        /* Enforce the values of /etc/localtime */
-        if (getenv("TZ")) {
-                fprintf(stderr, "Warning: Ignoring the TZ variable.\n\n");
-                unsetenv("TZ");
-        }
+        /* Save the old $TZ */
+        tz = getenv("TZ");
+        if (tz)
+                old_tz = strdupa(tz);
 
-        r = setenv("TZ", i->timezone, false);
-        if (r < 0) {
-                log_error_errno(errno, "Failed to set TZ environment variable: %m");
-                exit(EXIT_FAILURE);
-        }
-        tzset();
+        /* Set the new $TZ */
+        if (setenv("TZ", i->timezone, true) < 0)
+                log_warning_errno(errno, "Failed to set TZ environment variable, ignoring: %m");
+        else
+                tzset();
 
         if (i->time != 0) {
                 sec = (time_t) (i->time / USEC_PER_SEC);
                 have_time = true;
-        } else if (IN_SET(arg_transport, BUS_TRANSPORT_REMOTE, BUS_TRANSPORT_MACHINE)) {
+        } else if (IN_SET(arg_transport, BUS_TRANSPORT_LOCAL, BUS_TRANSPORT_MACHINE)) {
                 sec = time(NULL);
                 have_time = true;
         } else
-                fprintf(stderr, "Warning: Could not get time from timedated and not operating locally.\n\n");
+                log_warning("Could not get time from timedated and not operating locally, ignoring.");
 
         if (have_time) {
                 xstrftime(a, "%a %Y-%m-%d %H:%M:%S %Z", localtime_r(&sec, &tm));
@@ -117,7 +116,7 @@ static void print_status_info(const StatusInfo *i) {
         if (i->rtc_time > 0) {
                 time_t rtc_sec;
 
-                rtc_sec = (time_t)(i->rtc_time / USEC_PER_SEC);
+                rtc_sec = (time_t) (i->rtc_time / USEC_PER_SEC);
                 xstrftime(a, "%a %Y-%m-%d %H:%M:%S", gmtime_r(&rtc_sec, &tm));
                 printf("        RTC time: %.*s\n", (int) sizeof(a), a);
         } else
@@ -126,6 +125,16 @@ static void print_status_info(const StatusInfo *i) {
         if (have_time)
                 xstrftime(a, "%Z, %z", localtime_r(&sec, &tm));
 
+        /* Restore the $TZ */
+        if (old_tz)
+                r = setenv("TZ", old_tz, true);
+        else
+                r = unsetenv("TZ");
+        if (r < 0)
+                log_warning_errno(errno, "Failed to set TZ environment variable, ignoring: %m");
+        else
+                tzset();
+
         printf("       Time zone: %s (%.*s)\n"
                "     NTP enabled: %s\n"
                "NTP synchronized: %s\n"