[asterisk-commits] tilghman: trunk r136859 - /trunk/res/res_agi.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Aug 8 20:15:39 CDT 2008
Author: tilghman
Date: Fri Aug 8 20:15:38 2008
New Revision: 136859
URL: http://svn.digium.com/view/asterisk?view=rev&rev=136859
Log:
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?
Modified:
trunk/res/res_agi.c
Modified: trunk/res/res_agi.c
URL: http://svn.digium.com/view/asterisk/trunk/res/res_agi.c?view=diff&rev=136859&r1=136858&r2=136859
==============================================================================
--- trunk/res/res_agi.c (original)
+++ trunk/res/res_agi.c Fri Aug 8 20:15:38 2008
@@ -73,19 +73,20 @@
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";
@@ -2601,6 +2602,7 @@
/* 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");
@@ -2615,8 +2617,11 @@
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);
@@ -2698,16 +2703,18 @@
}
}
/* 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);
+ waitpid(pid, status, WNOHANG);
+ } else if (agi->fast) {
+ send(agi->ctrl, "HANGUP\n", 7, MSG_OOB);
+ }
}
fclose(readf);
return returnstatus;
More information about the asterisk-commits
mailing list