[git commit] uptime: add -s support

Denys Vlasenko vda.linux at googlemail.com
Fri Aug 3 17:53:49 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=3f2e963768cd9ceb52988db2848ecf0b930f3f44
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 procps/uptime.c | 30 ++++++++++++++++++++++++------
 1 file changed, 24 insertions(+), 6 deletions(-)

diff --git a/procps/uptime.c b/procps/uptime.c
index b0ee8391b..3262f41b4 100644
--- a/procps/uptime.c
+++ b/procps/uptime.c
@@ -45,7 +45,6 @@
 # include <sys/sysinfo.h>
 #endif
 
-
 #ifndef FSHIFT
 # define FSHIFT 16              /* nr of bits of precision */
 #endif
@@ -53,29 +52,48 @@
 #define LOAD_INT(x)  (unsigned)((x) >> FSHIFT)
 #define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1 - 1)) * 100)
 
-
 int uptime_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int uptime_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
 {
 	unsigned updays, uphours, upminutes;
+	unsigned opts;
 	struct sysinfo info;
 	struct tm *current_time;
 	time_t current_secs;
 
+	opts = getopt32(argv, "s");
+
 	time(&current_secs);
+	sysinfo(&info);
+
+	if (opts) // -s
+		current_secs -= info.uptime;
+
 	current_time = localtime(&current_secs);
 
-	sysinfo(&info);
+	if (opts) { // -s
+		printf("%04u-%02u-%02u %02u:%02u:%02u\n",
+			current_time->tm_year + 1900, current_time->tm_mon + 1, current_time->tm_mday,
+			current_time->tm_hour, current_time->tm_min, current_time->tm_sec
+		);
+		/* The above way of calculating boot time is wobbly,
+		 * info.uptime has only 1 second precision, which makes
+		 * "uptime -s" wander +- one second.
+		 * /proc/uptime may be better, it has 0.01s precision.
+		 */
+		return EXIT_SUCCESS;
+	}
 
 	printf(" %02u:%02u:%02u up ",
-			current_time->tm_hour, current_time->tm_min, current_time->tm_sec);
+			current_time->tm_hour, current_time->tm_min, current_time->tm_sec
+	);
 	updays = (unsigned) info.uptime / (unsigned)(60*60*24);
-	if (updays)
+	if (updays != 0)
 		printf("%u day%s, ", updays, (updays != 1) ? "s" : "");
 	upminutes = (unsigned) info.uptime / (unsigned)60;
 	uphours = (upminutes / (unsigned)60) % (unsigned)24;
 	upminutes %= 60;
-	if (uphours)
+	if (uphours != 0)
 		printf("%2u:%02u", uphours, upminutes);
 	else
 		printf("%u min", upminutes);


More information about the busybox-cvs mailing list