Merged revisions 82594 via svnmerge from
authorRussell Bryant <russell@russellbryant.com>
Mon, 17 Sep 2007 16:58:23 +0000 (16:58 +0000)
committerRussell Bryant <russell@russellbryant.com>
Mon, 17 Sep 2007 16:58:23 +0000 (16:58 +0000)
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

index 6427b8f..28cb0c3 100644 (file)
@@ -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;