]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Add autoservice to several more functions which might delay in their responses.
authorTilghman Lesher <tilghman@meg.abyt.es>
Sun, 28 Oct 2007 13:46:55 +0000 (13:46 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Sun, 28 Oct 2007 13:46:55 +0000 (13:46 +0000)
Also, make sure that func_odbc functions have a channel on which to set
variables.
Reported by russell
Fixed by tilghman
Closes issue #11099

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@87262 65c4cc65-6c06-0410-ace0-fbb531ad65f3

funcs/func_cut.c
funcs/func_odbc.c
funcs/func_realtime.c
funcs/func_strings.c

index 09340cac5a52321d30365a529173b64442cc5505..bcabd05086627facce402a6b33528f9475d7ec97 100644 (file)
@@ -125,7 +125,7 @@ static int cut_internal(struct ast_channel *chan, char *data, char *buffer, size
        );
 
        memset(buffer, 0, buflen); 
-       
+
        parse = ast_strdupa(data);
 
        AST_STANDARD_APP_ARGS(args, parse);
@@ -253,7 +253,10 @@ static int acf_cut_exec(struct ast_channel *chan, char *cmd, char *data, char *b
        int ret = -1;
        struct ast_module_user *u;
 
-       u = ast_module_user_add(chan);
+       if (chan) {
+               ast_autoservice_start(chan);
+               u = ast_module_user_add(chan);
+       }
 
        switch (cut_internal(chan, data, buf, len)) {
        case ERROR_NOARG:
@@ -272,7 +275,10 @@ static int acf_cut_exec(struct ast_channel *chan, char *cmd, char *data, char *b
                ast_log(LOG_ERROR, "Unknown internal error\n");
        }
 
-       ast_module_user_remove(u);
+       if (chan) {
+               ast_module_user_remove(u);
+               ast_autoservice_stop(chan);
+       }
 
        return ret;
 }
index c5ea6fcda08baabb6ce6efb124f1c0f4fa3e0d97..8bc07076756dd15c82a0bf81989a1254cd78ee36 100644 (file)
@@ -99,7 +99,7 @@ static int acf_odbc_write(struct ast_channel *chan, char *cmd, char *s, const ch
        struct odbc_obj *obj;
        struct acf_odbc_query *query;
        char *t, buf[2048]="", varname[15];
-       int i;
+       int i, bogus_chan = 0;
        AST_DECLARE_APP_ARGS(values,
                AST_APP_ARG(field)[100];
        );
@@ -130,12 +130,24 @@ static int acf_odbc_write(struct ast_channel *chan, char *cmd, char *s, const ch
                return -1;
        }
 
+       if (!chan) {
+               if ((chan = ast_channel_alloc(0, 0, "", "", "", "", "", 0, "Bogus/func_odbc")))
+                       bogus_chan = 1;
+       }
+
+       if (chan)
+               ast_autoservice_start(chan);
+
        /* Parse our arguments */
        t = value ? ast_strdupa(value) : "";
 
        if (!s || !t) {
                ast_log(LOG_ERROR, "Out of memory\n");
                AST_LIST_UNLOCK(&queries);
+               if (chan)
+                       ast_autoservice_stop(chan);
+               if (bogus_chan)
+                       ast_channel_free(chan);
                return -1;
        }
 
@@ -193,6 +205,11 @@ static int acf_odbc_write(struct ast_channel *chan, char *cmd, char *s, const ch
        if (obj)
                ast_odbc_release_obj(obj);
 
+       if (chan)
+               ast_autoservice_stop(chan);
+       if (bogus_chan)
+               ast_channel_free(chan);
+
        return 0;
 }
 
@@ -201,7 +218,7 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf
        struct odbc_obj *obj;
        struct acf_odbc_query *query;
        char sql[2048] = "", varname[15];
-       int res, x, buflen = 0, escapecommas;
+       int res, x, buflen = 0, escapecommas, bogus_chan = 0;
        AST_DECLARE_APP_ARGS(args,
                AST_APP_ARG(field)[100];
        );
@@ -230,6 +247,14 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf
                return -1;
        }
 
+       if (!chan) {
+               if ((chan = ast_channel_alloc(0, 0, "", "", "", "", "", 0, "Bogus/func_odbc")))
+                       bogus_chan = 1;
+       }
+
+       if (chan)
+               ast_autoservice_start(chan);
+
        AST_STANDARD_APP_ARGS(args, s);
        for (x = 0; x < args.argc; x++) {
                snprintf(varname, sizeof(varname), "ARG%d", x + 1);
@@ -253,6 +278,10 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf
 
        if (!stmt) {
                ast_odbc_release_obj(obj);
+               if (chan)
+                       ast_autoservice_stop(chan);
+               if (bogus_chan)
+                       ast_channel_free(chan);
                return -1;
        }
 
@@ -262,6 +291,10 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf
                SQLCloseCursor(stmt);
                SQLFreeHandle (SQL_HANDLE_STMT, stmt);
                ast_odbc_release_obj(obj);
+               if (chan)
+                       ast_autoservice_stop(chan);
+               if (bogus_chan)
+                       ast_channel_free(chan);
                return -1;
        }
 
@@ -281,6 +314,10 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf
                SQLCloseCursor(stmt);
                SQLFreeHandle(SQL_HANDLE_STMT, stmt);
                ast_odbc_release_obj(obj);
+               if (chan)
+                       ast_autoservice_stop(chan);
+               if (bogus_chan)
+                       ast_channel_free(chan);
                return res1;
        }
 
@@ -300,6 +337,10 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf
                        SQLCloseCursor(stmt);
                        SQLFreeHandle(SQL_HANDLE_STMT, stmt);
                        ast_odbc_release_obj(obj);
+                       if (chan)
+                               ast_autoservice_stop(chan);
+                       if (bogus_chan)
+                               ast_channel_free(chan);
                        return -1;
                }
 
@@ -326,6 +367,10 @@ static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf
        SQLCloseCursor(stmt);
        SQLFreeHandle(SQL_HANDLE_STMT, stmt);
        ast_odbc_release_obj(obj);
+       if (chan)
+               ast_autoservice_stop(chan);
+       if (bogus_chan)
+               ast_channel_free(chan);
        return 0;
 }
 
index 6f52d6b785224b97530f5fd696191f31d6135f2b..c9e730bc1a7c2582f5b92be5ac673b0ebfd07671 100644 (file)
@@ -74,10 +74,15 @@ static int function_realtime_read(struct ast_channel *chan, char *cmd, char *dat
        if (!args.delim2)
                args.delim2 = "=";
 
+       if (chan)
+               ast_autoservice_start(chan);
+
        head = ast_load_realtime(args.family, args.fieldmatch, args.value, NULL);
 
        if (!head) {
                ast_module_user_remove(u);
+               if (chan)
+                       ast_autoservice_stop(chan);
                return -1;
        }
        for (var = head; var; var = var->next)
@@ -90,6 +95,9 @@ static int function_realtime_read(struct ast_channel *chan, char *cmd, char *dat
 
        ast_module_user_remove(u);
 
+       if (chan)
+               ast_autoservice_stop(chan);
+
        return 0;
 }
 
@@ -109,7 +117,10 @@ static int function_realtime_write(struct ast_channel *chan, char *cmd, char *da
                return -1;
        }
 
-       u = ast_module_user_add(chan);
+       if (chan) {
+               ast_autoservice_start(chan);
+               u = ast_module_user_add(chan);
+       }
 
        AST_STANDARD_APP_ARGS(args, data);
 
@@ -119,7 +130,10 @@ 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");
        }
 
-       ast_module_user_remove(u);
+       if (chan) {
+               ast_module_user_remove(u);
+               ast_autoservice_stop(chan);
+       }
 
        return 0;
 }
index 3c8ead803127288a144e701d087b645f7f9b97a0..c5849c0fc339b9060a205fc96a7d7e78695ce10d 100644 (file)
@@ -53,6 +53,9 @@ static int function_fieldqty(struct ast_channel *chan, char *cmd,
                             AST_APP_ARG(delim);
                );
 
+       if (chan)
+               ast_autoservice_start(chan);
+
        AST_STANDARD_APP_ARGS(args, parse);
        if (args.delim) {
                varsubst = alloca(strlen(args.varname) + 4);
@@ -70,6 +73,9 @@ static int function_fieldqty(struct ast_channel *chan, char *cmd,
        }
        snprintf(buf, len, "%d", fieldcount);
 
+       if (chan)
+               ast_autoservice_stop(chan);
+
        return 0;
 }
 
@@ -178,6 +184,9 @@ static int array(struct ast_channel *chan, char *cmd, char *var,
        if (!var || !value2)
                return -1;
 
+       if (chan)
+               ast_autoservice_start(chan);
+
        /* The functions this will generally be used with are SORT and ODBC_*, which
         * both return comma-delimited lists.  However, if somebody uses literal lists,
         * their commas will be translated to vertical bars by the load, and I don't
@@ -209,6 +218,9 @@ static int array(struct ast_channel *chan, char *cmd, char *var,
                }
        }
 
+       if (chan)
+               ast_autoservice_stop(chan);
+
        return 0;
 }
 
@@ -517,7 +529,11 @@ static int function_eval(struct ast_channel *chan, char *cmd, char *data,
                return -1;
        }
 
+       if (chan)
+               ast_autoservice_start(chan);
        pbx_substitute_variables_helper(chan, data, buf, len - 1);
+       if (chan)
+               ast_autoservice_stop(chan);
 
        return 0;
 }