diff options
author | martinp <martinp@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-11-05 23:43:31 +0000 |
---|---|---|
committer | martinp <martinp@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-11-05 23:43:31 +0000 |
commit | db2dbaf74900a99a8e1e4d51d19f63eef8cec55e (patch) | |
tree | 2b496c017e9ea7f52a5e21ab952703b17d2a1dd8 /apps/app_agi.c | |
parent | 3489fec50b30c4261310ebc233fd7a97766ffd94 (diff) |
Make AGI work when ast_waitfor_nands returns without anything because of EINTR
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@1699 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_agi.c')
-rwxr-xr-x | apps/app_agi.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/apps/app_agi.c b/apps/app_agi.c index 4c4110fd0..57e37e22b 100755 --- a/apps/app_agi.c +++ b/apps/app_agi.c @@ -1218,7 +1218,7 @@ static int agi_handle_command(struct ast_channel *chan, AGI *agi, char *buf) } return 0; } - +#define RETRY 3 static int run_agi(struct ast_channel *chan, char *request, AGI *agi, int pid) { struct ast_channel *c; @@ -1228,6 +1228,9 @@ static int run_agi(struct ast_channel *chan, char *request, AGI *agi, int pid) struct ast_frame *f; char buf[2048]; FILE *readf; + //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 = RETRY; + if (!(readf = fdopen(agi->ctrl, "r"))) { ast_log(LOG_WARNING, "Unable to fdopen file descriptor\n"); kill(pid, SIGHUP); @@ -1239,6 +1242,7 @@ static int run_agi(struct ast_channel *chan, char *request, AGI *agi, int pid) ms = -1; c = ast_waitfor_nandfds(&chan, 1, &agi->ctrl, 1, NULL, &outfd, &ms); if (c) { + retry = RETRY; /* Idle the channel until we get a command */ f = ast_read(c); if (!f) { @@ -1254,6 +1258,7 @@ static int run_agi(struct ast_channel *chan, char *request, AGI *agi, int pid) ast_frfree(f); } } else if (outfd > -1) { + retry = RETRY; if (!fgets(buf, sizeof(buf), readf)) { /* Program terminated */ if (returnstatus) @@ -1274,9 +1279,11 @@ static int run_agi(struct ast_channel *chan, char *request, AGI *agi, int pid) break; } } else { - ast_log(LOG_WARNING, "No channel, no fd?\n"); - returnstatus = -1; - break; + if (--retry <= 0) { + ast_log(LOG_WARNING, "No channel, no fd?\n"); + returnstatus = -1; + break; + } } } /* Notify process */ |