mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 20:20:07 +00:00
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
This commit is contained in:
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user