[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