From 952faabb041ce7529f990b32f2436b2593507d75 Mon Sep 17 00:00:00 2001
From: Martin Pycko <martinp@digium.com>
Date: Wed, 5 Nov 2003 23:43:31 +0000
Subject: [PATCH] Make AGI work when ast_waitfor_nands returns without anything
 because of EINTR

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1699 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 apps/app_agi.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/apps/app_agi.c b/apps/app_agi.c
index 4c4110fd0d..57e37e22bc 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 */
-- 
GitLab