aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_softhangup.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-01-12 15:55:52 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-01-12 15:55:52 +0000
commitc0313725945c1b7569b9b8d65fdea72543bb4b56 (patch)
tree0064b0d1b978022221064fab942111dfd14975d4 /apps/app_softhangup.c
parentbd8bca13272f236c2b8ac2f104bddde8929071b1 (diff)
Allow softhangup to work on partial matches if requested (bug #3261)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@4767 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_softhangup.c')
-rwxr-xr-xapps/app_softhangup.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/apps/app_softhangup.c b/apps/app_softhangup.c
index 02135beb0..73408958d 100755
--- a/apps/app_softhangup.c
+++ b/apps/app_softhangup.c
@@ -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);