From 99adc3f020bec355b9f40d999a827b815de0e837 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Wed, 22 Aug 2007 19:53:30 +0000 Subject: [PATCH] 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/branches/1.4@80360 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_agi.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/res/res_agi.c b/res/res_agi.c index e1c96b04b0..d0ae408173 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -1866,8 +1866,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 = -1; @@ -1879,6 +1885,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;