]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Make AGI work when ast_waitfor_nands returns without anything because of EINTR
authorMartin Pycko <martinp@digium.com>
Wed, 5 Nov 2003 23:43:31 +0000 (23:43 +0000)
committerMartin Pycko <martinp@digium.com>
Wed, 5 Nov 2003 23:43:31 +0000 (23:43 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1699 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_agi.c

index 4c4110fd0daf4ac731e6d0b07f1181db11dfeff7..57e37e22bc06e441d5363f176e8716f56801f0e5 100755 (executable)
@@ -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 */