diff --git a/include/osmocom/vty/vty.h b/include/osmocom/vty/vty.h index c13f43564..ed9f439c3 100644 --- a/include/osmocom/vty/vty.h +++ b/include/osmocom/vty/vty.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -219,6 +220,7 @@ bool vty_is_active(struct vty *vty); int vty_out (struct vty *, const char *, ...) VTY_PRINTF_ATTRIBUTE(2, 3); int vty_out_va(struct vty *vty, const char *format, va_list ap); int vty_out_newline(struct vty *); +int vty_out_uptime(struct vty *vty, const struct timespec *starttime); int vty_read(struct vty *vty); //void vty_time_print (struct vty *, int); void vty_close (struct vty *); diff --git a/src/vty/command.c b/src/vty/command.c index bb6a66511..e5e7d152b 100644 --- a/src/vty/command.c +++ b/src/vty/command.c @@ -3066,18 +3066,9 @@ DEFUN(show_pid, DEFUN(show_uptime, show_uptime_cmd, "show uptime", SHOW_STR "Displays how long the program has been running\n") { - struct timespec now; - struct timespec uptime; - - osmo_clock_gettime(CLOCK_MONOTONIC, &now); - timespecsub(&now, &starttime, &uptime); - - int d = uptime.tv_sec / (3600 * 24); - int h = uptime.tv_sec / 3600 % 24; - int m = uptime.tv_sec / 60 % 60; - int s = uptime.tv_sec % 60; - - vty_out(vty, "%s has been running for %dd %dh %dm %ds%s", host.app_info->name, d, h, m, s, VTY_NEWLINE); + vty_out(vty, "%s has been running for ", host.app_info->name); + vty_out_uptime(vty, &starttime); + vty_out_newline(vty); return CMD_SUCCESS; } diff --git a/src/vty/vty.c b/src/vty/vty.c index 1ad84f53a..3a549b434 100644 --- a/src/vty/vty.c +++ b/src/vty/vty.c @@ -66,6 +66,7 @@ #include #include #include +#include #include #ifndef MAXPATHLEN @@ -338,6 +339,25 @@ int vty_out_newline(struct vty *vty) return 0; } +/*! calculates the time difference of a give timespec to the current time + * and prints in a human readable format (days, hours, minutes, seconds). + */ +int vty_out_uptime(struct vty *vty, const struct timespec *starttime) +{ + struct timespec now; + struct timespec uptime; + + osmo_clock_gettime(CLOCK_MONOTONIC, &now); + timespecsub(&now, starttime, &uptime); + + int d = uptime.tv_sec / (3600 * 24); + int h = uptime.tv_sec / 3600 % 24; + int m = uptime.tv_sec / 60 % 60; + int s = uptime.tv_sec % 60; + + return vty_out(vty, "%dd %dh %dm %ds", d, h, m, s); +} + /*! return the current index of a given VTY */ void *vty_current_index(struct vty *vty) {