diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-05-14 16:53:23 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-05-14 16:53:23 +0000 |
commit | e518ad7f98e1a96d84ce8f84abc9a498a3a5d435 (patch) | |
tree | 0c6a26b9411e69cc707131cd6c70fea180e0e8e8 /apps/app_externalivr.c | |
parent | c41065a021e6166a11363bd9739b3c40b65521c7 (diff) |
Merged revisions 116296 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r116296 | tilghman | 2008-05-14 11:46:48 -0500 (Wed, 14 May 2008) | 2 lines
Detect another way for a connection to have gone away.
(closes issue #12618)
Reported by: ctooley
Patches:
1.4-externalivr-test_fd.diff uploaded by ctooley (license 136)
trunk-externalivr-test_fd.diff uploaded by ctooley (license 136)
........
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@116298 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_externalivr.c')
-rw-r--r-- | apps/app_externalivr.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/apps/app_externalivr.c b/apps/app_externalivr.c index a93abb4a8..6068e5f48 100644 --- a/apps/app_externalivr.c +++ b/apps/app_externalivr.c @@ -481,6 +481,7 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, struct ast_channel *rchan; char *command; int res = -1; + int test_available_fd = -1; FILE *eivr_commands = NULL; FILE *eivr_errors = NULL; @@ -500,6 +501,8 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, goto exit; } } + + test_available_fd = open("/dev/null", O_RDONLY); setvbuf(eivr_events, NULL, _IONBF, 0); setvbuf(eivr_commands, NULL, _IONBF, 0); @@ -574,7 +577,7 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, } else if (ready_fd == eivr_commands_fd) { char input[1024]; - if (exception || feof(eivr_commands)) { + if (exception || (dup2(eivr_commands_fd, test_available_fd) == -1) || feof(eivr_commands)) { ast_chan_log(LOG_WARNING, chan, "Child process went away\n"); res = -1; break; @@ -685,6 +688,10 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, exit: + if (test_available_fd > -1) { + close(test_available_fd); + } + if (eivr_events) fclose(eivr_events); |