diff options
author | Gary Mills <gary_mills@fastmail.fm> | 2013-12-19 12:02:19 -0600 |
---|---|---|
committer | Robert Mustacchi <rm@joyent.com> | 2013-12-23 08:31:55 -0800 |
commit | f05406318b2ae83404f8c9fa16f837202e6b8ed8 (patch) | |
tree | a9f62a2117e2ab1c3615cb5840043a34e8faef9d /usr/src/cmd | |
parent | 2acf01fd73874e9b92c066e8deb5270d92b083ba (diff) | |
download | illumos-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.c | 92 | ||||
-rw-r--r-- | usr/src/cmd/whodo/whodo.c | 95 |
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)); - } -} |