From: Mark Spencer Date: Sat, 6 Mar 2004 00:02:40 +0000 (+0000) Subject: Add absolute timeout option to dial that applies when call is up (bug #1107) X-Git-Tag: 1.0.0-rc1~981 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7f2e23bb50675a6dc509d273e457f26af6a7579c;p=thirdparty%2Fasterisk.git Add absolute timeout option to dial that applies when call is up (bug #1107) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2357 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_dial.c b/apps/app_dial.c index 6acbddba71..665e714faf 100755 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -67,6 +67,7 @@ static char *descrip = " 'P[(x)]' -- privacy mode, using 'x' as database if provided.\n" " 'g' -- goes on in context if the destination channel hangs up\n" " 'A(x)' -- play an announcement to the called party, using x as file\n" +" 'S(x)' -- hangup the call after x seconds AFTER called party picked up\n" " In addition to transferring the call, a call may be parked and then picked\n" "up by another user.\n" " The optional URL will be sent to the called party if the channel supports\n" @@ -377,9 +378,12 @@ static int dial_exec(struct ast_channel *chan, void *data) struct varshead *headp, *newheadp; struct ast_var_t *newvar; int go_on=0; + unsigned int calldurationlimit=0; + char *cdl; + time_t now; if (!data) { - ast_log(LOG_WARNING, "Dial requires an argument (technology1/number1&technology2/number2...|optional timeout)\n"); + ast_log(LOG_WARNING, "Dial requires an argument (technology1/number1&technology2/number2...|optional timeout|options)\n"); return -1; } @@ -388,6 +392,7 @@ static int dial_exec(struct ast_channel *chan, void *data) strncpy(info, (char *)data, sizeof(info) - 1); peers = info; if (peers) { + timeout = strchr(info, '|'); if (timeout) { *timeout = '\0'; @@ -416,6 +421,13 @@ static int dial_exec(struct ast_channel *chan, void *data) if (transfer) { + /* Extract call duration limit */ + if ((cdl = strstr(transfer, "S("))) { + calldurationlimit=atoi(cdl+2); + if (option_verbose > 2) + ast_verbose(VERBOSE_PREFIX_3 "Setting call duration limit to %i seconds.\n",calldurationlimit); + } + /* XXX ANNOUNCE SUPPORT */ if ((ann = strstr(transfer, "A("))) { announce = 1; @@ -700,6 +712,10 @@ static int dial_exec(struct ast_channel *chan, void *data) // Ok, done. stop autoservice res2 = ast_autoservice_stop(chan); } + if (calldurationlimit > 0) { + time(&now); + chan->whentohangup = now + calldurationlimit; + } res = ast_bridge_call(chan, peer, allowredir_in, allowredir_out, allowdisconnect); if (res != AST_PBX_NO_HANGUP_PEER)