more simplification, and correct a bug i introduced in the last commit
[asterisk/asterisk.git] / apps / app_chanspy.c
index a109673..bea2b7d 100644 (file)
@@ -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;