]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
When a Ctrl-C or Ctrl-D ends a remote console, on certain shells, the terminal
authorTilghman Lesher <tilghman@meg.abyt.es>
Thu, 11 Dec 2008 23:35:55 +0000 (23:35 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Thu, 11 Dec 2008 23:35:55 +0000 (23:35 +0000)
is messed up.  By intercepting those events with a signal handler in the remote
console, we can avoid those issues.
(closes issue #13464)
 Reported by: tzafrir
 Patches:
       20081110__bug13464.diff.txt uploaded by Corydon76 (license 14)
 Tested by: blitzrage

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

main/asterisk.c

index 230f9c83048f7df383be3c90683f7a3a48e5d58e..3dad454d5bf5da23601b901f5c40541e689cec5b 100644 (file)
@@ -1363,6 +1363,11 @@ static void __quit_handler(int num)
         * is going to exit */
 }
 
+static void __remote_quit_handler(int num)
+{
+       sig_flags.need_quit = 1;
+}
+
 static const char *fix_header(char *outbuf, int maxout, const char *s, char *cmp)
 {
        const char *c;
@@ -2306,6 +2311,11 @@ static void ast_remotecontrol(char *data)
        char *ebuf;
        int num = 0;
 
+       memset(&sig_flags, 0, sizeof(sig_flags));
+       signal(SIGINT, __remote_quit_handler);
+       signal(SIGTERM, __remote_quit_handler);
+       signal(SIGHUP, __remote_quit_handler);
+
        if (read(ast_consock, buf, sizeof(buf)) < 0) {
                ast_log(LOG_ERROR, "read() failed: %s\n", strerror(errno));
                return;
@@ -2313,6 +2323,9 @@ static void ast_remotecontrol(char *data)
        if (data) {
                if (write(ast_consock, data, strlen(data) + 1) < 0) {
                        ast_log(LOG_ERROR, "write() failed: %s\n", strerror(errno));
+                       if (sig_flags.need_quit == 1) {
+                               return;
+                       }
                }
        }
        stringp = buf;
@@ -2358,6 +2371,10 @@ static void ast_remotecontrol(char *data)
                        char buf[512] = "", *curline = buf, *nextline;
                        int not_written = 1;
 
+                       if (sig_flags.need_quit == 1) {
+                               break;
+                       }
+
                        if (read(ast_consock, buf, sizeof(buf) - 1) <= 0) {
                                break;
                        }
@@ -2389,6 +2406,10 @@ static void ast_remotecontrol(char *data)
        for (;;) {
                ebuf = (char *)el_gets(el, &num);
 
+               if (sig_flags.need_quit == 1) {
+                       break;
+               }
+
                if (!ebuf && write(1, "", 1) < 0)
                        break;