summaryrefslogtreecommitdiff
path: root/usr/src/cmd
diff options
context:
space:
mode:
authorGary Mills <gary_mills@fastmail.fm>2013-12-19 12:02:19 -0600
committerRobert Mustacchi <rm@joyent.com>2013-12-23 08:31:55 -0800
commitf05406318b2ae83404f8c9fa16f837202e6b8ed8 (patch)
treea9f62a2117e2ab1c3615cb5840043a34e8faef9d /usr/src/cmd
parent2acf01fd73874e9b92c066e8deb5270d92b083ba (diff)
downloadillumos-joyent-f05406318b2ae83404f8c9fa16f837202e6b8ed8.tar.gz
2849 uptime should use locale settings for current time
Reviewed by: Garrett D'Amore <garrett@damore.org> Approved by: Robert Mustacchi <rm@joyent.com>
Diffstat (limited to 'usr/src/cmd')
-rw-r--r--usr/src/cmd/w/w.c92
-rw-r--r--usr/src/cmd/whodo/whodo.c95
2 files changed, 87 insertions, 100 deletions
diff --git a/usr/src/cmd/w/w.c b/usr/src/cmd/w/w.c
index b5eb04d3af..0c67ba9269 100644
--- a/usr/src/cmd/w/w.c
+++ b/usr/src/cmd/w/w.c
@@ -79,7 +79,7 @@ static struct utmpx dummy;
/* Print minimum field widths. */
#define LOGIN_WIDTH 8
-#define LINE_WIDTH 12
+#define LINE_WIDTH 8
#define DIV60(t) ((t+30)/60) /* x/60 rounded */
@@ -127,9 +127,8 @@ static time_t findidle(char *);
static void clnarglist(char *);
static void showtotals(struct uproc *);
static void calctotals(struct uproc *);
-static void prttime(time_t, char *);
+static void prttime(time_t, int);
static void prtat(time_t *time);
-static void checkampm(char *str);
static char *prog; /* pointer to invocation name */
static int header = 1; /* true if -h flag: don't print heading */
@@ -276,7 +275,7 @@ main(int argc, char *argv[])
uptime %= (60*60);
mins = uptime / 60;
- PRINTF((gettext(" up")));
+ PRINTF((gettext("up")));
if (days > 0)
PRINTF((gettext(
" %d day(s),"), days));
@@ -308,11 +307,13 @@ main(int argc, char *argv[])
exit(0);
if (lflag) {
- PRINTF((dcgettext(NULL, "User tty "
- "login@ idle JCPU PCPU what\n", LC_TIME)));
+ PRINTF((dcgettext(NULL, "User tty "
+ "login@ idle JCPU PCPU what\n",
+ LC_TIME)));
} else {
PRINTF((dcgettext(NULL,
- "User tty idle what\n", LC_TIME)));
+ "User tty idle what\n",
+ LC_TIME)));
}
if (fflush(stdout) == EOF) {
@@ -485,13 +486,14 @@ retry:
/* print tty user is on */
if (lflag) {
- PRINTF(("%-*.*s", LINE_WIDTH, LMAX, ut->ut_line));
+ PRINTF(("%-*.*s ", LINE_WIDTH, LMAX, ut->ut_line));
} else {
if (ut->ut_line[0] == 'p' && ut->ut_line[1] == 't' &&
ut->ut_line[2] == 's' && ut->ut_line[3] == '/') {
- PRINTF(("%-*.3s", LMAX, &ut->ut_line[4]));
+ PRINTF(("%-*.*s ", LINE_WIDTH, LMAX,
+ &ut->ut_line[4]));
} else {
- PRINTF(("%-*.*s", LINE_WIDTH, LMAX,
+ PRINTF(("%-*.*s ", LINE_WIDTH, LMAX,
ut->ut_line));
}
}
@@ -504,11 +506,7 @@ retry:
/* print idle time */
idle = findidle(ut->ut_line);
- if (idle >= 36 * 60) {
- PRINTF((dcgettext(NULL, "%2ddays ", LC_TIME),
- (idle + 12 * 60) / (24 * 60)));
- } else
- prttime(idle, " ");
+ prttime(idle, 8);
showtotals(findhash(ut->ut_pid));
}
if (fclose(stdout) == EOF) {
@@ -537,14 +535,14 @@ showtotals(struct uproc *up)
if (lflag) {
/* print CPU time for all processes & children */
/* and need to convert clock ticks to seconds first */
- prttime((time_t)jobtime, " ");
+ prttime((time_t)jobtime, 8);
/* print cpu time for interesting process */
/* and need to convert clock ticks to seconds first */
- prttime((time_t)proctime, " ");
+ prttime((time_t)proctime, 8);
}
/* what user is doing, current process */
- PRINTF((" %-.32s\n", doing));
+ PRINTF(("%-.32s\n", doing));
}
/*
@@ -646,26 +644,35 @@ findhash(pid_t pid)
#define MON (30 * DAY)
/*
- * prttime prints a time in hours and minutes or minutes and seconds.
- * The character string tail is printed at the end, obvious
- * strings to pass are "", " ", or "am".
+ * Prttime prints an elapsed time in hours, minutes, or seconds,
+ * right-justified with the rightmost column always blank.
+ * The second argument is the minimum field width.
*/
static void
-prttime(time_t tim, char *tail)
+prttime(time_t tim, int width)
{
- if (tim >= 60) {
- PRINTF((dcgettext(NULL, "%3d:%02d", LC_TIME),
- (int)tim/60, (int)tim%60));
+ char value[36];
+
+ if (tim >= 36 * 60) {
+ (void) snprintf(value, sizeof (value), "%d:%02d:%02d",
+ (int)tim / HR, (int)(tim % HR) / 60, (int)tim % 60);
+ } else if (tim >= 60) {
+ (void) snprintf(value, sizeof (value), "%d:%02d",
+ (int)tim / 60, (int)tim % 60);
} else if (tim > 0) {
- PRINTF((dcgettext(NULL, " %2d", LC_TIME), (int)tim));
+ (void) snprintf(value, sizeof (value), "%d", (int)tim);
} else {
- PRINTF((" "));
+ (void) strcpy(value, "0");
}
- PRINTF(("%s", tail));
+ width = (width > 2) ? width - 1 : 1;
+ PRINTF(("%*s ", width, value));
}
/*
- * prints a 12 hour time given a pointer to a time of day
+ * Prints the ISO date or time given a pointer to a time of day,
+ * left-justfied in a 12-character expanding field with the
+ * rightmost column always blank.
+ * Includes a dcgettext() override in case a message catalog is needed.
*/
static void
prtat(time_t *time)
@@ -675,23 +682,22 @@ prtat(time_t *time)
p = localtime(time);
if (now - *time <= 18 * HR) {
char timestr[50];
+
(void) strftime(timestr, sizeof (timestr),
- dcgettext(NULL, "%l:%M""%p", LC_TIME), p);
- checkampm(timestr);
- PRINTF((" %s", timestr));
+ dcgettext(NULL, "%T", LC_TIME), p);
+ PRINTF(("%-11s ", timestr));
} else if (now - *time <= 7 * DAY) {
char weekdaytime[20];
(void) strftime(weekdaytime, sizeof (weekdaytime),
- dcgettext(NULL, "%a%l%p", LC_TIME), p);
- checkampm(weekdaytime);
- PRINTF((" %s", weekdaytime));
+ dcgettext(NULL, "%a %H:%M", LC_TIME), p);
+ PRINTF(("%-11s ", weekdaytime));
} else {
char monthtime[20];
(void) strftime(monthtime, sizeof (monthtime),
- dcgettext(NULL, "%e%b%y", LC_TIME), p);
- PRINTF((" %s", monthtime));
+ dcgettext(NULL, "%F", LC_TIME), p);
+ PRINTF(("%-11s ", monthtime));
}
}
@@ -738,15 +744,3 @@ clnarglist(char *arglist)
}
}
}
-
-/* replaces all occurences of AM/PM with am/pm */
-static void
-checkampm(char *str)
-{
- char *ampm;
- while ((ampm = strstr(str, "AM")) != NULL ||
- (ampm = strstr(str, "PM")) != NULL) {
- *ampm = tolower(*ampm);
- *(ampm+1) = tolower(*(ampm+1));
- }
-}
diff --git a/usr/src/cmd/whodo/whodo.c b/usr/src/cmd/whodo/whodo.c
index 2def679f94..80a781b7b7 100644
--- a/usr/src/cmd/whodo/whodo.c
+++ b/usr/src/cmd/whodo/whodo.c
@@ -77,7 +77,7 @@
/* Print minimum field widths. */
#define LOGIN_WIDTH 8
-#define LINE_WIDTH 12
+#define LINE_WIDTH 8
#define DIV60(t) ((t+30)/60) /* x/60 rounded */
@@ -133,9 +133,8 @@ static void showproc(struct uproc *);
static void showtotals(struct uproc *);
static void calctotals(struct uproc *);
static char *getty(dev_t);
-static void prttime(time_t, char *);
+static void prttime(time_t, int);
static void prtat(time_t *);
-static void checkampm(char *);
static char *prog;
static int header = 1; /* true if -h flag: don't print heading */
@@ -273,7 +272,7 @@ main(int argc, char *argv[])
mins = uptime / 60;
(void) printf(dcgettext(NULL,
- " up %d day(s), %d hr(s), "
+ "up %d day(s), %d hr(s), "
"%d min(s)", LC_TIME),
days, hrs, mins);
}
@@ -282,8 +281,9 @@ main(int argc, char *argv[])
ut = utmpbegin; /* rewind utmp data */
(void) printf(dcgettext(NULL,
" %d user(s)\n", LC_TIME), nusers);
- (void) printf(dcgettext(NULL, "User tty "
- "login@ idle JCPU PCPU what\n", LC_TIME));
+ (void) printf(dcgettext(NULL, "User tty "
+ "login@ idle JCPU PCPU what\n",
+ LC_TIME));
} else { /* standard whodo header */
char date_buf[100];
@@ -291,7 +291,7 @@ main(int argc, char *argv[])
* print current time and date
*/
(void) strftime(date_buf, sizeof (date_buf),
- dcgettext(NULL, "%C", LC_TIME), localtime(&now));
+ "%c", localtime(&now));
(void) printf("%s\n", date_buf);
/*
@@ -474,7 +474,7 @@ retry:
ut->ut_name);
/* print tty user is on */
- (void) printf("%-*.*s", LINE_WIDTH, (int)LMAX,
+ (void) printf("%-*.*s ", LINE_WIDTH, (int)LMAX,
ut->ut_line);
/* print when the user logged in */
@@ -483,11 +483,7 @@ retry:
/* print idle time */
idle = findidle(ut->ut_line);
- if (idle >= 36 * 60)
- (void) printf(dcgettext(NULL, "%2ddays ",
- LC_TIME), (idle + 12 * 60) / (24 * 60));
- else
- prttime(idle, " ");
+ prttime(idle, 8);
showtotals(findhash((pid_t)ut->ut_pid));
} else { /* standard whodo format */
tim = ut->ut_xtime;
@@ -562,14 +558,14 @@ showtotals(struct uproc *up)
/* print CPU time for all processes & children */
/* and need to convert clock ticks to seconds first */
- prttime((time_t)jobtime, " ");
+ prttime((time_t)jobtime, 8);
/* print cpu time for interesting process */
/* and need to convert clock ticks to seconds first */
- prttime((time_t)proctime, " ");
+ prttime((time_t)proctime, 8);
/* what user is doing, current process */
- (void) printf(" %-.32s\n", doing);
+ (void) printf("%-.32s\n", doing);
}
/*
@@ -736,54 +732,63 @@ findhash(pid_t pid)
#define HR (60 * 60)
#define DAY (24 * HR)
#define MON (30 * DAY)
+#define PRINTF(a) (void) printf a
/*
- * prints a time in hours and minutes or minutes and seconds.
- * The character string 'tail' is printed at the end, obvious
- * strings to pass are "", " ", or "am".
+ * Prttime prints an elapsed time in hours, minutes, or seconds,
+ * right-justified with the rightmost column always blank.
+ * The second argument is the minimum field width.
*/
static void
-prttime(time_t tim, char *tail)
+prttime(time_t tim, int width)
{
- if (tim >= 60)
- (void) printf(dcgettext(NULL, "%3d:%02d", LC_TIME),
- (int)tim/60, (int)tim%60);
- else if (tim > 0)
- (void) printf(dcgettext(NULL, " %2d", LC_TIME), (int)tim);
- else
- (void) printf(" ");
- (void) printf("%s", tail);
+ char value[36];
+
+ if (tim >= 36 * 60) {
+ (void) snprintf(value, sizeof (value), "%d:%02d:%02d",
+ (int)tim / HR, (int)(tim % HR) / 60, (int)tim % 60);
+ } else if (tim >= 60) {
+ (void) snprintf(value, sizeof (value), "%d:%02d",
+ (int)tim / 60, (int)tim % 60);
+ } else if (tim > 0) {
+ (void) snprintf(value, sizeof (value), "%d", (int)tim);
+ } else {
+ (void) strcpy(value, "0");
+ }
+ width = (width > 2) ? width - 1 : 1;
+ PRINTF(("%*s ", width, value));
}
-
/*
- * prints a 12 hour time given a pointer to a time of day
+ * Prints the ISO date or time given a pointer to a time of day,
+ * left-justfied in a 12-character expanding field with the
+ * rightmost column always blank.
+ * Includes a dcgettext() override in case a message catalog is needed.
*/
static void
prtat(time_t *time)
{
- struct tm *p;
+ struct tm *p;
p = localtime(time);
if (now - *time <= 18 * HR) {
char timestr[50];
+
(void) strftime(timestr, sizeof (timestr),
- dcgettext(NULL, " %l:%M""%p", LC_TIME), p);
- checkampm(timestr);
- (void) printf("%s", timestr);
+ dcgettext(NULL, "%T", LC_TIME), p);
+ PRINTF(("%-11s ", timestr));
} else if (now - *time <= 7 * DAY) {
char weekdaytime[20];
(void) strftime(weekdaytime, sizeof (weekdaytime),
- dcgettext(NULL, "%a%l%p", LC_TIME), p);
- checkampm(weekdaytime);
- (void) printf(" %s", weekdaytime);
+ dcgettext(NULL, "%a %H:%M", LC_TIME), p);
+ PRINTF(("%-11s ", weekdaytime));
} else {
char monthtime[20];
(void) strftime(monthtime, sizeof (monthtime),
- dcgettext(NULL, "%e%b%y", LC_TIME), p);
- (void) printf(" %s", monthtime);
+ dcgettext(NULL, "%F", LC_TIME), p);
+ PRINTF(("%-11s ", monthtime));
}
}
@@ -830,15 +835,3 @@ clnarglist(char *arglist)
}
}
}
-
-/* replaces all occurences of AM/PM with am/pm */
-static void
-checkampm(char *str)
-{
- char *ampm;
- while ((ampm = strstr(str, "AM")) != NULL ||
- (ampm = strstr(str, "PM")) != NULL) {
- *ampm = tolower(*ampm);
- *(ampm+1) = tolower(*(ampm+1));
- }
-}