Update of /usr/cvsroot/asterisk/res
In directory mongoose.digium.com:/tmp/cvs-serv21777/res

Modified Files:
        res_agi.c 
Log Message:
Fix sighup with AGI (bug #4854)


Index: res_agi.c
===================================================================
RCS file: /usr/cvsroot/asterisk/res/res_agi.c,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -d -r1.44 -r1.45
--- res_agi.c   15 Jul 2005 23:00:47 -0000      1.44
+++ res_agi.c   3 Aug 2005 04:17:12 -0000       1.45
@@ -211,6 +211,7 @@
        int audio[2];
        int x;
        int res;
+       sigset_t signal_set;
        
        if (!strncasecmp(script, "agi://", 6))
                return launch_netscript(script, argv, fds, efd, opid);
@@ -266,9 +267,17 @@
                } else {
                        close(STDERR_FILENO + 1);
                }
+               
+               /* unblock important signal handlers */
+               if (sigfillset(&signal_set) || pthread_sigmask(SIG_UNBLOCK, 
&signal_set, NULL)) {
+                       ast_log(LOG_WARNING, "unable to unblock signals for AGI 
script: %s\n", strerror(errno));
+                       exit(1);
+               }
+
                /* Close everything but stdin/out/error */
                for (x=STDERR_FILENO + 2;x<1024;x++) 
                        close(x);
+
                /* Execute script */
                execv(script, argv);
                /* Can't use ast_log since FD's are closed */
@@ -430,7 +439,7 @@
        if (!strncasecmp(argv[2],"tdd",3))
                x = 1;
        res = ast_channel_setoption(chan, AST_OPTION_TDD, &x, sizeof(char), 0);
-       if(res != RESULT_SUCCESS)
+       if (res != RESULT_SUCCESS)
                fdprintf(agi->fd, "200 result=0\n");
        else
                fdprintf(agi->fd, "200 result=1\n");
@@ -467,7 +476,7 @@
                return RESULT_SHOWUSAGE;
        
        fs = ast_openstream(chan, argv[2], chan->language);
-       if(!fs){
+       if (!fs){
                fdprintf(agi->fd, "200 result=%d endpos=%ld\n", 0, 
sample_offset);
                return RESULT_SUCCESS;
        }
@@ -523,7 +532,7 @@
        }
 
         fs = ast_openstream(chan, argv[2], chan->language);
-        if(!fs){
+        if (!fs){
                 fdprintf(agi->fd, "200 result=%d endpos=%ld\n", 0, 
sample_offset);
                 ast_log(LOG_WARNING, "Unable to open %s\n", argv[2]);
                return RESULT_SUCCESS;
@@ -1817,8 +1826,10 @@
                }
        }
        /* Notify process */
-       if (pid > -1)
-               kill(pid, SIGHUP);
+       if (pid > -1) {
+               if (kill(pid, SIGHUP))
+                       ast_log(LOG_WARNING, "unable to send SIGHUP to AGI 
process %d: %s\n", pid, strerror(errno));
+       }
        fclose(readf);
        return returnstatus;
 }

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to