]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
When executing a dynamic feature, don't look it up a second time by digit pattern
authorRussell Bryant <russell@russellbryant.com>
Thu, 23 Aug 2007 20:16:41 +0000 (20:16 +0000)
committerRussell Bryant <russell@russellbryant.com>
Thu, 23 Aug 2007 20:16:41 +0000 (20:16 +0000)
after we already looked it up by name.  This causes broken behavior if there is
more than one feature defined with the same digit pattern.
(closes issue #10539, reported by bungalow, patch by me)

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@80573 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/features.h
res/res_features.c

index db25e7d238d16f5ce34e83306ac5863e7bed9a1c..7072406ab79fea8de338047bc3ba5824f1b1de51 100644 (file)
@@ -38,7 +38,7 @@ struct ast_call_feature {
        char sname[FEATURE_SNAME_LEN];
        char exten[FEATURE_MAX_LEN];
        char default_exten[FEATURE_MAX_LEN];
-       int (*operation)(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense);
+       int (*operation)(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense, void *data);
        unsigned int flags;
        char app[FEATURE_APP_LEN];              
        char app_args[FEATURE_APP_ARGS_LEN];
index 1d616657f4a32b4a09a0aef2f3557f64da4d2d22..90e79650c88ebf32053ea8b68804f8c9e42d80ab 100644 (file)
@@ -495,7 +495,7 @@ static void set_peers(struct ast_channel **caller, struct ast_channel **callee,
 }
 
 /*! \brief support routing for one touch call parking */
-static int builtin_parkcall(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense)
+static int builtin_parkcall(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense, void *data)
 {
        struct ast_channel *parker;
         struct ast_channel *parkee;
@@ -528,7 +528,7 @@ static int builtin_parkcall(struct ast_channel *chan, struct ast_channel *peer,
 
 }
 
-static int builtin_automonitor(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense)
+static int builtin_automonitor(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense, void *data)
 {
        char *caller_chan_id = NULL, *callee_chan_id = NULL, *args = NULL, *touch_filename = NULL;
        int x = 0;
@@ -612,7 +612,7 @@ static int builtin_automonitor(struct ast_channel *chan, struct ast_channel *pee
        return -1;
 }
 
-static int builtin_disconnect(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense)
+static int builtin_disconnect(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense, void *data)
 {
        if (option_verbose > 3)
                ast_verbose(VERBOSE_PREFIX_3 "User hit '%s' to disconnect call.\n", code);
@@ -639,7 +639,7 @@ static const char *real_ctx(struct ast_channel *transferer, struct ast_channel *
         return s;  
 }
 
-static int builtin_blindtransfer(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense)
+static int builtin_blindtransfer(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense, void *data)
 {
        struct ast_channel *transferer;
        struct ast_channel *transferee;
@@ -742,7 +742,7 @@ static int check_compat(struct ast_channel *c, struct ast_channel *newchan)
        return 0;
 }
 
-static int builtin_atxfer(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense)
+static int builtin_atxfer(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense, void *data)
 {
        struct ast_channel *transferer;
        struct ast_channel *transferee;
@@ -948,20 +948,13 @@ static struct ast_call_feature *find_dynamic_feature(const char *name)
 }
 
 /*! \brief exec an app by feature */
-static int feature_exec_app(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense)
+static int feature_exec_app(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, char *code, int sense, void *data)
 {
        struct ast_app *app;
-       struct ast_call_feature *feature;
+       struct ast_call_feature *feature = data;
        struct ast_channel *work, *idle;
        int res;
 
-       AST_LIST_LOCK(&feature_list);
-       AST_LIST_TRAVERSE(&feature_list, feature, feature_entry) {
-               if (!strcasecmp(feature->exten, code))
-                       break;
-       }
-       AST_LIST_UNLOCK(&feature_list);
-
        if (!feature) { /* shouldn't ever happen! */
                ast_log(LOG_NOTICE, "Found feature before, but at execing we've lost it??\n");
                return -1; 
@@ -1066,7 +1059,7 @@ static int ast_feature_interpret(struct ast_channel *chan, struct ast_channel *p
                    !ast_strlen_zero(builtin_features[x].exten)) {
                        /* Feature is up for consideration */
                        if (!strcmp(builtin_features[x].exten, code)) {
-                               res = builtin_features[x].operation(chan, peer, config, code, sense);
+                               res = builtin_features[x].operation(chan, peer, config, code, sense, NULL);
                                break;
                        } else if (!strncmp(builtin_features[x].exten, code, strlen(code))) {
                                if (res == FEATURE_RETURN_PASSDIGITS)
@@ -1092,7 +1085,7 @@ static int ast_feature_interpret(struct ast_channel *chan, struct ast_channel *p
                if (!strcmp(feature->exten, code)) {
                        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);
+                       res = feature->operation(chan, peer, config, code, sense, feature);
                        AST_LIST_UNLOCK(&feature_list);
                        break;
                } else if (!strncmp(feature->exten, code, strlen(code)))