From a705fdcb15c0515d512d54df43d3738b708ead65 Mon Sep 17 00:00:00 2001 From: Frank Fesevur Date: Wed, 26 Dec 2012 23:14:09 +1100 Subject: [PATCH] uptime: add since option The --since or -s option will show the time since the host was online. Reference(s): http://www.freelists.org/post/procps/Patch-Added-since-option-to-uptime Signed-off-by: Craig Small --- uptime.1 | 5 ++++- uptime.c | 32 +++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/uptime.1 b/uptime.1 index 11fa036c..13a9125e 100644 --- a/uptime.1 +++ b/uptime.1 @@ -1,6 +1,6 @@ .\" -*-Nroff-*- .\" -.TH UPTIME "1" "June 2011" "procps-ng" "User Commands" +.TH UPTIME "1" "December 2012" "procps-ng" "User Commands" .SH NAME uptime \- Tell how long the system has been running. .SH SYNOPSIS @@ -28,6 +28,9 @@ the time. \fB\-h\fR, \fB\-\-help\fR display this help text .TP +\fB\-s\fR, \fB\-\-since\fR +system up since, in yyyy-mm-dd MM:HH:SS format +.TP \fB\-V\fR, \fB\-\-version\fR display version information and exit .SH FILES diff --git a/uptime.c b/uptime.c index 3ea14e76..ac4579cd 100644 --- a/uptime.c +++ b/uptime.c @@ -21,19 +21,45 @@ #include #include #include +#include +#include #include "c.h" #include "fileutils.h" #include "nls.h" +#include "proc/sysinfo.h" #include "proc/whattime.h" #include "proc/version.h" +static void print_uptime_since() +{ + double now, uptime_secs, idle_secs; + time_t up_since_secs; + struct tm *up_since; + struct timeval tim; + + /* Get the current time and convert it to a double */ + gettimeofday(&tim, NULL); + now = tim.tv_sec + (tim.tv_usec / 1000000.0); + + /* Get the uptime and calculate when that was */ + uptime(&uptime_secs, &idle_secs); + up_since_secs = (time_t) ((now - uptime_secs) + 0.5); + + /* Show this */ + up_since = localtime(&up_since_secs); + printf("%04d-%02d-%02d %02d:%02d:%02d\n", + up_since->tm_year + 1900, up_since->tm_mon + 1, up_since->tm_mday, + up_since->tm_hour, up_since->tm_min, up_since->tm_sec); +} + 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(USAGE_HELP, out); + fputs(_(" -s, --since system up since\n"), out); fputs(USAGE_VERSION, out); fprintf(out, USAGE_MAN_TAIL("uptime(1)")); @@ -46,6 +72,7 @@ int main(int argc, char **argv) static const struct option longopts[] = { {"help", no_argument, NULL, 'h'}, + {"since", no_argument, NULL, 's'}, {"version", no_argument, NULL, 'V'}, {NULL, 0, NULL, 0} }; @@ -56,10 +83,13 @@ int main(int argc, char **argv) textdomain(PACKAGE); atexit(close_stdout); - while ((c = getopt_long(argc, argv, "hV", longopts, NULL)) != -1) + while ((c = getopt_long(argc, argv, "hsV", longopts, NULL)) != -1) switch (c) { case 'h': usage(stdout); + case 's': + print_uptime_since(); + return EXIT_SUCCESS; case 'V': printf(PROCPS_NG_VERSION); return EXIT_SUCCESS;