From: Tilghman Lesher Date: Thu, 11 Dec 2008 23:35:55 +0000 (+0000) Subject: When a Ctrl-C or Ctrl-D ends a remote console, on certain shells, the terminal X-Git-Tag: 1.4.23-rc3~3^2~21 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f6ef5d5d6cb6903f1cbe58a584e81e6408c127ea;p=thirdparty%2Fasterisk.git 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/branches/1.4@163383 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/asterisk.c b/main/asterisk.c index 230f9c8304..3dad454d5b 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -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;