aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-03-06 00:02:40 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-03-06 00:02:40 +0000
commitabd154ee5eeaee146d3035b35f0434fc4cc126a8 (patch)
treec5aebcfccebb0dc67cb769301b264866e0e6855b /apps
parenta4d3240b7a0ef1047a33f7a334703d68d0354011 (diff)
Add absolute timeout option to dial that applies when call is up (bug #1107)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@2357 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rwxr-xr-xapps/app_dial.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/apps/app_dial.c b/apps/app_dial.c
index 6acbddba7..665e714fa 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)