Applications no longer need to call ast_module_user_add and ast_module_user_remove...
[asterisk/asterisk.git] / apps / app_while.c
index 754154e..f7da65b 100644 (file)
  * \ingroup applications
  */
 
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
 
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
 #include "asterisk/file.h"
 #include "asterisk/logger.h"
 #include "asterisk/channel.h"
@@ -44,9 +44,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/lock.h"
 #include "asterisk/options.h"
 
-#define ALL_DONE(u,ret) {LOCAL_USER_REMOVE(u); return ret;}
-
-
 static char *start_app = "While";
 static char *start_desc = 
 "Usage:  While(<expr>)\n"
@@ -75,10 +72,6 @@ static char *continue_desc =
 "Returns to the top of the while loop and re-evaluates the conditional.\n";
 static char *continue_synopsis = "Restart a While loop";
 
-static char *tdesc = "While Loops and Conditional Execution";
-
-LOCAL_USER_DECL;
-
 #define VAR_SIZE 64
 
 
@@ -129,7 +122,7 @@ static int find_matching_endwhile(struct ast_channel *chan)
        struct ast_context *c;
        int res=-1;
 
-       if (ast_lock_contexts()) {
+       if (ast_rdlock_contexts()) {
                ast_log(LOG_ERROR, "Failed to lock contexts list\n");
                return -1;
        }
@@ -137,7 +130,7 @@ static int find_matching_endwhile(struct ast_channel *chan)
        for (c=ast_walk_contexts(NULL); c; c=ast_walk_contexts(c)) {
                struct ast_exten *e;
 
-               if (!ast_lock_context(c)) {
+               if (!ast_rdlock_context(c)) {
                        if (!strcmp(ast_get_context_name(c), chan->context)) {
                                /* This is the matching context we want */
                                int cur_priority = chan->priority + 1, level=1;
@@ -168,7 +161,6 @@ static int find_matching_endwhile(struct ast_channel *chan)
 static int _while_exec(struct ast_channel *chan, void *data, int end)
 {
        int res=0;
-       struct localuser *u;
        const char *while_pri = NULL;
        char *my_name = NULL;
        const char *condition = NULL, *label = NULL;
@@ -183,14 +175,11 @@ static int _while_exec(struct ast_channel *chan, void *data, int end)
                return -1;
        }
 
-       LOCAL_USER_ADD(u);
-
        /* dont want run away loops if the chan isn't even up
           this is up for debate since it slows things down a tad ......
        */
        if (ast_waitfordigit(chan,1) < 0)
-               ALL_DONE(u,-1);
-
+               return -1;
 
        for (x=0;;x++) {
                if (get_index(chan, prefix, x)) {
@@ -202,9 +191,8 @@ static int _while_exec(struct ast_channel *chan, void *data, int end)
        snprintf(used_index, VAR_SIZE, "%d", used_index_i);
        snprintf(new_index, VAR_SIZE, "%d", used_index_i + 1);
        
-       if (!end) {
-               condition = ast_strdupa((char *) data);
-       }
+       if (!end)
+               condition = ast_strdupa(data);
 
        size = strlen(chan->context) + strlen(chan->exten) + 32;
        my_name = alloca(size);
@@ -236,8 +224,8 @@ static int _while_exec(struct ast_channel *chan, void *data, int end)
                pbx_builtin_setvar_helper(chan, my_name, NULL);
                snprintf(end_varname,VAR_SIZE,"END_%s",varname);
                if ((goto_str=pbx_builtin_getvar_helper(chan, end_varname))) {
-                       pbx_builtin_setvar_helper(chan, end_varname, NULL);
                        ast_parseable_goto(chan, goto_str);
+                       pbx_builtin_setvar_helper(chan, end_varname, NULL);
                } else {
                        int pri = find_matching_endwhile(chan);
                        if (pri > 0) {
@@ -248,7 +236,7 @@ static int _while_exec(struct ast_channel *chan, void *data, int end)
                                ast_log(LOG_WARNING, "Couldn't find matching EndWhile? (While at %s@%s priority %d)\n", chan->context, chan->exten, chan->priority);
                        }
                }
-               ALL_DONE(u,res);
+               return res;
        }
 
        if (!end && !while_pri) {
@@ -273,11 +261,8 @@ static int _while_exec(struct ast_channel *chan, void *data, int end)
                }
                ast_parseable_goto(chan, while_pri);
        }
-       
 
-
-
-       ALL_DONE(u, res);
+       return res;
 }
 
 static int while_start_exec(struct ast_channel *chan, void *data) {
@@ -311,7 +296,7 @@ static int while_continue_exec(struct ast_channel *chan, void *data)
        return 0;
 }
 
-static int unload_module(void *mod)
+static int unload_module(void)
 {
        int res;
        
@@ -320,12 +305,10 @@ static int unload_module(void *mod)
        res |= ast_unregister_application(exit_app);
        res |= ast_unregister_application(continue_app);
 
-       STANDARD_HANGUP_LOCALUSERS;
-
        return res;
 }
 
-static int load_module(void *mod)
+static int load_module(void)
 {
        int res;
 
@@ -337,14 +320,4 @@ static int load_module(void *mod)
        return res;
 }
 
-static const char *description(void)
-{
-       return tdesc;
-}
-
-static const char *key(void)
-{
-       return ASTERISK_GPL_KEY;
-}
-
-STD_MOD1;
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "While Loops and Conditional Execution");