diff --git a/apps/app_chanspy.c b/apps/app_chanspy.c index a109673f546670ba7530edb8a16e38d5cfe1de19..bea2b7d1e00da5a74ac29badde4f6395c1407919 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; diff --git a/channel.c b/channel.c index 952c7b6ad95906bdce9d8fab14c71b2eb5ad1393..82eac1db14493e2e3b8b00652d3632214f1db261 100644 --- a/channel.c +++ b/channel.c @@ -905,7 +905,8 @@ struct ast_channel *ast_get_channel_by_name_prefix_locked(const char *name, cons } /*! \brief Get next channel by name prefix and lock it */ -struct ast_channel *ast_walk_channel_by_name_prefix_locked(struct ast_channel *chan, const char *name, const int namelen) +struct ast_channel *ast_walk_channel_by_name_prefix_locked(const struct ast_channel *chan, const char *name, + const int namelen) { return channel_find_locked(chan, name, namelen, NULL, NULL); } diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index d3d5862adf95323f6d2c772ea26e3a6683ec0533..06a895293c48f916a08c9d92bf959e56cd6efdf6 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -874,7 +874,7 @@ struct ast_channel *ast_get_channel_by_name_locked(const char *chan); struct ast_channel *ast_get_channel_by_name_prefix_locked(const char *name, const int namelen); /*! \brief Get channel by name prefix (locks channel) */ -struct ast_channel *ast_walk_channel_by_name_prefix_locked(struct ast_channel *chan, const char *name, const int namelen); +struct ast_channel *ast_walk_channel_by_name_prefix_locked(const struct ast_channel *chan, const char *name, const int namelen); /*! \brief Get channel by exten (and optionally context) and lock it */ struct ast_channel *ast_get_channel_by_exten_locked(const char *exten, const char *context);