Commit 5e4d9d5a authored by Craig Small's avatar Craig Small

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

Conflicts:
	uptime.c
parents 13f20a48 3e7f78d2
......@@ -43,6 +43,7 @@ George Bonser <george@captech.com>
uptime:
Larry Greenfield <greenfie@gauss.rutgers.edu>
Michael K. Johnson <johnsonm@sunsite.unc.edu>
David Cantrell <david.l.cantrell@gmail.com>
vmstat:
Henry Ware <al172@yfn.ysu.edu>.
......
......@@ -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;
if (updecades) {
pos += sprintf(buf + pos, "%d %s", updecades,
updecades > 1 ? "decades" : "decade");
comma += 1;
}
loadavg(&av[0], &av[1], &av[2]);
if (upyears) {
pos += sprintf(buf + pos, "%s%d %s", comma > 0 ? ", " : "", upyears,
upyears > 1 ? "years" : "year");
comma += 1;
}
pos += sprintf(buf + pos, " load average: %.2f, %.2f, %.2f",
av[0], av[1], av[2]);
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));
}
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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;
}
......@@ -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"));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment