diff options
author | Lennart Poettering <lennart@poettering.net> | 2015-04-02 12:15:53 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-04-02 12:17:41 +0200 |
commit | d95a74ed1191bb09f5be57b0619d3d77708e019d (patch) | |
tree | 52a09c606e810b4925d77e8d338c9400531b6ae2 /src/timedate | |
parent | c4f54721175bde35e2051d61d3d23285def9619d (diff) |
timedatectl: many fixes
- 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.
Diffstat (limited to 'src/timedate')
-rw-r--r-- | src/timedate/timedatectl.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c index 1d10c195c4..89913cc4ed 100644 --- a/src/timedate/timedatectl.c +++ b/src/timedate/timedatectl.c @@ -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" |