]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
core: Ensure that el_end is always run when needed.
authorCorey Farrell <git@cfware.com>
Sun, 11 Nov 2018 13:34:53 +0000 (08:34 -0500)
committerCorey Farrell <git@cfware.com>
Sun, 11 Nov 2018 13:43:29 +0000 (08:43 -0500)
* Ignore console=yes configuration option in remote console processes.
* Use new flag to tell consolethread to run el_end and exit when needed.

ASTERISK-28158

Change-Id: I9e23b31d4211417ddc88c6bbfd83ea4c9f3e5438

main/asterisk.c
main/options.c

index 335472490c0c3b3d2f6c207029129c4dec8c4d22..12e6255db102cb02d78fa1eeb849a34880b3c1ef 100644 (file)
@@ -389,6 +389,7 @@ static struct {
         unsigned int need_reload:1;
         unsigned int need_quit:1;
         unsigned int need_quit_handler:1;
+        unsigned int need_el_end:1;
 } sig_flags;
 
 #if !defined(LOW_MEMORY)
@@ -2015,10 +2016,9 @@ static void really_quit(int num, shutdown_nice_t niceness, int restart)
                        if (el_hist != NULL) {
                                history_end(el_hist);
                        }
-               } else if (mon_sig_flags == pthread_self()) {
-                       if (consolethread != AST_PTHREADT_NULL) {
-                               pthread_kill(consolethread, SIGURG);
-                       }
+               } else {
+                       sig_flags.need_el_end = 1;
+                       pthread_kill(consolethread, SIGURG);
                }
        }
        active_channels = ast_active_channels();
@@ -2635,7 +2635,7 @@ static int ast_el_read_char(EditLine *editline, CHAR_T_LIBEDIT *cp)
                }
                res = ast_poll(fds, max, -1);
                if (res < 0) {
-                       if (sig_flags.need_quit || sig_flags.need_quit_handler) {
+                       if (sig_flags.need_quit || sig_flags.need_quit_handler || sig_flags.need_el_end) {
                                break;
                        }
                        if (errno == EINTR) {
@@ -3163,7 +3163,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 || sig_flags.need_quit_handler) {
+                       if (sig_flags.need_quit || sig_flags.need_quit_handler || sig_flags.need_el_end) {
                                return;
                        }
                }
@@ -3195,7 +3195,7 @@ static void ast_remotecontrol(char *data)
                        char buffer[512] = "", *curline = buffer, *nextline;
                        int not_written = 1;
 
-                       if (sig_flags.need_quit || sig_flags.need_quit_handler) {
+                       if (sig_flags.need_quit || sig_flags.need_quit_handler || sig_flags.need_el_end) {
                                break;
                        }
 
@@ -3255,7 +3255,7 @@ static void ast_remotecontrol(char *data)
        for (;;) {
                ebuf = (char *)el_gets(el, &num);
 
-               if (sig_flags.need_quit || sig_flags.need_quit_handler) {
+               if (sig_flags.need_quit || sig_flags.need_quit_handler || sig_flags.need_el_end) {
                        break;
                }
 
@@ -4198,6 +4198,12 @@ static void asterisk_daemon(int isroot, const char *runuser, const char *rungrou
                el_set(el, EL_GETCFN, ast_el_read_char);
 
                for (;;) {
+                       if (sig_flags.need_el_end) {
+                               el_end(el);
+
+                               return;
+                       }
+
                        if (sig_flags.need_quit || sig_flags.need_quit_handler) {
                                quit_handler(0, SHUTDOWN_FAST, 0);
                                break;
index f6a4e8fd0657c75d1696ac3935bb2089dbae1cdd..1da787fa29ef4d56a9416049d7e396ce6dd25f51 100644 (file)
@@ -322,7 +322,9 @@ void load_asterisk_conf(void)
                        ast_set2_flag(&ast_options, ast_true(v->value), AST_OPT_FLAG_QUIET);
                /* Run as console (-c at startup, implies nofork) */
                } else if (!strcasecmp(v->name, "console")) {
-                       ast_set2_flag(&ast_options, ast_true(v->value), AST_OPT_FLAG_NO_FORK | AST_OPT_FLAG_CONSOLE);
+                       if (!ast_opt_remote) {
+                               ast_set2_flag(&ast_options, ast_true(v->value), AST_OPT_FLAG_NO_FORK | AST_OPT_FLAG_CONSOLE);
+                       }
                /* Run with high priority if the O/S permits (-p at startup) */
                } else if (!strcasecmp(v->name, "highpriority")) {
                        ast_set2_flag(&ast_options, ast_true(v->value), AST_OPT_FLAG_HIGH_PRIORITY);