From e518ad7f98e1a96d84ce8f84abc9a498a3a5d435 Mon Sep 17 00:00:00 2001 From: tilghman Date: Wed, 14 May 2008 16:53:23 +0000 Subject: 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 --- apps/app_externalivr.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'apps') 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); -- cgit v1.2.3