aboutsummaryrefslogtreecommitdiffstats
path: root/main/asterisk.c
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-12-11 23:43:53 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-12-11 23:43:53 +0000
commit82f7adb307eea13dbad9e5e305c2ad82ed132662 (patch)
tree8071c2b72ed63ebf5a248313ecfc68b2547dcb84 /main/asterisk.c
parent2f4ed44961ffb21673cc0b732ce353bb2384241d (diff)
Merged revisions 163384 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r163384 | tilghman | 2008-12-11 17:38:56 -0600 (Thu, 11 Dec 2008) | 16 lines Merged revisions 163383 via svnmerge from 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: http://svn.digium.com/svn/asterisk/branches/1.6.0@163385 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/asterisk.c')
-rw-r--r--main/asterisk.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/main/asterisk.c b/main/asterisk.c
index 991e9f98a..03c6b18ab 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -1432,6 +1432,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;
@@ -2433,6 +2438,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;
@@ -2440,6 +2450,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;
@@ -2485,6 +2498,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;
}
@@ -2516,6 +2533,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;