Index: apps/app_chanisavail.c =================================================================== RCS file: /usr/cvsroot/asterisk/apps/app_chanisavail.c,v retrieving revision 1.26 diff -u -r1.26 app_chanisavail.c --- apps/app_chanisavail.c 26 Oct 2005 19:48:14 -0000 1.26 +++ apps/app_chanisavail.c 4 Nov 2005 09:57:39 -0000 @@ -41,6 +41,7 @@ #include "asterisk/module.h" #include "asterisk/app.h" #include "asterisk/devicestate.h" +#include "asterisk/options.h" static char *tdesc = "Check if channel is available"; @@ -50,17 +51,16 @@ static char *descrip = " ChanIsAvail(Technology/resource[&Technology2/resource2...][|option]): \n" -"Checks is any of the requested channels are available. If none\n" -"of the requested channels are available the new priority will be\n" -"n+101 (unless such a priority does not exist or on error, in which\n" -"case ChanIsAvail will return -1).\n" +"Checks is any of the requested channels are available. \n" "If any of the requested channels are available, the next priority will be n+1,\n" "the channel variable ${AVAILCHAN} will be set to the name of the available channel\n" "and the ChanIsAvail app will return 0.\n" "${AVAILORIGCHAN} is the canonical channel name that was used to create the channel.\n" "${AVAILSTATUS} is the status code for the channel.\n" "If the option 's' is specified (state), will consider channel unavailable\n" -"when the channel is in use at all, even if it can take another call.\n"; +"when the channel is in use at all, even if it can take another call.\n" +"If the option 'j' is specified (jump), the application will jump to n+101 \n" +"(unless such a priority does not exist, in which case ChanIsAvail will return -1)\n"; STANDARD_LOCAL_USER; @@ -68,7 +68,7 @@ static int chanavail_exec(struct ast_channel *chan, void *data) { - int res=-1, inuse=-1, option_state=0; + int res=-1, inuse=-1, option_state=0, priority_jump=0; int status; struct localuser *u; char *info, tmp[512], trychan[512], *peers, *tech, *number, *rest, *cur, *options, *stringp; @@ -85,8 +85,12 @@ stringp = info; strsep(&stringp, "|"); options = strsep(&stringp, "|"); - if (options && *options == 's') - option_state = 1; + if (options) { + if (strchr(options, 's')) + option_state = 1; + if (strchr(options, 'j')) + priority_jump = 1; + } peers = info; if (peers) { cur = peers; @@ -136,9 +140,11 @@ if (res < 1) { pbx_builtin_setvar_helper(chan, "AVAILCHAN", ""); pbx_builtin_setvar_helper(chan, "AVAILORIGCHAN", ""); - if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) { - LOCAL_USER_REMOVE(u); - return -1; + if (priority_jump || option_priority_jumping) { + if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) { + LOCAL_USER_REMOVE(u); + return -1; + } } }