diff options
-rw-r--r-- | res/res_agi.c | 39 |
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; |