diff --git a/apps/app_chanspy.c b/apps/app_chanspy.c index 48a659354d9eb0f8db0d28da8d7b702b7cd5f0ce..4561d988d821023b2ce0566d4153d250b0f37fc8 100755 --- a/apps/app_chanspy.c +++ b/apps/app_chanspy.c @@ -81,6 +81,7 @@ struct chanspy_translation_helper { /* Prototypes */ static struct ast_channel *local_get_channel_by_name(char *name); +static struct ast_channel *local_get_channel_begin_name(char *name); static struct ast_channel *local_channel_walk(struct ast_channel *chan); static void spy_release(struct ast_channel *chan, void *data); static void *spy_alloc(struct ast_channel *chan, void *params); @@ -116,6 +117,24 @@ static struct ast_channel *local_channel_walk(struct ast_channel *chan) return ret; } +static struct ast_channel *local_get_channel_begin_name(char *name) +{ + struct ast_channel *chan, *ret = NULL; + ast_mutex_lock(&modlock); + chan = local_channel_walk(NULL); + while (chan) { + if (!strncmp(chan->name, name, strlen(name))) { + ret = chan; + break; + } + chan = local_channel_walk(chan); + } + ast_mutex_unlock(&modlock); + + return ret; +} + + static void spy_release(struct ast_channel *chan, void *data) { struct chanspy_translation_helper *csth = data; @@ -420,7 +439,7 @@ static int chanspy_exec(struct ast_channel *chan, void *data) char *argv[5]; char *mygroup = NULL; int bronly = 0; - + int chosen = 0; if (!(args = ast_strdupa((char *)data))) { ast_log(LOG_ERROR, "Out of memory!\n"); @@ -493,9 +512,10 @@ static int chanspy_exec(struct ast_channel *chan, void *data) char *group = NULL; int igrp = 1; - if (peer == prev) { + if (peer == prev && !chosen) { break; } + chosen = 0; group = pbx_builtin_getvar_helper(peer, "SPYGROUP"); if (mygroup) { if (!group || strcmp(mygroup, group)) { @@ -540,17 +560,17 @@ static int chanspy_exec(struct ast_channel *chan, void *data) ALL_DONE(u, -1); } else if (res > 1 && spec) { snprintf(name, AST_NAME_STRLEN, "%s/%d", spec, res); - if (!silent) - ast_say_digits(chan, res, "", chan->language); - peer=local_get_channel_by_name(name); + if ((peer = local_get_channel_begin_name(name))) { + chosen = 1; + } continue; } } } } - - if ((peer = local_channel_walk(peer)) == NULL) + if ((peer = local_channel_walk(peer)) == NULL) { break; + } } waitms = count ? 100 : 5000; }