]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Add special case for when the agi cannot be executed, to comply with the documentatio...
authorTilghman Lesher <tilghman@meg.abyt.es>
Thu, 17 Apr 2008 12:56:38 +0000 (12:56 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Thu, 17 Apr 2008 12:56:38 +0000 (12:56 +0000)
we return failure in that case.
(closes issue #12462)
 Reported by: fmueller
 Patches:
       20080416__bug12462.diff.txt uploaded by Corydon76 (license 14)
 Tested by: fmueller

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@114195 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_agi.c

index b0de6db3671c64ff1e8684bb8c0a96cafe58dbe1..4b23b0110fca6f0f069907389b029d6fd665e56b 100644 (file)
@@ -346,6 +346,8 @@ static enum agi_result launch_script(char *script, char *argv[], int *fds, int *
                execv(script, argv);
                /* Can't use ast_log since FD's are closed */
                fprintf(stdout, "verbose \"Failed to execute '%s': %s\" 2\n", script, strerror(errno));
+               /* Special case to set status of AGI to failure */
+               fprintf(stdout, "failure\n");
                fflush(stdout);
                _exit(1);
        }
@@ -1904,6 +1906,12 @@ static enum agi_result run_agi(struct ast_channel *chan, char *request, AGI *agi
                                break;
                        }
 
+                       /* Special case for inability to execute child process */
+                       if (*buf && strncasecmp(buf, "failure", 7) == 0) {
+                               returnstatus = AGI_RESULT_FAILURE;
+                               break;
+                       }
+
                        /* get rid of trailing newline, if any */
                        if (*buf && buf[strlen(buf) - 1] == '\n')
                                buf[strlen(buf) - 1] = 0;
@@ -2047,6 +2055,7 @@ static int agi_exec_full(struct ast_channel *chan, void *data, int enhanced, int
                }
        }
 #endif
+       ast_replace_sigchld();
        res = launch_script(argv[0], argv, fds, enhanced ? &efd : NULL, &pid);
        if (res == AGI_RESULT_SUCCESS || res == AGI_RESULT_SUCCESS_FAST) {
                int status = 0;
@@ -2062,8 +2071,8 @@ static int agi_exec_full(struct ast_channel *chan, void *data, int enhanced, int
                        close(fds[1]);
                if (efd > -1)
                        close(efd);
-               ast_unreplace_sigchld();
        }
+       ast_unreplace_sigchld();
        ast_module_user_remove(u);
 
        switch (res) {