fix behaviour for earlymatch and matchmore.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@26719 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Luigi Rizzo 2006-05-11 07:49:12 +00:00
parent d04f0da698
commit 62caa0be55
1 changed files with 4 additions and 16 deletions

20
pbx.c
View File

@ -913,8 +913,6 @@ static struct ast_exten *pbx_find_extension(struct ast_channel *chan,
struct ast_include *i; struct ast_include *i;
struct ast_sw *sw; struct ast_sw *sw;
struct ast_exten *earlymatch = NULL;
/* Initialize status if appropriate */ /* Initialize status if appropriate */
if (q->stacklen == 0) { if (q->stacklen == 0) {
q->status = STATUS_NO_CONTEXT; q->status = STATUS_NO_CONTEXT;
@ -952,14 +950,11 @@ static struct ast_exten *pbx_find_extension(struct ast_channel *chan,
/* 0 on fail, 1 on match, 2 on earlymatch */ /* 0 on fail, 1 on match, 2 on earlymatch */
if (match && (!eroot->matchcid || matchcid(eroot->cidmatch, callerid))) { if (match && (!eroot->matchcid || matchcid(eroot->cidmatch, callerid))) {
if (match == 2 && action == E_MATCHMORE && !earlymatch) { if (match == 2 && action == E_MATCHMORE) {
/* Match an extension ending in '!'. /* We match an extension ending in '!'.
* As far as I can tell the decision in this case is final * The decision in this case is final and is NULL (no match).
* and we should just return NULL to mark failure
* (and get rid of the earlymatch variable and the associated
* processing outside the loop).
*/ */
earlymatch = eroot; return NULL;
} else { } else {
if (q->status < STATUS_NO_PRIORITY) if (q->status < STATUS_NO_PRIORITY)
q->status = STATUS_NO_PRIORITY; q->status = STATUS_NO_PRIORITY;
@ -983,13 +978,6 @@ static struct ast_exten *pbx_find_extension(struct ast_channel *chan,
} }
} }
} }
if (earlymatch) {
/* Bizarre logic for E_MATCHMORE. We return zero to break out
of the loop waiting for more digits, and _then_ match (normally)
the extension we ended up with. We got an early-matching wildcard
pattern, so return NULL to break out of the loop. */
return NULL;
}
/* Check alternative switches */ /* Check alternative switches */
AST_LIST_TRAVERSE(&tmp->alts, sw, list) { AST_LIST_TRAVERSE(&tmp->alts, sw, list) {
struct ast_switch *asw = pbx_findswitch(sw->name); struct ast_switch *asw = pbx_findswitch(sw->name);