Merge commit 'refs/merge-requests/2' of git://gitorious.org/procps/procps into merge-requests/2

Conflicts:
	uptime.c
This commit is contained in:
Craig Small 2013-09-11 20:50:48 +10:00
commit 5e4d9d5a92
7 changed files with 101 additions and 34 deletions

View File

@ -43,6 +43,7 @@ George Bonser <george@captech.com>
uptime: uptime:
Larry Greenfield <greenfie@gauss.rutgers.edu> Larry Greenfield <greenfie@gauss.rutgers.edu>
Michael K. Johnson <johnsonm@sunsite.unc.edu> Michael K. Johnson <johnsonm@sunsite.unc.edu>
David Cantrell <david.l.cantrell@gmail.com>
vmstat: vmstat:
Henry Ware <al172@yfn.ysu.edu>. Henry Ware <al172@yfn.ysu.edu>.

View File

@ -41,10 +41,11 @@
static char buf[128]; static char buf[128];
static double av[3]; static double av[3];
char *sprint_uptime(void) { char *sprint_uptime(int human_readable) {
struct utmp *utmpstruct; struct utmp *utmpstruct;
int upminutes, uphours, updays; int upminutes, uphours, updays, upweeks, upyears, updecades;
int pos; int pos;
int comma;
struct tm *realtime; struct tm *realtime;
time_t realseconds; time_t realseconds;
int numuser; int numuser;
@ -52,50 +53,107 @@ char *sprint_uptime(void) {
/* first get the current time */ /* first get the current time */
time(&realseconds); if (!human_readable) {
realtime = localtime(&realseconds); time(&realseconds);
pos = sprintf(buf, " %02d:%02d:%02d ", realtime = localtime(&realseconds);
realtime->tm_hour, realtime->tm_min, realtime->tm_sec); pos = sprintf(buf, " %02d:%02d:%02d ",
realtime->tm_hour, realtime->tm_min, realtime->tm_sec);
}
/* read and calculate the amount of uptime */ /* read and calculate the amount of uptime */
uptime(&uptime_secs, &idle_secs); 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 "); strcat (buf, "up ");
pos += 3; 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; upminutes = (int) uptime_secs / 60;
uphours = upminutes / 60; uphours = upminutes / 60;
uphours = uphours % 24; uphours = uphours % 24;
upminutes = upminutes % 60; upminutes = upminutes % 60;
if(uphours)
pos += sprintf(buf + pos, "%2d:%02d, ", uphours, upminutes); if (!human_readable) {
else if(uphours)
pos += sprintf(buf + pos, "%d min, ", upminutes); pos += sprintf(buf + pos, "%2d:%02d, ", uphours, upminutes);
else
pos += sprintf(buf + pos, "%d min, ", upminutes);
/* count the number of users */ /* count the number of users */
numuser = 0; numuser = 0;
setutent(); setutent();
while ((utmpstruct = getutent())) { while ((utmpstruct = getutent())) {
if ((utmpstruct->ut_type == USER_PROCESS) && if ((utmpstruct->ut_type == USER_PROCESS) &&
(utmpstruct->ut_name[0] != '\0')) (utmpstruct->ut_name[0] != '\0'))
numuser++; 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", if (upyears) {
av[0], av[1], av[2]); 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; return buf;
} }
void print_uptime(void) { void print_uptime(int human_readable) {
printf("%s\n", sprint_uptime()); printf("%s\n", sprint_uptime(human_readable));
} }

View File

@ -5,8 +5,8 @@
EXTERN_C_BEGIN EXTERN_C_BEGIN
extern void print_uptime(void); extern void print_uptime(int human_readable);
extern char *sprint_uptime(void); extern char *sprint_uptime(int human_readable);
EXTERN_C_END EXTERN_C_END

View File

@ -4997,10 +4997,10 @@ static void summary_show (void) {
// Display Uptime and Loadavg // Display Uptime and Loadavg
if (isROOM(View_LOADAV, 1)) { if (isROOM(View_LOADAV, 1)) {
if (!Rc.mode_altscr) if (!Rc.mode_altscr)
show_special(0, fmtmk(LOADAV_line, Myname, sprint_uptime())); show_special(0, fmtmk(LOADAV_line, Myname, sprint_uptime(0)));
else else
show_special(0, fmtmk(CHKw(w, Show_TASKON)? LOADAV_line_alt : LOADAV_line 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; Msg_row += 1;
} // end: View_LOADAV } // end: View_LOADAV

View File

@ -25,6 +25,9 @@ is loaded all the time while on a 4 CPU system it means it was idle 75% of
the time. the time.
.SH OPTIONS .SH OPTIONS
.TP .TP
\fB\-p\fR, \fB\-\-pretty\fR
show uptime in pretty format
.TP
\fB\-h\fR, \fB\-\-help\fR \fB\-h\fR, \fB\-\-help\fR
display this help text display this help text
.TP .TP

View File

@ -58,6 +58,7 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out)
fputs(USAGE_HEADER, out); fputs(USAGE_HEADER, out);
fprintf(out, _(" %s [options]\n"), program_invocation_short_name); fprintf(out, _(" %s [options]\n"), program_invocation_short_name);
fputs(USAGE_OPTIONS, out); fputs(USAGE_OPTIONS, out);
fputs(_(" -p, --pretty show uptime in pretty format\n"), out);
fputs(USAGE_HELP, out); fputs(USAGE_HELP, out);
fputs(_(" -s, --since system up since\n"), out); fputs(_(" -s, --since system up since\n"), out);
fputs(USAGE_VERSION, out); fputs(USAGE_VERSION, out);
@ -68,9 +69,10 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int c; int c, p = 0;
static const struct option longopts[] = { static const struct option longopts[] = {
{"pretty", no_argument, NULL, 'p'},
{"help", no_argument, NULL, 'h'}, {"help", no_argument, NULL, 'h'},
{"since", no_argument, NULL, 's'}, {"since", no_argument, NULL, 's'},
{"version", no_argument, NULL, 'V'}, {"version", no_argument, NULL, 'V'},
@ -85,8 +87,11 @@ int main(int argc, char **argv)
textdomain(PACKAGE); textdomain(PACKAGE);
atexit(close_stdout); 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) { switch (c) {
case 'p':
p = 1;
break;
case 'h': case 'h':
usage(stdout); usage(stdout);
case 's': case 's':
@ -99,6 +104,6 @@ int main(int argc, char **argv)
usage(stderr); usage(stderr);
} }
print_uptime(); print_uptime(p);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

2
w.c
View File

@ -575,7 +575,7 @@ int main(int argc, char **argv)
if (header) { if (header) {
/* print uptime and headers */ /* print uptime and headers */
print_uptime(); print_uptime(0);
/* Translation Hint: Following five uppercase messages are /* Translation Hint: Following five uppercase messages are
* headers. Try to keep alignment intact. */ * headers. Try to keep alignment intact. */
printf(_("%-*s TTY "), userlen, _("USER")); printf(_("%-*s TTY "), userlen, _("USER"));