diff --git a/AUTHORS b/AUTHORS index 1ad27195..70680cf4 100644 --- a/AUTHORS +++ b/AUTHORS @@ -43,6 +43,7 @@ George Bonser uptime: Larry Greenfield Michael K. Johnson +David Cantrell vmstat: Henry Ware . diff --git a/proc/whattime.c b/proc/whattime.c index e2069b55..9d6abb30 100644 --- a/proc/whattime.c +++ b/proc/whattime.c @@ -41,10 +41,11 @@ static char buf[128]; static double av[3]; -char *sprint_uptime(void) { +char *sprint_uptime(int human_readable) { struct utmp *utmpstruct; - int upminutes, uphours, updays; + int upminutes, uphours, updays, upweeks, upyears, updecades; int pos; + int comma; struct tm *realtime; time_t realseconds; int numuser; @@ -52,50 +53,107 @@ char *sprint_uptime(void) { /* first get the current time */ - time(&realseconds); - realtime = localtime(&realseconds); - pos = sprintf(buf, " %02d:%02d:%02d ", - realtime->tm_hour, realtime->tm_min, realtime->tm_sec); + if (!human_readable) { + time(&realseconds); + realtime = localtime(&realseconds); + pos = sprintf(buf, " %02d:%02d:%02d ", + realtime->tm_hour, realtime->tm_min, realtime->tm_sec); + } /* read and calculate the amount of uptime */ uptime(&uptime_secs, &idle_secs); - updays = (int) uptime_secs / (60*60*24); + if (human_readable) { + updecades = (int) uptime_secs / (60*60*24*365*10); + upyears = ((int) uptime_secs / (60*60*24*365)) % 10; + upweeks = ((int) uptime_secs / (60*60*24*7)) % 52; + updays = ((int) uptime_secs / (60*60*24)) % 7; + } + else + updays = (int) uptime_secs / (60*60*24); + strcat (buf, "up "); pos += 3; - if (updays) - pos += sprintf(buf + pos, "%d day%s, ", updays, (updays != 1) ? "s" : ""); + + if (!human_readable) { + if (updays) + pos += sprintf(buf + pos, "%d day%s, ", updays, (updays != 1) ? "s" : ""); + } + upminutes = (int) uptime_secs / 60; uphours = upminutes / 60; uphours = uphours % 24; upminutes = upminutes % 60; - if(uphours) - pos += sprintf(buf + pos, "%2d:%02d, ", uphours, upminutes); - else - pos += sprintf(buf + pos, "%d min, ", upminutes); + + if (!human_readable) { + if(uphours) + pos += sprintf(buf + pos, "%2d:%02d, ", uphours, upminutes); + else + pos += sprintf(buf + pos, "%d min, ", upminutes); /* count the number of users */ - numuser = 0; - setutent(); - while ((utmpstruct = getutent())) { - if ((utmpstruct->ut_type == USER_PROCESS) && - (utmpstruct->ut_name[0] != '\0')) - numuser++; + numuser = 0; + setutent(); + while ((utmpstruct = getutent())) { + if ((utmpstruct->ut_type == USER_PROCESS) && + (utmpstruct->ut_name[0] != '\0')) + numuser++; + } + endutent(); + + pos += sprintf(buf + pos, "%2d user%s, ", numuser, numuser == 1 ? "" : "s"); + + loadavg(&av[0], &av[1], &av[2]); + + pos += sprintf(buf + pos, " load average: %.2f, %.2f, %.2f", + av[0], av[1], av[2]); } - endutent(); - pos += sprintf(buf + pos, "%2d user%s, ", numuser, numuser == 1 ? "" : "s"); + if (human_readable) { + comma = 0; - loadavg(&av[0], &av[1], &av[2]); + if (updecades) { + pos += sprintf(buf + pos, "%d %s", updecades, + updecades > 1 ? "decades" : "decade"); + comma += 1; + } - pos += sprintf(buf + pos, " load average: %.2f, %.2f, %.2f", - av[0], av[1], av[2]); + if (upyears) { + pos += sprintf(buf + pos, "%s%d %s", comma > 0 ? ", " : "", upyears, + upyears > 1 ? "years" : "year"); + comma += 1; + } + + if (upweeks) { + pos += sprintf(buf + pos, "%s%d %s", comma > 0 ? ", " : "", upweeks, + upweeks > 1 ? "weeks" : "week"); + comma += 1; + } + + if (updays) { + pos += sprintf(buf + pos, "%s%d %s", comma > 0 ? ", " : "", updays, + updays > 1 ? "days" : "day"); + comma += 1; + } + + if (uphours) { + pos += sprintf(buf + pos, "%s%d %s", comma > 0 ? ", " : "", uphours, + uphours > 1 ? "hours" : "hour"); + comma += 1; + } + + if (upminutes) { + pos += sprintf(buf + pos, "%s%d %s", comma > 0 ? ", " : "", upminutes, + upminutes > 1 ? "minutes" : "minute"); + comma += 1; + } + } return buf; } -void print_uptime(void) { - printf("%s\n", sprint_uptime()); +void print_uptime(int human_readable) { + printf("%s\n", sprint_uptime(human_readable)); } diff --git a/proc/whattime.h b/proc/whattime.h index 891ccd35..5ac58501 100644 --- a/proc/whattime.h +++ b/proc/whattime.h @@ -5,8 +5,8 @@ EXTERN_C_BEGIN -extern void print_uptime(void); -extern char *sprint_uptime(void); +extern void print_uptime(int human_readable); +extern char *sprint_uptime(int human_readable); EXTERN_C_END diff --git a/top/top.c b/top/top.c index 9996fbf8..6f4f7288 100644 --- a/top/top.c +++ b/top/top.c @@ -4997,10 +4997,10 @@ static void summary_show (void) { // Display Uptime and Loadavg if (isROOM(View_LOADAV, 1)) { if (!Rc.mode_altscr) - show_special(0, fmtmk(LOADAV_line, Myname, sprint_uptime())); + show_special(0, fmtmk(LOADAV_line, Myname, sprint_uptime(0))); else show_special(0, fmtmk(CHKw(w, Show_TASKON)? LOADAV_line_alt : LOADAV_line - , w->grpname, sprint_uptime())); + , w->grpname, sprint_uptime(0))); Msg_row += 1; } // end: View_LOADAV diff --git a/uptime.1 b/uptime.1 index 13a9125e..2709bccf 100644 --- a/uptime.1 +++ b/uptime.1 @@ -25,6 +25,9 @@ is loaded all the time while on a 4 CPU system it means it was idle 75% of the time. .SH OPTIONS .TP +\fB\-p\fR, \fB\-\-pretty\fR +show uptime in pretty format +.TP \fB\-h\fR, \fB\-\-help\fR display this help text .TP diff --git a/uptime.c b/uptime.c index 27421895..91275ca8 100644 --- a/uptime.c +++ b/uptime.c @@ -58,6 +58,7 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out) fputs(USAGE_HEADER, out); fprintf(out, _(" %s [options]\n"), program_invocation_short_name); fputs(USAGE_OPTIONS, out); + fputs(_(" -p, --pretty show uptime in pretty format\n"), out); fputs(USAGE_HELP, out); fputs(_(" -s, --since system up since\n"), out); fputs(USAGE_VERSION, out); @@ -68,9 +69,10 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out) int main(int argc, char **argv) { - int c; + int c, p = 0; static const struct option longopts[] = { + {"pretty", no_argument, NULL, 'p'}, {"help", no_argument, NULL, 'h'}, {"since", no_argument, NULL, 's'}, {"version", no_argument, NULL, 'V'}, @@ -85,8 +87,11 @@ int main(int argc, char **argv) textdomain(PACKAGE); atexit(close_stdout); - while ((c = getopt_long(argc, argv, "hsV", longopts, NULL)) != -1) + while ((c = getopt_long(argc, argv, "phsV", longopts, NULL)) != -1) switch (c) { + case 'p': + p = 1; + break; case 'h': usage(stdout); case 's': @@ -99,6 +104,6 @@ int main(int argc, char **argv) usage(stderr); } - print_uptime(); + print_uptime(p); return EXIT_SUCCESS; } diff --git a/w.c b/w.c index c80e117a..36ceac38 100644 --- a/w.c +++ b/w.c @@ -575,7 +575,7 @@ int main(int argc, char **argv) if (header) { /* print uptime and headers */ - print_uptime(); + print_uptime(0); /* Translation Hint: Following five uppercase messages are * headers. Try to keep alignment intact. */ printf(_("%-*s TTY "), userlen, _("USER"));