summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorRussell Bryant <russell@russellbryant.com>2007-08-22 19:54:52 +0000
committerRussell Bryant <russell@russellbryant.com>2007-08-22 19:54:52 +0000
commit44f70278a86005c12f8bbc63b703fd3c4103c41b (patch)
treee69600bd59a4314da002d47421c91fba7680cf16 /res
parent30f27bd09a5994529e10058b0448e4db6268de9c (diff)
Merged revisions 80360 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r80360 | russell | 2007-08-22 14:53:30 -0500 (Wed, 22 Aug 2007) | 5 lines Juggie in #asterisk-dev was reporting problems where fgets would return without reading the whole line when using fastagi. When this happens, errno was set to EINTR or EAGAIN. This patch accounts for the possibility and lets fgets continue in that case. ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@80361 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res')
-rw-r--r--res/res_agi.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/res/res_agi.c b/res/res_agi.c
index 076c7e3a6..fffbc93fc 100644
--- a/res/res_agi.c
+++ b/res/res_agi.c
@@ -1902,8 +1902,14 @@ static enum agi_result run_agi(struct ast_channel *chan, char *request, AGI *agi
ast_frfree(f);
}
} else if (outfd > -1) {
+ size_t len;
retry = RETRY;
- if (!fgets(buf, sizeof(buf), readf)) {
+ buf[0] = '\0';
+retry_fgets:
+ len = strlen(buf);
+ if (!fgets(buf + len, sizeof(buf) - len, readf)) {
+ if (!feof(readf) && (errno == EINTR || errno == EAGAIN))
+ goto retry_fgets;
/* Program terminated */
if (returnstatus && returnstatus != AST_PBX_KEEPALIVE)
returnstatus = -1;
@@ -1914,6 +1920,8 @@ static enum agi_result run_agi(struct ast_channel *chan, char *request, AGI *agi
pid = -1;
break;
}
+ if (errno == EINTR || errno == EAGAIN)
+ goto retry_fgets;
/* get rid of trailing newline, if any */
if (*buf && buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = 0;