diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-07-30 19:35:33 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-07-30 19:35:33 +0000 |
commit | 0e8d4d1cd497a5c14f8a3b43acf8d3166ac75011 (patch) | |
tree | c294ebda29120138e02a3f0c5c8f69efb435af8d /res/res_agi.c | |
parent | 3cf99f70334a6d4bfcf5895751ed691701b9e6ff (diff) |
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: http://svn.digium.com/svn/asterisk/trunk@77791 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res/res_agi.c')
-rw-r--r-- | res/res_agi.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/res/res_agi.c b/res/res_agi.c index 023d8d131..37e3ca9ab 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; } |