revert my pass through the tree to remove checks of the result of ast_strdupa
[asterisk/asterisk.git] / apps / app_while.c
old mode 100755 (executable)
new mode 100644 (file)
index 5de2172..1ebd8f2
  * at the top of the source tree.
  */
 
-/*
+/*! \file
+ *
+ * \brief While Loop and ExecIf Implementations
  *
- * While Loop and ExecIf Implementations
+ * \author Anthony Minessale <anthmct@yahoo.com>
  * 
+ * \ingroup applications
  */
 
 #include <stdlib.h>
-#include <unistd.h>
+#include <stdio.h>
 #include <string.h>
+#include <unistd.h>
 
 #include "asterisk.h"
 
@@ -84,7 +88,14 @@ static int execif_exec(struct ast_channel *chan, void *data) {
        struct ast_app *app = NULL;
 
        LOCAL_USER_ADD(u);
-       expr = ast_strdupa((char *) data);
+
+       expr = ast_strdupa(data);
+       if (!expr) {
+               ast_log(LOG_ERROR, "Out of memory\n");
+               LOCAL_USER_REMOVE(u);
+               return -1;
+       }
+
        if ((myapp = strchr(expr,'|'))) {
                *myapp = '\0';
                myapp++;
@@ -113,7 +124,7 @@ static int execif_exec(struct ast_channel *chan, void *data) {
 #define VAR_SIZE 64
 
 
-static char *get_index(struct ast_channel *chan, const char *prefix, int index) {
+static const char *get_index(struct ast_channel *chan, const char *prefix, int index) {
        char varname[VAR_SIZE];
 
        snprintf(varname, VAR_SIZE, "%s_%d", prefix, index);
@@ -200,15 +211,15 @@ static int _while_exec(struct ast_channel *chan, void *data, int end)
 {
        int res=0;
        struct localuser *u;
-       char *while_pri = NULL;
-       char *goto_str = NULL, *my_name = NULL;
-       char *condition = NULL, *label = NULL;
+       const char *while_pri = NULL;
+       char *my_name = NULL;
+       const char *condition = NULL, *label = NULL;
        char varname[VAR_SIZE], end_varname[VAR_SIZE];
        const char *prefix = "WHILE";
        size_t size=0;
        int used_index_i = -1, x=0;
        char used_index[VAR_SIZE] = "0", new_index[VAR_SIZE] = "0";
-       
+
        if (!chan) {
                /* huh ? */
                return -1;
@@ -242,7 +253,7 @@ static int _while_exec(struct ast_channel *chan, void *data, int end)
        memset(my_name, 0, size);
        snprintf(my_name, size, "%s_%s_%d", chan->context, chan->exten, chan->priority);
        
-       if (!label || ast_strlen_zero(label)) {
+       if (ast_strlen_zero(label)) {
                if (end) 
                        label = used_index;
                else if (!(label = pbx_builtin_getvar_helper(chan, my_name))) {
@@ -262,6 +273,7 @@ static int _while_exec(struct ast_channel *chan, void *data, int end)
 
        if (!end && !ast_true(condition)) {
                /* Condition Met (clean up helper vars) */
+               const char *goto_str;
                pbx_builtin_setvar_helper(chan, varname, NULL);
                pbx_builtin_setvar_helper(chan, my_name, NULL);
         snprintf(end_varname,VAR_SIZE,"END_%s",varname);
@@ -282,6 +294,7 @@ static int _while_exec(struct ast_channel *chan, void *data, int end)
        }
 
        if (!end && !while_pri) {
+               char *goto_str;
                size = strlen(chan->context) + strlen(chan->exten) + 32;
                goto_str = alloca(size);
                memset(goto_str, 0, size);
@@ -293,6 +306,7 @@ static int _while_exec(struct ast_channel *chan, void *data, int end)
                /* END of loop */
                snprintf(end_varname, VAR_SIZE, "END_%s", varname);
                if (! pbx_builtin_getvar_helper(chan, end_varname)) {
+                       char *goto_str;
                        size = strlen(chan->context) + strlen(chan->exten) + 32;
                        goto_str = alloca(size);
                        memset(goto_str, 0, size);
@@ -319,17 +333,26 @@ static int while_end_exec(struct ast_channel *chan, void *data) {
 
 int unload_module(void)
 {
+       int res;
+       
+       res = ast_unregister_application(start_app);
+       res |= ast_unregister_application(exec_app);
+       res |= ast_unregister_application(stop_app);
+
        STANDARD_HANGUP_LOCALUSERS;
-       ast_unregister_application(start_app);
-       ast_unregister_application(exec_app);
-       return ast_unregister_application(stop_app);
+
+       return res;
 }
 
 int load_module(void)
 {
-       ast_register_application(start_app, while_start_exec, start_synopsis, start_desc);
-       ast_register_application(exec_app, execif_exec, exec_synopsis, exec_desc);
-       return ast_register_application(stop_app, while_end_exec, stop_synopsis, stop_desc);
+       int res;
+
+       res = ast_register_application(start_app, while_start_exec, start_synopsis, start_desc);
+       res |= ast_register_application(exec_app, execif_exec, exec_synopsis, exec_desc);
+       res |= ast_register_application(stop_app, while_end_exec, stop_synopsis, stop_desc);
+
+       return res;
 }
 
 char *description(void)