aboutsummaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-08-09 01:16:25 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-08-09 01:16:25 +0000
commit12904249cb22aeeb199cb5b3215ebaa3ffbaf46c (patch)
tree6f544fbf4891bad3debc977c569cfa9cb165a5ce /res
parent61cfce16af3c3178ae9b1cd473f11be7ed154082 (diff)
Merged revisions 136859 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r136859 | tilghman | 2008-08-08 20:15:38 -0500 (Fri, 08 Aug 2008) | 4 lines Update documentation as to the behavior of AGI in 1.6.0 and higher. Also, add an OOB message that answers the question of, if AGI no longer shuts down the connection on hangup, how will FastAGI know when to stop processing the call? ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@136860 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rw-r--r--res/res_agi.c39
1 files changed, 23 insertions, 16 deletions
diff --git a/res/res_agi.c b/res/res_agi.c
index d3d07912a..e970f1715 100644
--- a/res/res_agi.c
+++ b/res/res_agi.c
@@ -73,19 +73,20 @@ static char *deadsynopsis = "Executes AGI on a hungup channel";
static char *descrip =
" [E|Dead]AGI(command,args): Executes an Asterisk Gateway Interface compliant\n"
-"program on a channel. AGI allows Asterisk to launch external programs\n"
-"written in any language to control a telephony channel, play audio,\n"
-"read DTMF digits, etc. by communicating with the AGI protocol on stdin\n"
-"and stdout.\n"
-" This channel will stop dialplan execution on hangup inside of this\n"
-"application, except when using DeadAGI. Otherwise, dialplan execution\n"
-"will continue normally.\n"
+"program on a channel. AGI allows Asterisk to launch external programs written\n"
+"in any language to control a telephony channel, play audio, read DTMF digits,\n"
+"etc. by communicating with the AGI protocol on stdin and stdout.\n"
+" As of 1.6.0, this channel will not stop dialplan execution on hangup inside\n"
+"of this application. Dialplan execution will continue normally, even upon\n"
+"hangup until the AGI application signals a desire to stop (either by exiting\n"
+"or, in the case of a net script, by closing the connection).\n"
" A locally executed AGI script will receive SIGHUP on hangup from the channel\n"
-"except when using DeadAGI. This can be disabled by setting the AGISIGHUP channel\n"
-"variable to \"no\" before executing the AGI application.\n"
+"except when using DeadAGI. A fast AGI server will correspondingly receive a\n"
+"HANGUP in OOB data. Both of these signals may be disabled by setting the\n"
+"AGISIGHUP channel variable to \"no\" before executing the AGI application.\n"
" Using 'EAGI' provides enhanced AGI, with incoming audio available out of band\n"
-"on file descriptor 3\n\n"
-" Use the CLI command 'agi show' to list available agi commands\n"
+"on file descriptor 3.\n\n"
+" Use the CLI command 'agi show' to list available agi commands.\n"
" This application sets the following channel variable upon completion:\n"
" AGISTATUS The status of the attempt to the run the AGI script\n"
" text string, one of SUCCESS | FAILURE | NOTFOUND | HANGUP\n";
@@ -2619,6 +2620,7 @@ static enum agi_result run_agi(struct ast_channel *chan, char *request, AGI *agi
/* how many times we'll retry if ast_waitfor_nandfs will return without either
channel or file descriptor in case select is interrupted by a system call (EINTR) */
int retry = AGI_NANDFS_RETRY;
+ const char *sighup;
if (!(readf = fdopen(agi->ctrl, "r"))) {
ast_log(LOG_WARNING, "Unable to fdopen file descriptor\n");
@@ -2633,8 +2635,11 @@ static enum agi_result run_agi(struct ast_channel *chan, char *request, AGI *agi
if (needhup) {
needhup = 0;
dead = 1;
- if (pid > -1)
+ if (pid > -1) {
kill(pid, SIGHUP);
+ } else if (agi->fast) {
+ send(agi->ctrl, "HANGUP\n", 7, MSG_OOB);
+ }
}
ms = -1;
c = ast_waitfor_nandfds(&chan, dead ? 0 : 1, &agi->ctrl, 1, NULL, &outfd, &ms);
@@ -2716,16 +2721,18 @@ static enum agi_result run_agi(struct ast_channel *chan, char *request, AGI *agi
}
}
/* Notify process */
- if (pid > -1) {
- const char *sighup = pbx_builtin_getvar_helper(chan, "AGISIGHUP");
- if (ast_strlen_zero(sighup) || !ast_false(sighup)) {
+ sighup = pbx_builtin_getvar_helper(chan, "AGISIGHUP");
+ if (ast_strlen_zero(sighup) || !ast_false(sighup)) {
+ if (pid > -1) {
if (kill(pid, SIGHUP)) {
ast_log(LOG_WARNING, "unable to send SIGHUP to AGI process %d: %s\n", pid, strerror(errno));
} else { /* Give the process a chance to die */
usleep(1);
}
+ waitpid(pid, status, WNOHANG);
+ } else if (agi->fast) {
+ send(agi->ctrl, "HANGUP\n", 7, MSG_OOB);
}
- waitpid(pid, status, WNOHANG);
}
fclose(readf);
return returnstatus;