|
|
|
@ -291,6 +291,7 @@ static int sig_alert_pipe[2] = { -1, -1 };
|
|
|
|
|
static struct {
|
|
|
|
|
unsigned int need_reload:1;
|
|
|
|
|
unsigned int need_quit:1;
|
|
|
|
|
unsigned int need_quit_handler:1;
|
|
|
|
|
} sig_flags;
|
|
|
|
|
|
|
|
|
|
#if !defined(LOW_MEMORY)
|
|
|
|
@ -1657,21 +1658,24 @@ static void quit_handler(int num, int niceness, int safeshutdown, int restart)
|
|
|
|
|
ast_module_shutdown();
|
|
|
|
|
}
|
|
|
|
|
if (ast_opt_console || (ast_opt_remote && !ast_opt_exec)) {
|
|
|
|
|
pthread_t thisthread = pthread_self();
|
|
|
|
|
if (getenv("HOME")) {
|
|
|
|
|
snprintf(filename, sizeof(filename), "%s/.asterisk_history", getenv("HOME"));
|
|
|
|
|
}
|
|
|
|
|
if (!ast_strlen_zero(filename)) {
|
|
|
|
|
ast_el_write_history(filename);
|
|
|
|
|
}
|
|
|
|
|
if (consolethread == AST_PTHREADT_NULL || consolethread == thisthread || mon_sig_flags == thisthread) {
|
|
|
|
|
/* Only end if we are the consolethread or signal handler, otherwise there's a race with that thread. */
|
|
|
|
|
if (consolethread == AST_PTHREADT_NULL || consolethread == pthread_self()) {
|
|
|
|
|
/* Only end if we are the consolethread, otherwise there's a race with that thread. */
|
|
|
|
|
if (el != NULL) {
|
|
|
|
|
el_end(el);
|
|
|
|
|
}
|
|
|
|
|
if (el_hist != NULL) {
|
|
|
|
|
history_end(el_hist);
|
|
|
|
|
}
|
|
|
|
|
} else if (mon_sig_flags == pthread_self()) {
|
|
|
|
|
if (consolethread != AST_PTHREADT_NULL) {
|
|
|
|
|
pthread_kill(consolethread, SIGURG);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (option_verbose)
|
|
|
|
@ -2150,7 +2154,7 @@ static int ast_el_read_char(EditLine *editline, char *cp)
|
|
|
|
|
}
|
|
|
|
|
res = ast_poll(fds, max, -1);
|
|
|
|
|
if (res < 0) {
|
|
|
|
|
if (sig_flags.need_quit)
|
|
|
|
|
if (sig_flags.need_quit || sig_flags.need_quit_handler)
|
|
|
|
|
break;
|
|
|
|
|
if (errno == EINTR)
|
|
|
|
|
continue;
|
|
|
|
@ -2707,7 +2711,7 @@ 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) {
|
|
|
|
|
if (sig_flags.need_quit || sig_flags.need_quit_handler) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -2745,7 +2749,7 @@ static void ast_remotecontrol(char *data)
|
|
|
|
|
char buffer[512] = "", *curline = buffer, *nextline;
|
|
|
|
|
int not_written = 1;
|
|
|
|
|
|
|
|
|
|
if (sig_flags.need_quit == 1) {
|
|
|
|
|
if (sig_flags.need_quit || sig_flags.need_quit_handler) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2793,7 +2797,7 @@ static void ast_remotecontrol(char *data)
|
|
|
|
|
for (;;) {
|
|
|
|
|
ebuf = (char *)el_gets(el, &num);
|
|
|
|
|
|
|
|
|
|
if (sig_flags.need_quit == 1) {
|
|
|
|
|
if (sig_flags.need_quit || sig_flags.need_quit_handler) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -3115,7 +3119,12 @@ static void *monitor_sig_flags(void *unused)
|
|
|
|
|
}
|
|
|
|
|
if (sig_flags.need_quit) {
|
|
|
|
|
sig_flags.need_quit = 0;
|
|
|
|
|
quit_handler(0, 0, 1, 0);
|
|
|
|
|
if (consolethread != AST_PTHREADT_NULL) {
|
|
|
|
|
sig_flags.need_quit_handler = 1;
|
|
|
|
|
pthread_kill(consolethread, SIGURG);
|
|
|
|
|
} else {
|
|
|
|
|
quit_handler(0, 0, 1, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (read(sig_alert_pipe[0], &a, sizeof(a)) != sizeof(a)) {
|
|
|
|
|
}
|
|
|
|
@ -3900,7 +3909,13 @@ int main(int argc, char *argv[])
|
|
|
|
|
snprintf(title, sizeof(title), "Asterisk Console on '%s' (pid %ld)", hostname, (long)ast_mainpid);
|
|
|
|
|
set_title(title);
|
|
|
|
|
|
|
|
|
|
el_set(el, EL_GETCFN, ast_el_read_char);
|
|
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
|
if (sig_flags.need_quit || sig_flags.need_quit_handler) {
|
|
|
|
|
quit_handler(0, 0, 0, 0);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
buf = (char *) el_gets(el, &num);
|
|
|
|
|
|
|
|
|
|
if (!buf && write(1, "", 1) < 0)
|
|
|
|
|