aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-05-14 17:01:53 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-05-14 17:01:53 +0000
commit95630a94423b3e9180488b934edec3d78ff6aeb4 (patch)
tree649c556f62111200770ac6637a6ecb592e4e3a5c /apps
parent192468bae9997f24dd33ec6309f9d56f8de86fc0 (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')
-rw-r--r--apps/app_externalivr.c11
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)