Merged revisions 51341 via svnmerge from
[asterisk/asterisk.git] / funcs / func_realtime.c
index 9610c0c..92a7297 100644 (file)
@@ -45,12 +45,13 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/utils.h"
 #include "asterisk/app.h"
 
-static int function_realtime_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
+static int function_realtime_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) 
 {
        struct ast_variable *var, *head;
         struct ast_module_user *u;
-       char *results;
-       size_t resultslen = 0;
+       struct ast_str *out;
+       size_t resultslen;
+       int n;
        AST_DECLARE_APP_ARGS(args,
                AST_APP_ARG(family);
                AST_APP_ARG(fieldmatch);
@@ -74,26 +75,30 @@ static int function_realtime_read(struct ast_channel *chan, char *cmd, char *dat
        if (!args.delim2)
                args.delim2 = "=";
 
-       head = ast_load_realtime(args.family, args.fieldmatch, args.value, NULL);
+       head = ast_load_realtime_all(args.family, args.fieldmatch, args.value, NULL);
 
        if (!head) {
                ast_module_user_remove(u);
                return -1;
        }
+       resultslen = 0;
+       n = 0;
+       for (var = head; var; n++, var = var->next)
+               resultslen += strlen(var->name) + strlen(var->value);
+       /* add space for delimiters and final '\0' */
+       resultslen += n * (strlen(args.delim1) + strlen(args.delim2)) + 1;
+
+       out = ast_str_alloca(resultslen);
        for (var = head; var; var = var->next)
-               resultslen += strlen(var->name) + strlen(var->value) + 2;
-
-       results = alloca(resultslen);
-       for (var = head; var; var = var->next)
-               ast_build_string(&results, &resultslen, "%s%s%s%s", var->name, args.delim2, var->value, args.delim1);
-       ast_copy_string(buf, results, len);
+               ast_str_append(&out, 0, "%s%s%s%s", var->name, args.delim2, var->value, args.delim1);
+       ast_copy_string(buf, out->str, len);
 
        ast_module_user_remove(u);
 
        return 0;
 }
 
-static int function_realtime_write(struct ast_channel *chan, char *cmd, char *data, const char *value)
+static int function_realtime_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
 {
         struct ast_module_user *u;
        int res = 0;