Allow softhangup to work on partial matches if requested (bug #3261)
authorMark Spencer <markster@digium.com>
Wed, 12 Jan 2005 15:55:52 +0000 (15:55 +0000)
committerMark Spencer <markster@digium.com>
Wed, 12 Jan 2005 15:55:52 +0000 (15:55 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4767 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_softhangup.c

index 02135be..7340895 100755 (executable)
@@ -27,8 +27,10 @@ static char *synopsis = "Soft Hangup Application";
 
 static char *tdesc = "Hangs up the requested channel";
 
-static char *desc = "  SoftHangup(Technology/resource)\n"
-"Hangs up the requested channel.  Always returns 0\n";
+static char *desc = "  SoftHangup(Technology/resource|options)\n"
+"Hangs up the requested channel.  Always returns 0\n"
+"- 'options' may contain the following letter:\n"
+"     'a' : hang up all channels on a specified device instead of a single resource\n";
 
 static char *app = "SoftHangup";
 
@@ -40,19 +42,41 @@ static int softhangup_exec(struct ast_channel *chan, void *data)
 {
        struct localuser *u;
        struct ast_channel *c=NULL;
+       char *options, *cut, *cdata, *match;
+       char name[AST_CHANNEL_NAME] = "";
+       int all = 0;
+
        if (!data) {
                 ast_log(LOG_WARNING, "SoftHangup requires an argument (Technology/resource)\n");
                return 0;
        }
+       
+       cdata = ast_strdupa(data);
+       match = strsep(&cdata, "|");
+       options = strsep(&cdata, "|");
+       all = options && strchr(options,'a');
        LOCAL_USER_ADD(u);
        c = ast_channel_walk_locked(NULL);
        while (c) {
-               if (!strcasecmp(c->name, data)) {
+               strncpy(name, c->name, sizeof(name)-1);
+               ast_mutex_unlock(&c->lock);
+               if (all) {
+                       /* CAPI is set up like CAPI[foo/bar]/clcnt */ 
+                       if (!strcmp(c->type,"CAPI")) 
+                               cut = strrchr(name,'/');
+                       /* Basically everything else is Foo/Bar-Z */
+                       else
+                               cut = strchr(name,'-');
+                       /* Get rid of what we've cut */
+                       if (cut)
+                               *cut = 0;
+               }
+               if (!strcasecmp(name, match)) {
+                       ast_log(LOG_WARNING, "Soft hanging %s up.\n",c->name);
                        ast_softhangup(c, AST_SOFTHANGUP_EXPLICIT);
-                       ast_mutex_unlock(&c->lock);
-                       break;
+                       if(!all)
+                               break;
                }
-               ast_mutex_unlock(&c->lock);
                c = ast_channel_walk_locked(c);
        }
        LOCAL_USER_REMOVE(u);