From 13183a8f99dccab5646038204760965b5558c77a Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Mon, 17 Sep 2007 16:58:23 +0000 Subject: Merged revisions 82594 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r82594 | russell | 2007-09-17 11:46:59 -0500 (Mon, 17 Sep 2007) | 5 lines 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/trunk@82595 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_features.c | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) (limited to 'res') diff --git a/res/res_features.c b/res/res_features.c index 6427b8fb8..28cb0c3aa 100644 --- a/res/res_features.c +++ b/res/res_features.c @@ -549,6 +549,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) @@ -1287,23 +1288,6 @@ static struct feature_group *find_group(const char *name) { return fg; } -/*! - * \brief Find a feature extension - * \param fg, code - * \retval feature group extension on success. - * \retval NULL on failure. -*/ -static struct feature_group_exten *find_group_exten(struct feature_group *fg, const char *code) { - struct feature_group_exten *fge = NULL; - - AST_LIST_TRAVERSE(&fg->features, fge, entry) { - if(!strcasecmp(fge->exten, code)) - break; - } - - return fge; -} - void ast_rdlock_call_features(void) { ast_rwlock_rdlock(&features_lock); @@ -1347,7 +1331,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; @@ -1357,7 +1341,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; @@ -1473,10 +1457,20 @@ static int ast_feature_interpret(struct ast_channel *chan, struct ast_channel *p fg = find_group(tok); - if (fg && (fge = find_group_exten(fg, code))) { - res = fge->feature->operation(chan, peer, config, code, sense, fge->feature); - AST_RWLIST_UNLOCK(&feature_groups); - continue; + if (fg) { + AST_LIST_TRAVERSE(&fg->features, fge, entry) { + if (strcasecmp(fge->exten, code)) + continue; + + res = fge->feature->operation(chan, peer, config, code, sense, fge->feature); + if (res != FEATURE_RETURN_KEEPTRYING) { + AST_RWLIST_UNLOCK(&feature_groups); + break; + } + res = FEATURE_RETURN_PASSDIGITS; + } + if (fge) + break; } AST_RWLIST_UNLOCK(&feature_groups); @@ -1491,8 +1485,11 @@ static int ast_feature_interpret(struct ast_channel *chan, struct ast_channel *p if (!strcmp(feature->exten, code)) { ast_verb(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; -- cgit v1.2.3