Improve ast_agi_fdprintf() by using the ast_str() API.
authorRussell Bryant <russell@russellbryant.com>
Mon, 30 Jul 2007 19:35:33 +0000 (19:35 +0000)
committerRussell Bryant <russell@russellbryant.com>
Mon, 30 Jul 2007 19:35:33 +0000 (19:35 +0000)
 * 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

res/res_agi.c

index 023d8d1..37e3ca9 100644 (file)
@@ -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;
 }