From a8b85fda848eb55dfaa635b57a51855f05a9f241 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" <kpfleming@digium.com> Date: Thu, 27 Jul 2006 23:16:08 +0000 Subject: [PATCH] more simplification, and correct a bug i introduced in the last commit fix prototype for a channel walking function to use a const input pointer use existing channel walk by name prefix instead of reproducing that code in this app git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@38389 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_chanspy.c | 36 ++++++++++++++++++------------------ channel.c | 3 ++- include/asterisk/channel.h | 2 +- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/apps/app_chanspy.c b/apps/app_chanspy.c index a109673f54..bea2b7d1e0 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 952c7b6ad9..82eac1db14 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 d3d5862adf..06a895293c 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); -- GitLab