summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKay Sievers <kay@vrfy.org>2012-11-02 03:45:07 +0100
committerKay Sievers <kay@vrfy.org>2012-11-02 03:45:07 +0100
commitf18ca9dcdeda247e208f7143e834fd2fb2070d80 (patch)
treef5cbc6e2c5f717decc7aad4ad10a15b1169f44ac
parentb7f1542c8be4f02b2c3673f0e08a0749c6e145b5 (diff)
timedatectl: explain everything nobody wants to know about DST
-rw-r--r--src/timedate/timedatectl.c64
1 files changed, 55 insertions, 9 deletions
diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c
index 469a65e635..b7f2422a16 100644
--- a/src/timedate/timedatectl.c
+++ b/src/timedate/timedatectl.c
@@ -33,6 +33,7 @@
#include "hwclock.h"
#include "strv.h"
#include "pager.h"
+#include "time-dst.h"
static bool arg_adjust_system_clock = false;
static bool arg_no_pager = false;
@@ -83,9 +84,13 @@ static bool ntp_synced(void) {
static void print_status_info(StatusInfo *i) {
usec_t n;
+ char a[FORMAT_TIMESTAMP_MAX];
char b[FORMAT_TIMESTAMP_MAX];
struct tm tm;
time_t sec;
+ char *zc, *zn;
+ time_t t, tc, tn;
+ bool is_dstc, is_dstn;
int r;
assert(i);
@@ -94,14 +99,14 @@ static void print_status_info(StatusInfo *i) {
sec = (time_t) (n / USEC_PER_SEC);
zero(tm);
- assert_se(strftime(b, sizeof(b), "%a, %Y-%m-%d %H:%M:%S %Z", localtime_r(&sec, &tm)) > 0);
- char_array_0(b);
- printf(" Local time: %s\n", b);
+ 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(b, sizeof(b), "%a, %Y-%m-%d %H:%M:%S UTC", gmtime_r(&sec, &tm)) > 0);
- char_array_0(b);
- printf(" Universal time: %s\n", b);
+ 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);
zero(tm);
r = hwclock_get_time(&tm);
@@ -109,20 +114,61 @@ static void print_status_info(StatusInfo *i) {
/* Calculcate the week-day */
mktime(&tm);
- assert_se(strftime(b, sizeof(b), "%a, %Y-%m-%d %H:%M:%S", &tm) > 0);
- char_array_0(b);
- printf(" RTC time: %s\n", b);
+ 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);
+ char_array_0(a);
printf(" Timezone: %s\n"
+ " UTC offset: %s\n"
" NTP enabled: %s\n"
"NTP synchronized: %s\n"
" RTC in local TZ: %s\n",
strna(i->timezone),
+ a,
yes_no(i->ntp),
yes_no(ntp_synced()),
yes_no(i->local_rtc));
+ r = time_get_dst(sec, "/etc/localtime",
+ &tc, &zc, &is_dstc,
+ &tn, &zn, &is_dstn);
+ if (r >= 0) {
+ printf(" DST active: %s\n", yes_no(is_dstc));
+
+ t = tc - 1;
+ zero(tm);
+ 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);
+ char_array_0(b);
+ printf(" Last DST change: %s → %s, one hour %s\n"
+ " %s\n"
+ " %s\n",
+ strna(zn), strna(zc), is_dstc ? "forward" : "backwards", 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);
+ 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);
+ char_array_0(b);
+ printf(" Next DST change: %s → %s, one hour %s\n"
+ " %s\n"
+ " %s\n",
+ strna(zc), strna(zn), is_dstn ? "forward" : "backwards", a, b);
+
+ free(zc);
+ free(zn);
+ }
+
if (i->local_rtc)
fputs("\n" ANSI_HIGHLIGHT_ON
"Warning: The RTC is configured to maintain time in the local time zone. This\n"