summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Small <csmall@enc.com.au>2013-09-11 20:50:48 +1000
committerCraig Small <csmall@enc.com.au>2013-09-11 20:50:48 +1000
commit5e4d9d5a926c46e69e9ce03cf42de08a399ea5c6 (patch)
tree01b383de18952d6f1bfa5f3919d91008742f5971
parent13f20a48119894638a98b9a17a714704c69492d4 (diff)
parent3e7f78d296e610922daa7e144f52a77392705563 (diff)
downloadprocps-ng-5e4d9d5a926c46e69e9ce03cf42de08a399ea5c6.tar.gz
Merge commit 'refs/merge-requests/2' of git://gitorious.org/procps/procps into merge-requests/2
Conflicts: uptime.c
-rw-r--r--AUTHORS1
-rw-r--r--proc/whattime.c110
-rw-r--r--proc/whattime.h4
-rw-r--r--top/top.c4
-rw-r--r--uptime.13
-rw-r--r--uptime.c11
-rw-r--r--w.c2
7 files changed, 101 insertions, 34 deletions
diff --git a/AUTHORS b/AUTHORS
index 1ad2719..70680cf 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -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>.
diff --git a/proc/whattime.c b/proc/whattime.c
index e2069b5..9d6abb3 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;
+
+ 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));
}
diff --git a/proc/whattime.h b/proc/whattime.h
index 891ccd3..5ac5850 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 9996fbf..6f4f728 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 13a9125..2709bcc 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 2742189..91275ca 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 c80e117..36ceac3 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"));