diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-05-14 17:01:53 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-05-14 17:01:53 +0000 |
commit | 95630a94423b3e9180488b934edec3d78ff6aeb4 (patch) | |
tree | 649c556f62111200770ac6637a6ecb592e4e3a5c /apps/app_externalivr.c | |
parent | 192468bae9997f24dd33ec6309f9d56f8de86fc0 (diff) |
Merged revisions 116298 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r116298 | tilghman | 2008-05-14 11:53:23 -0500 (Wed, 14 May 2008) | 15 lines
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/branches/1.6.0@116319 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_externalivr.c')
-rw-r--r-- | apps/app_externalivr.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/apps/app_externalivr.c b/apps/app_externalivr.c index eb1989c62..7c9be392c 100644 --- a/apps/app_externalivr.c +++ b/apps/app_externalivr.c @@ -432,6 +432,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; @@ -451,6 +452,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); @@ -522,7 +525,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; @@ -633,7 +636,11 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, exit: - if (eivr_events) + if (test_available_fd > -1) { + close(test_available_fd); + } + + if (eivr_events) fclose(eivr_events); if (eivr_commands) |