diff options
Diffstat (limited to 'apps/app_chanspy.c')
-rw-r--r-- | apps/app_chanspy.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/apps/app_chanspy.c b/apps/app_chanspy.c index a109673f5..bea2b7d1e 100644 --- a/apps/app_chanspy.c +++ b/apps/app_chanspy.c @@ -314,11 +314,16 @@ static int channel_spy(struct ast_channel *chan, struct ast_channel *spyee, int return running; } -static struct ast_channel *next_channel(const struct ast_channel *last) +static struct ast_channel *next_channel(const struct ast_channel *last, const char *spec) { struct ast_channel *this; - if ((this = ast_channel_walk_locked(last))) + if (spec) + this = ast_walk_channel_by_name_prefix_locked(last, spec, strlen(spec)); + else + this = ast_channel_walk_locked(last); + + if (this) ast_channel_unlock(this); return this; @@ -364,23 +369,23 @@ static int common_exec(struct ast_channel *chan, const int silent, const int bro waitms = 100; peer = prev = next = NULL; - for (peer = next_channel(peer); + for (peer = next_channel(peer, spec); peer; - prev = peer, peer = next ? next : next_channel(peer), next = NULL) { + prev = peer, peer = next ? next : next_channel(peer, spec), next = NULL) { const char *group; - int igrp = 0; + int igrp = !mygroup; char *groups[25]; int num_groups = 0; char *dup_group; int x; char *s; - if (peer == chan) - continue; - if (peer == prev) break; + if (peer == chan) + continue; + if (mygroup) { if ((group = pbx_builtin_getvar_helper(peer, "SPYGROUP"))) { dup_group = ast_strdupa(group); @@ -388,22 +393,17 @@ static int common_exec(struct ast_channel *chan, const int silent, const int bro sizeof(groups) / sizeof(groups[0])); } - if (num_groups) { - for (x = 0; x < num_groups; x++) { - if (!strcmp(mygroup, groups[x])) { - igrp = 1; - break; - } + for (x = 0; x < num_groups; x++) { + if (!strcmp(mygroup, groups[x])) { + igrp = 1; + break; } - } + } } if (!igrp) continue; - if (spec && strncasecmp(peer->name, spec, strlen(spec))) - continue; - if (bronly && !ast_bridged_channel(peer)) continue; |