From: Russell Bryant Date: Mon, 30 Jul 2007 19:35:33 +0000 (+0000) Subject: Improve ast_agi_fdprintf() by using the ast_str() API. X-Git-Tag: 1.6.0-beta1~3^2~1862 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=38bb9400def5443355871cb61ce15839fd9fde2b;p=thirdparty%2Fasterisk.git Improve ast_agi_fdprintf() by using the ast_str() API. * Use a thread local ast_str for building the string that will be written out to the console for debug, and to the FD for the AGI itself, instead of allocating a buffer on the heap every time the function is called. * Use the information contained within the ast_str to determine how many bytes need to be written instead of calling strlen(). git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@77791 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/res/res_agi.c b/res/res_agi.c index 023d8d1316..37e3ca9abc 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -115,14 +115,20 @@ enum agi_result { static agi_command *find_command(char *cmds[], int exact); +AST_THREADSTORAGE(agi_buf); +#define AGI_BUF_INITSIZE 256 + int ast_agi_fdprintf(int fd, char *fmt, ...) { - char *stuff; int res = 0; - va_list ap; + struct ast_str *buf; + + if (!(buf = ast_str_thread_get(&agi_buf, AGI_BUF_INITSIZE))) + return -1; + va_start(ap, fmt); - res = vasprintf(&stuff, fmt, ap); + res = ast_str_set_va(&buf, 0, fmt, ap); va_end(ap); if (res == -1) { @@ -131,9 +137,9 @@ int ast_agi_fdprintf(int fd, char *fmt, ...) } if (agidebug) - ast_verbose("AGI Tx >> %s", stuff); - ast_carefulwrite(fd, stuff, strlen(stuff), 100); - ast_free(stuff); + ast_verbose("AGI Tx >> %s", buf->str); + + ast_carefulwrite(fd, buf->str, buf->used, 100); return res; }