Merged revisions 163383 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Thu, 11 Dec 2008 23:38:56 +0000 (23:38 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Thu, 11 Dec 2008 23:38:56 +0000 (23:38 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
  r163383 | tilghman | 2008-12-11 17:35:55 -0600 (Thu, 11 Dec 2008) | 9 lines

  When a Ctrl-C or Ctrl-D ends a remote console, on certain shells, the terminal
  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/trunk@163384 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/asterisk.c

index 81e0872..6ef1c65 100644 (file)
@@ -1529,6 +1529,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;
@@ -2456,6 +2461,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;
@@ -2466,6 +2476,9 @@ static void ast_remotecontrol(char *data)
                sprintf(tmp, "%s%s", prefix, data);
                if (write(ast_consock, tmp, strlen(tmp) + 1) < 0) {
                        ast_log(LOG_ERROR, "write() failed: %s\n", strerror(errno));
+                       if (sig_flags.need_quit == 1) {
+                               return;
+                       }
                }
        }
        stringp = buf;
@@ -2501,6 +2514,10 @@ static void ast_remotecontrol(char *data)
                        char buffer[512] = "", *curline = buffer, *nextline;
                        int not_written = 1;
 
+                       if (sig_flags.need_quit == 1) {
+                               break;
+                       }
+
                        if (read(ast_consock, buffer, sizeof(buffer) - 1) <= 0) {
                                break;
                        }
@@ -2545,6 +2562,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;