From db99815a6a325078b5c879697bb22ee889e7eb46 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Mon, 17 Sep 2007 16:46:59 +0000 Subject: [PATCH] Handle the case where there are multiple dynamic features with the same digit mapping, but won't always match the activated on/by access controls. In that case, the code needs to keep trying features for a match. (reported by Atis on the asterisk-dev list, patched by me) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@82594 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_features.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/res/res_features.c b/res/res_features.c index b863be921c..0cf317843d 100644 --- a/res/res_features.c +++ b/res/res_features.c @@ -479,6 +479,7 @@ int ast_masq_park_call(struct ast_channel *rchan, struct ast_channel *peer, int #define FEATURE_RETURN_PASSDIGITS 21 #define FEATURE_RETURN_STOREDIGITS 22 #define FEATURE_RETURN_SUCCESS 23 +#define FEATURE_RETURN_KEEPTRYING 24 #define FEATURE_SENSE_CHAN (1 << 0) #define FEATURE_SENSE_PEER (1 << 1) @@ -966,7 +967,7 @@ static int feature_exec_app(struct ast_channel *chan, struct ast_channel *peer, if (sense == FEATURE_SENSE_CHAN) { if (!ast_test_flag(feature, AST_FEATURE_FLAG_BYCALLER)) - return FEATURE_RETURN_PASSDIGITS; + return FEATURE_RETURN_KEEPTRYING; if (ast_test_flag(feature, AST_FEATURE_FLAG_ONSELF)) { work = chan; idle = peer; @@ -976,7 +977,7 @@ static int feature_exec_app(struct ast_channel *chan, struct ast_channel *peer, } } else { if (!ast_test_flag(feature, AST_FEATURE_FLAG_BYCALLEE)) - return FEATURE_RETURN_PASSDIGITS; + return FEATURE_RETURN_KEEPTRYING; if (ast_test_flag(feature, AST_FEATURE_FLAG_ONSELF)) { work = peer; idle = chan; @@ -1090,8 +1091,11 @@ static int ast_feature_interpret(struct ast_channel *chan, struct ast_channel *p if (option_verbose > 2) ast_verbose(VERBOSE_PREFIX_3 " Feature Found: %s exten: %s\n",feature->sname, tok); res = feature->operation(chan, peer, config, code, sense, feature); - AST_LIST_UNLOCK(&feature_list); - break; + if (res != FEATURE_RETURN_KEEPTRYING) { + AST_LIST_UNLOCK(&feature_list); + break; + } + res = FEATURE_RETURN_PASSDIGITS; } else if (!strncmp(feature->exten, code, strlen(code))) res = FEATURE_RETURN_STOREDIGITS; -- 2.47.3