Index: apps/app_softhangup.c =================================================================== RCS file: /usr/cvsroot/asterisk/apps/app_softhangup.c,v retrieving revision 1.4 diff -u -r1.4 app_softhangup.c --- apps/app_softhangup.c 22 Jun 2004 19:32:52 -0000 1.4 +++ apps/app_softhangup.c 8 Jan 2005 21:31:35 -0000 @@ -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,39 @@ { struct localuser *u; struct ast_channel *c=NULL; + char *options, *cut, *cdata, *match; + char name[AST_CHANNEL_NAME] = ""; + 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, "|"); LOCAL_USER_ADD(u); c = ast_channel_walk_locked(NULL); while (c) { - if (!strcasecmp(c->name, data)) { - ast_softhangup(c, AST_SOFTHANGUP_EXPLICIT); - ast_mutex_unlock(&c->lock); - break; - } + strncpy(name, c->name, sizeof(name)-1); ast_mutex_unlock(&c->lock); + if (options && strchr(options,'a')) { + /* 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); + if(options && !strchr(options,'a')) + break; + } c = ast_channel_walk_locked(c); } LOCAL_USER_REMOVE(u);