Zbigniew Jędrzejewski-Szmek 35bb94
From b3e823e43c45b6233405d62e5f095c11130e638f Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 35bb94
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Zbigniew Jędrzejewski-Szmek 35bb94
Date: Wed, 18 Oct 2017 16:15:09 +0200
Zbigniew Jędrzejewski-Szmek 35bb94
Subject: [PATCH] timedatectl: stop using xstrftime
Zbigniew Jędrzejewski-Szmek 35bb94
MIME-Version: 1.0
Zbigniew Jędrzejewski-Szmek 35bb94
Content-Type: text/plain; charset=UTF-8
Zbigniew Jędrzejewski-Szmek 35bb94
Content-Transfer-Encoding: 8bit
Zbigniew Jędrzejewski-Szmek 35bb94
Zbigniew Jędrzejewski-Szmek 35bb94
When using strftime in arbitrary locales, we cannot really say how big the
Zbigniew Jędrzejewski-Szmek 35bb94
buffer should be. Let's make the buffer "large", which will work fine pretty
Zbigniew Jędrzejewski-Szmek 35bb94
much always, and just print n/a if the timestamp does not fit. strftime returns
Zbigniew Jędrzejewski-Szmek 35bb94
0 if the buffer is too small and a NUL-terminated string otherwise, so we
Zbigniew Jędrzejewski-Szmek 35bb94
can drop the size specifications in string formatting.
Zbigniew Jędrzejewski-Szmek 35bb94
Zbigniew Jędrzejewski-Szmek 35bb94
$ export LANG=fa_IR.UTF-8
Zbigniew Jędrzejewski-Szmek 35bb94
$ date
Zbigniew Jędrzejewski-Szmek 35bb94
چهارشنبه ۱۸ اكتبر ۱۷، ساعت ۱۰:۵۴:۲۴ (+0330)
Zbigniew Jędrzejewski-Szmek 35bb94
$ timedatectl
Zbigniew Jędrzejewski-Szmek 35bb94
Assertion 'xstrftime: a[] must be big enough' failed at ../src/timedate/timedatectl.c:105, function print_status_info(). Aborting.
Zbigniew Jędrzejewski-Szmek 35bb94
Zbigniew Jędrzejewski-Szmek 35bb94
now:
Zbigniew Jędrzejewski-Szmek 35bb94
Zbigniew Jędrzejewski-Szmek 35bb94
$ timedatectl
Zbigniew Jędrzejewski-Szmek 35bb94
        Local time: چهارشنبه 2017-10-18 16:29:40 CEST
Zbigniew Jędrzejewski-Szmek 35bb94
    Universal time: چهارشنبه 2017-10-18 14:29:40 UTC
Zbigniew Jędrzejewski-Szmek 35bb94
          RTC time: چهارشنبه 2017-10-18 14:29:40
Zbigniew Jędrzejewski-Szmek 35bb94
Zbigniew Jędrzejewski-Szmek 35bb94
Zbigniew Jędrzejewski-Szmek 35bb94
https://bugzilla.redhat.com/show_bug.cgi?id=1503452
Zbigniew Jędrzejewski-Szmek 35bb94
(cherry picked from commit 14ce0c25c28ba58e80084e28b4f23884199900e4)
Zbigniew Jędrzejewski-Szmek 35bb94
---
Zbigniew Jędrzejewski-Szmek 35bb94
 src/basic/time-util.h      |  4 ----
Zbigniew Jędrzejewski-Szmek 35bb94
 src/timedate/timedatectl.c | 21 +++++++++++----------
Zbigniew Jędrzejewski-Szmek 35bb94
 2 files changed, 11 insertions(+), 14 deletions(-)
Zbigniew Jędrzejewski-Szmek 35bb94
Zbigniew Jędrzejewski-Szmek 35bb94
diff --git a/src/basic/time-util.h b/src/basic/time-util.h
Zbigniew Jędrzejewski-Szmek 35bb94
index 3b7f0e99c0..73f7e40066 100644
Zbigniew Jędrzejewski-Szmek 35bb94
--- a/src/basic/time-util.h
Zbigniew Jędrzejewski-Szmek 35bb94
+++ b/src/basic/time-util.h
Zbigniew Jędrzejewski-Szmek 35bb94
@@ -148,10 +148,6 @@ clockid_t clock_boottime_or_monotonic(void);
Zbigniew Jędrzejewski-Szmek 35bb94
 
Zbigniew Jędrzejewski-Szmek 35bb94
 usec_t usec_shift_clock(usec_t, clockid_t from, clockid_t to);
Zbigniew Jędrzejewski-Szmek 35bb94
 
Zbigniew Jędrzejewski-Szmek 35bb94
-#define xstrftime(buf, fmt, tm) \
Zbigniew Jędrzejewski-Szmek 35bb94
-        assert_message_se(strftime(buf, ELEMENTSOF(buf), fmt, tm) > 0, \
Zbigniew Jędrzejewski-Szmek 35bb94
-                          "xstrftime: " #buf "[] must be big enough")
Zbigniew Jędrzejewski-Szmek 35bb94
-
Zbigniew Jędrzejewski-Szmek 35bb94
 int get_timezone(char **timezone);
Zbigniew Jędrzejewski-Szmek 35bb94
 
Zbigniew Jędrzejewski-Szmek 35bb94
 time_t mktime_or_timegm(struct tm *tm, bool utc);
Zbigniew Jędrzejewski-Szmek 35bb94
diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c
Zbigniew Jędrzejewski-Szmek 35bb94
index a30e783c09..716675aa1d 100644
Zbigniew Jędrzejewski-Szmek 35bb94
--- a/src/timedate/timedatectl.c
Zbigniew Jędrzejewski-Szmek 35bb94
+++ b/src/timedate/timedatectl.c
Zbigniew Jędrzejewski-Szmek 35bb94
@@ -72,12 +72,13 @@ static void status_info_clear(StatusInfo *info) {
Zbigniew Jędrzejewski-Szmek 35bb94
 }
Zbigniew Jędrzejewski-Szmek 35bb94
 
Zbigniew Jędrzejewski-Szmek 35bb94
 static void print_status_info(const StatusInfo *i) {
Zbigniew Jędrzejewski-Szmek 35bb94
-        char a[FORMAT_TIMESTAMP_MAX];
Zbigniew Jędrzejewski-Szmek 35bb94
+        char a[LINE_MAX];
Zbigniew Jędrzejewski-Szmek 35bb94
         struct tm tm;
Zbigniew Jędrzejewski-Szmek 35bb94
         time_t sec;
Zbigniew Jędrzejewski-Szmek 35bb94
         bool have_time = false;
Zbigniew Jędrzejewski-Szmek 35bb94
         const char *old_tz = NULL, *tz;
Zbigniew Jędrzejewski-Szmek 35bb94
         int r;
Zbigniew Jędrzejewski-Szmek 35bb94
+        size_t n;
Zbigniew Jędrzejewski-Szmek 35bb94
 
Zbigniew Jędrzejewski-Szmek 35bb94
         assert(i);
Zbigniew Jędrzejewski-Szmek 35bb94
 
Zbigniew Jędrzejewski-Szmek 35bb94
@@ -102,11 +103,11 @@ static void print_status_info(const StatusInfo *i) {
Zbigniew Jędrzejewski-Szmek 35bb94
                 log_warning("Could not get time from timedated and not operating locally, ignoring.");
Zbigniew Jędrzejewski-Szmek 35bb94
 
Zbigniew Jędrzejewski-Szmek 35bb94
         if (have_time) {
Zbigniew Jędrzejewski-Szmek 35bb94
-                xstrftime(a, "%a %Y-%m-%d %H:%M:%S %Z", localtime_r(&sec, &tm));
Zbigniew Jędrzejewski-Szmek 35bb94
-                printf("                      Local time: %.*s\n", (int) sizeof(a), a);
Zbigniew Jędrzejewski-Szmek 35bb94
+                n = strftime(a, sizeof a, "%a %Y-%m-%d %H:%M:%S %Z", localtime_r(&sec, &tm));
Zbigniew Jędrzejewski-Szmek 35bb94
+                printf("                      Local time: %s\n", n > 0 ? a : "n/a");
Zbigniew Jędrzejewski-Szmek 35bb94
 
Zbigniew Jędrzejewski-Szmek 35bb94
-                xstrftime(a, "%a %Y-%m-%d %H:%M:%S UTC", gmtime_r(&sec, &tm));
Zbigniew Jędrzejewski-Szmek 35bb94
-                printf("                  Universal time: %.*s\n", (int) sizeof(a), a);
Zbigniew Jędrzejewski-Szmek 35bb94
+                n = strftime(a, sizeof a, "%a %Y-%m-%d %H:%M:%S UTC", gmtime_r(&sec, &tm));
Zbigniew Jędrzejewski-Szmek 35bb94
+                printf("                  Universal time: %s\n", n > 0 ? a : "n/a");
Zbigniew Jędrzejewski-Szmek 35bb94
         } else {
Zbigniew Jędrzejewski-Szmek 35bb94
                 printf("                      Local time: %s\n", "n/a");
Zbigniew Jędrzejewski-Szmek 35bb94
                 printf("                  Universal time: %s\n", "n/a");
Zbigniew Jędrzejewski-Szmek 35bb94
@@ -116,13 +117,13 @@ static void print_status_info(const StatusInfo *i) {
Zbigniew Jędrzejewski-Szmek 35bb94
                 time_t rtc_sec;
Zbigniew Jędrzejewski-Szmek 35bb94
 
Zbigniew Jędrzejewski-Szmek 35bb94
                 rtc_sec = (time_t) (i->rtc_time / USEC_PER_SEC);
Zbigniew Jędrzejewski-Szmek 35bb94
-                xstrftime(a, "%a %Y-%m-%d %H:%M:%S", gmtime_r(&rtc_sec, &tm));
Zbigniew Jędrzejewski-Szmek 35bb94
-                printf("                        RTC time: %.*s\n", (int) sizeof(a), a);
Zbigniew Jędrzejewski-Szmek 35bb94
+                n = strftime(a, sizeof a, "%a %Y-%m-%d %H:%M:%S", gmtime_r(&rtc_sec, &tm));
Zbigniew Jędrzejewski-Szmek 35bb94
+                printf("                        RTC time: %s\n", n > 0 ? a : "n/a");
Zbigniew Jędrzejewski-Szmek 35bb94
         } else
Zbigniew Jędrzejewski-Szmek 35bb94
                 printf("                        RTC time: %s\n", "n/a");
Zbigniew Jędrzejewski-Szmek 35bb94
 
Zbigniew Jędrzejewski-Szmek 35bb94
         if (have_time)
Zbigniew Jędrzejewski-Szmek 35bb94
-                xstrftime(a, "%Z, %z", localtime_r(&sec, &tm));
Zbigniew Jędrzejewski-Szmek 35bb94
+                n = strftime(a, sizeof a, "%Z, %z", localtime_r(&sec, &tm));
Zbigniew Jędrzejewski-Szmek 35bb94
 
Zbigniew Jędrzejewski-Szmek 35bb94
         /* Restore the $TZ */
Zbigniew Jędrzejewski-Szmek 35bb94
         if (old_tz)
Zbigniew Jędrzejewski-Szmek 35bb94
@@ -134,11 +135,11 @@ static void print_status_info(const StatusInfo *i) {
Zbigniew Jędrzejewski-Szmek 35bb94
         else
Zbigniew Jędrzejewski-Szmek 35bb94
                 tzset();
Zbigniew Jędrzejewski-Szmek 35bb94
 
Zbigniew Jędrzejewski-Szmek 35bb94
-        printf("                       Time zone: %s (%.*s)\n"
Zbigniew Jędrzejewski-Szmek 35bb94
+        printf("                       Time zone: %s (%s)\n"
Zbigniew Jędrzejewski-Szmek 35bb94
                "       System clock synchronized: %s\n"
Zbigniew Jędrzejewski-Szmek 35bb94
                "systemd-timesyncd.service active: %s\n"
Zbigniew Jędrzejewski-Szmek 35bb94
                "                 RTC in local TZ: %s\n",
Zbigniew Jędrzejewski-Szmek 35bb94
-               strna(i->timezone), (int) sizeof(a), have_time ? a : "n/a",
Zbigniew Jędrzejewski-Szmek 35bb94
+               strna(i->timezone), have_time && n > 0 ? a : "n/a",
Zbigniew Jędrzejewski-Szmek 35bb94
                i->ntp_capable ? yes_no(i->ntp_enabled) : "n/a",
Zbigniew Jędrzejewski-Szmek 35bb94
                yes_no(i->ntp_synced),
Zbigniew Jędrzejewski-Szmek 35bb94
                yes_no(i->rtc_local));