Merged revisions 51341 via svnmerge from
[asterisk/asterisk.git] / funcs / func_realtime.c
index bf61e41..92a7297 100644 (file)
  * \ingroup functions
  */
 
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
 #include <sys/types.h>
 
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
 #include "asterisk/file.h"
 #include "asterisk/channel.h"
 #include "asterisk/pbx.h"
@@ -43,20 +43,15 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/lock.h"
 #include "asterisk/logger.h"
 #include "asterisk/utils.h"
-#include "asterisk/module.h"
 #include "asterisk/app.h"
 
-LOCAL_USER_DECL;
-
-static char *tdesc = "Read/Write values from a RealTime repository";
-
-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 localuser *u;
-       char *results;
-       size_t resultslen = 0;
-
+        struct ast_module_user *u;
+       struct ast_str *out;
+       size_t resultslen;
+       int n;
        AST_DECLARE_APP_ARGS(args,
                AST_APP_ARG(family);
                AST_APP_ARG(fieldmatch);
@@ -70,7 +65,9 @@ static int function_realtime_read(struct ast_channel *chan, char *cmd, char *dat
                ast_log(LOG_WARNING, "Syntax: REALTIME(family|fieldmatch[|value[|delim1[|delim2]]]) - missing argument!\n");
                return -1;
        }
-       LOCAL_USER_ADD(u);
+
+       u = ast_module_user_add(chan);
+
        AST_STANDARD_APP_ARGS(args, data);
 
        if (!args.delim1)
@@ -78,30 +75,33 @@ 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) {
-               LOCAL_USER_REMOVE(u);
+               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;
+               ast_str_append(&out, 0, "%s%s%s%s", var->name, args.delim2, var->value, args.delim1);
+       ast_copy_string(buf, out->str, len);
 
-       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_module_user_remove(u);
 
-       LOCAL_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 localuser *u;
+        struct ast_module_user *u;
        int res = 0;
-
-
        AST_DECLARE_APP_ARGS(args,
                AST_APP_ARG(family);
                AST_APP_ARG(fieldmatch);
@@ -114,7 +114,8 @@ static int function_realtime_write(struct ast_channel *chan, char *cmd, char *da
                return -1;
        }
 
-       LOCAL_USER_ADD(u);
+       u = ast_module_user_add(chan);
+
        AST_STANDARD_APP_ARGS(args, data);
 
        res = ast_update_realtime(args.family, args.fieldmatch, args.value, args.field, (char *)value, NULL);
@@ -123,7 +124,8 @@ static int function_realtime_write(struct ast_channel *chan, char *cmd, char *da
                ast_log(LOG_WARNING, "Failed to update. Check the debug log for possible data repository related entries.\n");
        }
 
-       LOCAL_USER_REMOVE(u);
+       ast_module_user_remove(u);
+
        return 0;
 }
 
@@ -145,30 +147,20 @@ struct ast_custom_function realtime_function = {
        .write = function_realtime_write,
 };
 
-static int unload_module(void *mod)
+static int unload_module(void)
 {
         int res = ast_custom_function_unregister(&realtime_function);
 
-       STANDARD_HANGUP_LOCALUSERS;
+       ast_module_user_hangup_all();
 
         return res;
 }
 
-static int load_module(void *mod)
+static int load_module(void)
 {
         int res = ast_custom_function_register(&realtime_function);
 
         return res;
 }
 
-static const char *description(void)
-{
-        return tdesc;
-}
-
-static const char *key(void)
-{
-        return ASTERISK_GPL_KEY;
-}
-
-STD_MOD(MOD_1, NULL, NULL, NULL);
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Read/Write values from a RealTime repository");