diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-10-28 13:46:55 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-10-28 13:46:55 +0000 |
commit | f59eb98821f88a4108c78b2853b0cca75ad8caf2 (patch) | |
tree | b387b8fef99bd9ef3a2f0e3facf58071ce44d1ef /funcs | |
parent | ff0fcde5c61c9f9cb0315bc47ecff200b27db505 (diff) |
Add autoservice to several more functions which might delay in their responses.
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: http://svn.digium.com/svn/asterisk/branches/1.4@87262 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'funcs')
-rw-r--r-- | funcs/func_cut.c | 12 | ||||
-rw-r--r-- | funcs/func_odbc.c | 49 | ||||
-rw-r--r-- | funcs/func_realtime.c | 18 | ||||
-rw-r--r-- | funcs/func_strings.c | 16 |
4 files changed, 88 insertions, 7 deletions
diff --git a/funcs/func_cut.c b/funcs/func_cut.c index 09340cac5..bcabd0508 100644 --- a/funcs/func_cut.c +++ b/funcs/func_cut.c @@ -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; } diff --git a/funcs/func_odbc.c b/funcs/func_odbc.c index c5ea6fcda..8bc070767 100644 --- a/funcs/func_odbc.c +++ b/funcs/func_odbc.c @@ -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; } diff --git a/funcs/func_realtime.c b/funcs/func_realtime.c index 6f52d6b78..c9e730bc1 100644 --- a/funcs/func_realtime.c +++ b/funcs/func_realtime.c @@ -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; } diff --git a/funcs/func_strings.c b/funcs/func_strings.c index 3c8ead803..c5849c0fc 100644 --- a/funcs/func_strings.c +++ b/funcs/func_strings.c @@ -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; } |