timedatectl: properly print 30 minutes DST transitions

This commit is contained in:
Kay Sievers 2012-11-11 16:55:25 +01:00
parent ef216ca3d7
commit 2311eb2ff0
3 changed files with 35 additions and 11 deletions

View File

@ -83,7 +83,7 @@ static inline int64_t decode64(const void *ptr) {
int time_get_dst(time_t date, const char *tzfile,
time_t *switch_cur, char **zone_cur, bool *dst_cur,
time_t *switch_next, char **zone_next, bool *dst_next) {
time_t *switch_next, int *delta_next, char **zone_next, bool *dst_next) {
time_t *transitions = NULL;
size_t num_transitions = 0;
unsigned char *type_idxs = 0;
@ -321,8 +321,11 @@ found:
*zone_cur = strdup(&zone_names[types[type_idxs[i - 1]].idx]);
if (dst_cur)
*dst_cur = types[type_idxs[i-1]].isdst;
if (switch_next)
*switch_next = transitions[i];
if (delta_next)
*delta_next = (types[type_idxs[i]].offset - types[type_idxs[i-1]].offset) / 60;
if (zone_next)
*zone_next = strdup(&zone_names[types[type_idxs[i]].idx]);
if (dst_next)

View File

@ -1,7 +1,6 @@
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
#ifndef footimedst
#define footimedst
#pragma once
/***
This file is part of systemd.
@ -24,6 +23,4 @@
int time_get_dst(time_t date, const char *tzfile,
time_t *switch_cur, char **zone_cur, bool *dst_cur,
time_t *switch_next, char **zone_next, bool *dst_next);
#endif
time_t *switch_next, int *delta_next, char **zone_next, bool *dst_next);

View File

@ -82,19 +82,43 @@ 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);
@ -135,7 +159,7 @@ static void print_status_info(StatusInfo *i) {
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 {
@ -149,10 +173,10 @@ static void print_status_info(StatusInfo *i) {
zero(tm);
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: %s → %s, DST became %s\n"
" %s\n"
" %s\n",
strna(zn), strna(zc), is_dstc ? "forward" : "backwards", a, b);
strna(zn), strna(zc), is_dstc ? "active" : "inactive", a, b);
t = tn - 1;
zero(tm);
@ -162,10 +186,10 @@ static void print_status_info(StatusInfo *i) {
zero(tm);
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: %s → %s, DST will become %s, the clock will jump %s\n"
" %s\n"
" %s\n",
strna(zc), strna(zn), is_dstn ? "forward" : "backwards", a, b);
strna(zc), strna(zn), is_dstn ? "active" : "inactive", jump_str(dn, s, sizeof(s)), a, b);
free(zc);
free(zn);