chiark / gitweb /
timedatectl: work with old timedated
authorShawn Landden <shawn@churchofgit.com>
Thu, 12 Dec 2013 18:00:03 +0000 (10:00 -0800)
committerLennart Poettering <lennart@poettering.net>
Thu, 12 Dec 2013 19:00:45 +0000 (20:00 +0100)
Which does have TimeUSec. Should we specifically check for this method
instead of assuming time=0 means it doesn't exist?

Before:
shawn@debian-T61:~/git/systemd$ ./timedatectl
      Local time: Wed 1969-12-31 16:00:00 PST
  Universal time: Thu 1970-01-01 00:00:00 UTC
        RTC time: n/a
        Timezone: America/Los_Angeles (PST, -0800)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: no
      DST active: no
 Last DST change: DST ended at
                  Sun 1969-10-26 01:59:59 PDT
                  Sun 1969-10-26 01:00:00 PST
 Next DST change: DST begins (the clock jumps one hour forward) at
                  Sun 1970-04-26 01:59:59 PST
                  Sun 1970-04-26 03:00:00 PDT

After:
shawn@debian-T61:~/git/systemd$ ./timedatectl
      Local time: Wed 2013-12-11 14:03:21 PST
  Universal time: Wed 2013-12-11 22:03:21 UTC
        RTC time: n/a
        Timezone: America/Los_Angeles (PST, -0800)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: no
      DST active: no
 Last DST change: DST ended at
                  Sun 2013-11-03 01:59:59 PDT
                  Sun 2013-11-03 01:00:00 PST
 Next DST change: DST begins (the clock jumps one hour forward) at
                  Sun 2014-03-09 01:59:59 PST
                  Sun 2014-03-09 03:00:00 PDT

src/timedate/timedatectl.c

index 9b81513c75456664b2749c5898318b2a54e470d5..2c24b78458b367da5c0318f88be2c04129d108e7 100644 (file)
@@ -98,6 +98,7 @@ static void print_status_info(const StatusInfo *i) {
         char s[32];
         struct tm tm;
         time_t sec;
+        bool have_time = false;
         char *zc, *zn;
         time_t t, tc, tn;
         int dn;
@@ -112,17 +113,29 @@ static void print_status_info(const StatusInfo *i) {
                 unsetenv("TZ");
         }
 
-        sec = (time_t) (i->time / USEC_PER_SEC);
+        if (i->time != 0) {
+                sec = (time_t) (i->time / USEC_PER_SEC);
+                have_time = true;
+        } else if (arg_transport == BUS_TRANSPORT_LOCAL) {
+                sec = time(NULL);
+                have_time = true;
+        } else
+                fprintf(stderr, "Warning: could not get time from timedated and not operating locally.\n\n");
 
-        zero(tm);
-        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);
+        if (have_time) {
+                zero(tm);
+                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);
-        char_array_0(a);
-        printf("  Universal 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);
+                char_array_0(a);
+                printf("  Universal time: %s\n", a);
+        } else {
+                printf("      Local time: %s\n", "n/a");
+                printf("  Universal time: %s\n", "n/a");
+        }
 
         if (i->rtc_time > 0) {
                 time_t rtc_sec;
@@ -133,7 +146,7 @@ static void print_status_info(const StatusInfo *i) {
                 char_array_0(a);
                 printf("        RTC time: %s\n", a);
         } else
-                printf("        RTC time: n/a\n");
+                printf("        RTC time: %s\n", "n/a");
 
         zero(tm);
         assert_se(strftime(a, sizeof(a), "%Z, %z", localtime_r(&sec, &tm)) > 0);
@@ -151,8 +164,8 @@ static void print_status_info(const StatusInfo *i) {
                          &tc, &zc, &is_dstc,
                          &tn, &dn, &zn, &is_dstn);
         if (r < 0)
-                printf("      DST active: n/a\n");
-        else {
+                printf("      DST active: %s\n", "n/a");
+        else if (have_time) {
                 printf("      DST active: %s\n", yes_no(is_dstc));
 
                 t = tc - 1;
@@ -183,7 +196,8 @@ static void print_status_info(const StatusInfo *i) {
 
                 free(zc);
                 free(zn);
-        }
+        } else
+                printf("      DST active: %s\n", yes_no(is_dstc));
 
         if (i->rtc_local)
                 fputs("\n" ANSI_HIGHLIGHT_ON