diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 686496bee6..0742c3010a 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -14631,7 +14631,7 @@ static char *sip_show_user(struct ast_cli_entry *e, int cmd, struct ast_cli_args static char *sip_show_sched(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - char cbuf[2256]; + struct ast_str *cbuf; struct ast_cb_names cbnames = {9, { "retrans_pkt", "__sip_autodestruct", "expire_register", @@ -14661,9 +14661,13 @@ static char *sip_show_sched(struct ast_cli_entry *e, int cmd, struct ast_cli_arg case CLI_GENERATE: return NULL; } + + cbuf = ast_str_alloca(2048); + ast_cli(a->fd, "\n"); - ast_sched_report(sched, cbuf, sizeof(cbuf), &cbnames); - ast_cli(a->fd, "%s", cbuf); + ast_sched_report(sched, &cbuf, &cbnames); + ast_cli(a->fd, "%s", cbuf->str); + return CLI_SUCCESS; } diff --git a/include/asterisk/sched.h b/include/asterisk/sched.h index f9e1ca5d2d..564453ae29 100644 --- a/include/asterisk/sched.h +++ b/include/asterisk/sched.h @@ -147,13 +147,12 @@ void sched_context_destroy(struct sched_context *c); typedef int (*ast_sched_cb)(const void *data); #define AST_SCHED_CB(a) ((ast_sched_cb)(a)) -struct ast_cb_names -{ +struct ast_cb_names { int numassocs; char *list[10]; ast_sched_cb cblist[10]; }; -char *ast_sched_report(struct sched_context *con, char *buf, int bufsiz, struct ast_cb_names *cbnames); +void ast_sched_report(struct sched_context *con, struct ast_str **buf, struct ast_cb_names *cbnames); /*! \brief Adds a scheduled event * Schedule an event to take place at some point in the future. callback diff --git a/main/sched.c b/main/sched.c index 8b69814a3f..e6fe0549f2 100644 --- a/main/sched.c +++ b/main/sched.c @@ -528,41 +528,34 @@ int _ast_sched_del(struct sched_context *con, int id, const char *file, int line return 0; } - -char *ast_sched_report(struct sched_context *con, char *buf, int bufsiz, struct ast_cb_names *cbnames) +void ast_sched_report(struct sched_context *con, struct ast_str **buf, struct ast_cb_names *cbnames) { - int *countlist,i; + int i; struct sched *cur; - char buf2[1200]; - ast_sched_cb xxx = NULL; - - buf[0] = 0; - sprintf(buf, " Highwater = %d\n schedcnt = %d\n", con->highwater, con->schedcnt); - countlist = ast_calloc(sizeof(int),cbnames->numassocs+1); + int countlist[cbnames->numassocs + 1]; + ast_str_set(buf, 0, " Highwater = %d\n schedcnt = %d\n", con->highwater, con->schedcnt); + AST_DLLIST_TRAVERSE(&con->schedq, cur, list) { /* match the callback to the cblist */ - for (i=0;inumassocs;i++) { - if (cur->callback == cbnames->cblist[i]) + for (i = 0; i < cbnames->numassocs; i++) { + if (cur->callback == cbnames->cblist[i]) { break; + } } - if (i < cbnames->numassocs) + if (i < cbnames->numassocs) { countlist[i]++; - else { - xxx = cur->callback; + } else { countlist[cbnames->numassocs]++; } } - for (i=0;inumassocs;i++) { - sprintf(buf2," %s : %d\n", cbnames->list[i], countlist[i]); - strcat(buf, buf2); - } - sprintf(buf2," : %d\n", xxx, countlist[cbnames->numassocs]); - strcat( buf, buf2); - return buf; -} + for (i = 0; i < cbnames->numassocs; i++) { + ast_str_append(buf, 0, " %s : %d\n", cbnames->list[i], countlist[i]); + } + ast_str_append(buf, 0, " : %d\n", countlist[cbnames->numassocs]); +} /*! \brief Dump the contents of the scheduler to LOG_DEBUG */ void ast_sched_dump(const struct sched_context *con)