[Asterisk-cvs] asterisk/apps app_softhangup.c,1.4,1.5
markster at lists.digium.com
markster at lists.digium.com
Wed Jan 12 09:51:49 CST 2005
Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/tmp/cvs-serv13244/apps
Modified Files:
app_softhangup.c
Log Message:
Allow softhangup to work on partial matches if requested (bug #3261)
Index: app_softhangup.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_softhangup.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- app_softhangup.c 22 Jun 2004 19:32:52 -0000 1.4
+++ app_softhangup.c 12 Jan 2005 15:55:52 -0000 1.5
@@ -27,8 +27,10 @@
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 @@
{
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);
More information about the svn-commits
mailing list