aboutsummaryrefslogtreecommitdiffstats
path: root/res/res_agi.c
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-07-30 19:35:33 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-07-30 19:35:33 +0000
commit0e8d4d1cd497a5c14f8a3b43acf8d3166ac75011 (patch)
treec294ebda29120138e02a3f0c5c8f69efb435af8d /res/res_agi.c
parent3cf99f70334a6d4bfcf5895751ed691701b9e6ff (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.c18
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;
}