aboutsummaryrefslogtreecommitdiffstats
path: root/res/res_agi.c
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-08-09 01:15:38 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-08-09 01:15:38 +0000
commit474f8606ea7d1060f8cf790040f19cff67afd206 (patch)
treedefc73efa9a207e91611d7f2d18eb747ea630f21 /res/res_agi.c
parent3944364da619c7f961e1a1dee02b53f31212d70f (diff)
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/trunk@136859 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res/res_agi.c')
-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 8cfc391e2..5c9ce0ccf 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";
@@ -2601,6 +2602,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");
@@ -2615,8 +2617,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);
@@ -2698,16 +2703,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;