w(1): Limit affect of locale change
authorJohn Marino <draco@marino.st>
Tue, 8 Dec 2015 21:40:03 +0000 (22:40 +0100)
committerJohn Marino <draco@marino.st>
Tue, 8 Dec 2015 21:51:55 +0000 (22:51 +0100)
In essence, w(1) is not designed to be locale sensitive.  The majority
of the outputted text is exclusively English.  However, it does check
the locale for the AM/PM setting (12 hour vs 24 hour clock) and the
decimal separator.

Given that w(1) is designed for English, it only provides enough space
to accommodate "AM" or "PM".  When other locales are used
(e.g. de_DE.UTF-8) the output is simply truncated and confusing.

Let's keep the 12-hour clock labels in the same language as the rest
of the program by forcing strftime to use the C/POSIX locale.  Using
locales still affects am/pm presence and the decimal separator as
originally intended.

usr.bin/w/pr_time.c
usr.bin/w/w.c

index a62615b..9d0e55d 100644 (file)
@@ -73,7 +73,7 @@ pr_attime(time_t *started, time_t *now)
                (void)strcpy(fmt, use_ampm ? "%l:%M%p" : "%k:%M");
        }
 
-       (void)strftime(buf, sizeof(buf), fmt, &tp);
+       (void)strftime_l(buf, sizeof(buf), fmt, &tp, NULL);
        (void)printf("%-7.7s", buf);
 }
 
index a6bdaf0..a177071 100644 (file)
@@ -513,10 +513,11 @@ pr_header(time_t *nowp, int nusers)
        char buf[256];
 
        /*
-        * Print time of day.
+        * Print time of day. (use "AM"/"PM" for all locales)
         */
-       (void)strftime(buf, sizeof(buf) - 1,
-                      use_ampm ? "%l:%M%p" : "%k:%M", localtime(nowp));
+       (void)strftime_l(buf, sizeof(buf) - 1,
+                      use_ampm ? "%l:%M%p" : "%k:%M",
+                      localtime(nowp), NULL);
        buf[sizeof(buf) - 1] = '\0';
        (void)printf("%s ", buf);