diff --git a/cli.c b/cli.c index 6276e97812ce47f4d66c9f3a40b4904ed558aa58..2b5aa601168218f89f59b065be5fd3b9d0dcefff 100644 --- a/cli.c +++ b/cli.c @@ -278,118 +278,70 @@ static char uptime_help[] = " Shows Asterisk uptime information.\n" " The seconds word returns the uptime in seconds only.\n"; -static char *format_uptimestr(time_t timeval) +static void print_uptimestr(int fd, time_t timeval, const char *prefix, int printsec) { - int years = 0, weeks = 0, days = 0, hours = 0, mins = 0, secs = 0; - char timestr[256]=""; - int bytes = 0; - int maxbytes = 0; - int offset = 0; + int x; /* the main part - years, weeks, etc. */ + char timestr[256]="", *s = timestr; + size_t maxbytes = sizeof(timestr); + #define SECOND (1) #define MINUTE (SECOND*60) #define HOUR (MINUTE*60) #define DAY (HOUR*24) #define WEEK (DAY*7) #define YEAR (DAY*365) -#define ESS(x) ((x == 1) ? "" : "s") - - maxbytes = sizeof(timestr); - if (timeval < 0) - return NULL; +#define ESS(x) ((x == 1) ? "" : "s") /* plural suffix */ +#define NEEDCOMMA(x) ((x)? ",": "") /* define if we need a comma */ + if (timeval < 0) /* invalid, nothing to show */ + return; + if (printsec) { /* plain seconds output */ + ast_build_string(&s, &maxbytes, "%lu", (u_long)timeval); + timeval = 0; /* bypass the other cases */ + } if (timeval > YEAR) { - years = (timeval / YEAR); - timeval -= (years * YEAR); - if (years > 0) { - snprintf(timestr + offset, maxbytes, "%d year%s, ", years, ESS(years)); - bytes = strlen(timestr + offset); - offset += bytes; - maxbytes -= bytes; - } + x = (timeval / YEAR); + timeval -= (x * YEAR); + ast_build_string(&s, &maxbytes, "%d year%s%s ", x, ESS(x),NEEDCOMMA(timeval)); } if (timeval > WEEK) { - weeks = (timeval / WEEK); - timeval -= (weeks * WEEK); - if (weeks > 0) { - snprintf(timestr + offset, maxbytes, "%d week%s, ", weeks, ESS(weeks)); - bytes = strlen(timestr + offset); - offset += bytes; - maxbytes -= bytes; - } + x = (timeval / WEEK); + timeval -= (x * WEEK); + ast_build_string(&s, &maxbytes, "%d week%s%s ", x, ESS(x),NEEDCOMMA(timeval)); } if (timeval > DAY) { - days = (timeval / DAY); - timeval -= (days * DAY); - if (days > 0) { - snprintf(timestr + offset, maxbytes, "%d day%s, ", days, ESS(days)); - bytes = strlen(timestr + offset); - offset += bytes; - maxbytes -= bytes; - } + x = (timeval / DAY); + timeval -= (x * DAY); + ast_build_string(&s, &maxbytes, "%d day%s%s ", x, ESS(x),NEEDCOMMA(timeval)); } if (timeval > HOUR) { - hours = (timeval / HOUR); - timeval -= (hours * HOUR); - if (hours > 0) { - snprintf(timestr + offset, maxbytes, "%d hour%s, ", hours, ESS(hours)); - bytes = strlen(timestr + offset); - offset += bytes; - maxbytes -= bytes; - } + x = (timeval / HOUR); + timeval -= (x * HOUR); + ast_build_string(&s, &maxbytes, "%d hour%s%s ", x, ESS(x),NEEDCOMMA(timeval)); } if (timeval > MINUTE) { - mins = (timeval / MINUTE); - timeval -= (mins * MINUTE); - if (mins > 0) { - snprintf(timestr + offset, maxbytes, "%d minute%s, ", mins, ESS(mins)); - bytes = strlen(timestr + offset); - offset += bytes; - maxbytes -= bytes; - } + x = (timeval / MINUTE); + timeval -= (x * MINUTE); + ast_build_string(&s, &maxbytes, "%d minute%s%s ", x, ESS(x),NEEDCOMMA(timeval)); } - secs = timeval; - - if (secs > 0) { - snprintf(timestr + offset, maxbytes, "%d second%s", secs, ESS(secs)); - } - - return timestr ? strdup(timestr) : NULL; + x = timeval; + if (x > 0) + ast_build_string(&s, &maxbytes, "%d second%s ", x, ESS(x)); + if (timestr[0] != '\0') + ast_cli(fd, "%s: %s\n", prefix, timestr); } static int handle_showuptime(int fd, int argc, char *argv[]) { - time_t curtime, tmptime; - char *timestr; - int printsec; + /* 'show uptime [seconds]' */ + time_t curtime = time(NULL); + int printsec = (argc == 3 && !strcasecmp(argv[2],"seconds")); - printsec = ((argc == 3) && (!strcasecmp(argv[2],"seconds"))); - if ((argc != 2) && (!printsec)) + if (argc != 2 && !printsec) return RESULT_SHOWUSAGE; - - time(&curtime); - if (ast_startuptime) { - tmptime = curtime - ast_startuptime; - if (printsec) { - ast_cli(fd, "System uptime: %lu\n",(u_long)tmptime); - } else { - timestr = format_uptimestr(tmptime); - if (timestr) { - ast_cli(fd, "System uptime: %s\n", timestr); - free(timestr); - } - } - } - if (ast_lastreloadtime) { - tmptime = curtime - ast_lastreloadtime; - if (printsec) { - ast_cli(fd, "Last reload: %lu\n", (u_long) tmptime); - } else { - timestr = format_uptimestr(tmptime); - if ((timestr) && (!printsec)) { - ast_cli(fd, "Last reload: %s\n", timestr); - free(timestr); - } - } - } + if (ast_startuptime) + print_uptimestr(fd, curtime - ast_startuptime, "System uptime", printsec); + if (ast_lastreloadtime) + print_uptimestr(fd, curtime - ast_lastreloadtime, "Last reload", printsec); return RESULT_SUCCESS; }