aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_agi.c
diff options
context:
space:
mode:
authormartinp <martinp@f38db490-d61c-443f-a65b-d21fe96a405b>2003-11-05 23:43:31 +0000
committermartinp <martinp@f38db490-d61c-443f-a65b-d21fe96a405b>2003-11-05 23:43:31 +0000
commitdb2dbaf74900a99a8e1e4d51d19f63eef8cec55e (patch)
tree2b496c017e9ea7f52a5e21ab952703b17d2a1dd8 /apps/app_agi.c
parent3489fec50b30c4261310ebc233fd7a97766ffd94 (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-xapps/app_agi.c15
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 */