#include <stdbool.h>
#include <unistd.h>
#include <getopt.h>
+#include <locale.h>
#include <string.h>
#include <sys/timex.h>
if (arg_no_pager)
return;
- pager_open();
+ pager_open(false);
}
static void polkit_agent_open_if_enabled(void) {
const char *timezone;
bool local_rtc;
bool ntp;
+ bool can_ntp;
} StatusInfo;
static bool ntp_synced(void) {
return true;
}
+static const char *jump_str(int delta_minutes, char *s, size_t size) {
+ if (delta_minutes == 60)
+ return "one hour forward";
+ if (delta_minutes == -60)
+ return "one hour backwards";
+ if (delta_minutes < 0) {
+ snprintf(s, size, "%i minutes backwards", -delta_minutes);
+ return s;
+ }
+ if (delta_minutes > 0) {
+ snprintf(s, size, "%i minutes forward", delta_minutes);
+ return s;
+ }
+ return "";
+}
+
static void print_status_info(StatusInfo *i) {
usec_t n;
char a[FORMAT_TIMESTAMP_MAX];
char b[FORMAT_TIMESTAMP_MAX];
+ char s[32];
struct tm tm;
time_t sec;
char *zc, *zn;
time_t t, tc, tn;
+ int dn;
bool is_dstc, is_dstn;
int r;
assert(i);
+ /* enforce the values of /etc/localtime */
+ if (getenv("TZ")) {
+ fprintf(stderr, "Warning: ignoring the TZ variable, reading the system's timezone setting only.\n\n");
+ unsetenv("TZ");
+ }
+
n = now(CLOCK_REALTIME);
sec = (time_t) (n / USEC_PER_SEC);
zero(tm);
- assert_se(strftime(a, sizeof(a), "%a, %Y-%m-%d %H:%M:%S %Z", localtime_r(&sec, &tm)) > 0);
+ assert_se(strftime(a, sizeof(a), "%a %Y-%m-%d %H:%M:%S %Z", localtime_r(&sec, &tm)) > 0);
char_array_0(a);
printf(" Local time: %s\n", a);
zero(tm);
- assert_se(strftime(a, sizeof(a), "%a, %Y-%m-%d %H:%M:%S UTC", gmtime_r(&sec, &tm)) > 0);
+ assert_se(strftime(a, sizeof(a), "%a %Y-%m-%d %H:%M:%S UTC", gmtime_r(&sec, &tm)) > 0);
char_array_0(a);
printf(" Universal time: %s\n", a);
/* Calculcate the week-day */
mktime(&tm);
- assert_se(strftime(a, sizeof(a), "%a, %Y-%m-%d %H:%M:%S", &tm) > 0);
+ assert_se(strftime(a, sizeof(a), "%a %Y-%m-%d %H:%M:%S", &tm) > 0);
char_array_0(a);
printf(" RTC time: %s\n", a);
}
zero(tm);
- assert_se(strftime(a, sizeof(a), "%z", localtime_r(&sec, &tm)) > 0);
+ assert_se(strftime(a, sizeof(a), "%Z, %z", localtime_r(&sec, &tm)) > 0);
char_array_0(a);
- printf(" Timezone: %s\n"
- " UTC offset: %s\n"
+ printf(" Timezone: %s (%s)\n"
" NTP enabled: %s\n"
"NTP synchronized: %s\n"
" RTC in local TZ: %s\n",
strna(i->timezone),
a,
- yes_no(i->ntp),
+ i->can_ntp ? yes_no(i->ntp) : "n/a",
yes_no(ntp_synced()),
yes_no(i->local_rtc));
r = time_get_dst(sec, "/etc/localtime",
&tc, &zc, &is_dstc,
- &tn, &zn, &is_dstn);
+ &tn, &dn, &zn, &is_dstn);
if (r < 0)
printf(" DST active: n/a\n");
else {
t = tc - 1;
zero(tm);
- assert_se(strftime(a, sizeof(a), "%a, %Y-%m-%d %H:%M:%S %Z", localtime_r(&t, &tm)) > 0);
+ assert_se(strftime(a, sizeof(a), "%a %Y-%m-%d %H:%M:%S %Z", localtime_r(&t, &tm)) > 0);
char_array_0(a);
zero(tm);
- assert_se(strftime(b, sizeof(b), "%a, %Y-%m-%d %H:%M:%S %Z", localtime_r(&tc, &tm)) > 0);
+ assert_se(strftime(b, sizeof(b), "%a %Y-%m-%d %H:%M:%S %Z", localtime_r(&tc, &tm)) > 0);
char_array_0(b);
- printf(" Last DST change: %s → %s, one hour %s\n"
+ printf(" Last DST change: DST %s at\n"
" %s\n"
" %s\n",
- strna(zn), strna(zc), is_dstc ? "forward" : "backwards", a, b);
+ is_dstc ? "began" : "ended", a, b);
t = tn - 1;
zero(tm);
- assert_se(strftime(a, sizeof(a), "%a, %Y-%m-%d %H:%M:%S %Z", localtime_r(&t, &tm)) > 0);
+ assert_se(strftime(a, sizeof(a), "%a %Y-%m-%d %H:%M:%S %Z", localtime_r(&t, &tm)) > 0);
char_array_0(a);
zero(tm);
- assert_se(strftime(b, sizeof(b), "%a, %Y-%m-%d %H:%M:%S %Z", localtime_r(&tn, &tm)) > 0);
+ assert_se(strftime(b, sizeof(b), "%a %Y-%m-%d %H:%M:%S %Z", localtime_r(&tn, &tm)) > 0);
char_array_0(b);
- printf(" Next DST change: %s → %s, one hour %s\n"
+ printf(" Next DST change: DST %s (the clock jumps %s) at\n"
" %s\n"
" %s\n",
- strna(zc), strna(zn), is_dstn ? "forward" : "backwards", a, b);
+ is_dstn ? "begins" : "ends", jump_str(dn, s, sizeof(s)), a, b);
free(zc);
free(zn);
i->local_rtc = b;
else if (streq(name, "NTP"))
i->ntp = b;
+ else if (streq(name, "CanNTP"))
+ i->can_ntp = b;
}
}
_cleanup_fclose_ FILE *f = NULL;
_cleanup_strv_free_ char **zones = NULL;
size_t n_zones = 0;
- char **i;
assert(args);
assert(n == 1);
pager_open_if_enabled();
strv_sort(zones);
- STRV_FOREACH(i, zones)
- puts(*i);
+ strv_print(zones);
return 0;
}
case ARG_VERSION:
puts(PACKAGE_STRING);
- puts(DISTRIBUTION);
puts(SYSTEMD_FEATURES);
return 0;
dbus_error_init(&error);
+ setlocale(LC_ALL, "");
log_parse_environment();
log_open();