]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
make windows restart while it's blocking on the console FSCORE-435
authorAnthony Minessale <anthony.minessale@gmail.com>
Fri, 16 Oct 2009 15:48:40 +0000 (15:48 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Fri, 16 Oct 2009 15:48:40 +0000 (15:48 +0000)
Should work in every case with 1 exception
if you have started to type a command on the real console and never hit enter then do a *restart* not a shutdown, you will have to complete the command.

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@15167 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/switch_console.c
src/switch_core.c

index 547530643beb9fe1ce6566956d2a10309f9a9e40..cb13a7ec62cd5d902b25a61837578b96bf119942 100644 (file)
@@ -841,15 +841,16 @@ SWITCH_DECLARE(switch_status_t) switch_console_set_complete(const char *string)
 SWITCH_DECLARE(void) switch_console_loop(void)
 {
 
-       char cmd[2048];
-       int32_t activity = 1;
-       switch_size_t x = 0;
-
+       char cmd[2048] = "";
+       int32_t activity = 1, r;        
        gethostname(hostname, sizeof(hostname));
 
        while (running) {
                int32_t arg;
-#ifndef _MSC_VER
+#ifdef _MSC_VER
+               HANDLE stdinHandle = GetStdHandle(STD_INPUT_HANDLE);
+               INPUT_RECORD in[128];
+#else
                fd_set rfds, efds;
                struct timeval tv = { 0, 20000 };
 #endif
@@ -863,11 +864,33 @@ SWITCH_DECLARE(void) switch_console_loop(void)
                        switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_CONSOLE, "\nfreeswitch@%s> ", hostname);
                }
 #ifdef _MSC_VER
-               activity = WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 20);
+               r = WaitForSingleObject(stdinHandle, 200);
+               activity = 0;
+
+               if (r == WAIT_OBJECT_0) {
+                       DWORD bytes = 0;
+                       DWORD read, i;
+                       PeekConsoleInput(stdinHandle, in, 128, &read);
+                       for (i = 0; i < read; i++) {
+                               if (in[i].EventType == KEY_EVENT && !in[i].Event.KeyEvent.bKeyDown) {
+                                       activity = 1;
+                                       break;
+                               }
+                       }
+                       if (activity) {
+                               char *end;
+                               ReadConsole(stdinHandle, cmd, sizeof(cmd), &bytes, NULL);
+                               end = end_of_p(cmd);
+                               while(*end == '\r' || *end == '\n') {
+                                       *end-- = '\0';  
+                               }
+                       }
 
-               if (activity == 102) {
-                       fflush(stdout);
-                       continue;
+                       if (cmd[0]) {
+                               running = switch_console_process(cmd, 0);
+                               memset(cmd, 0, sizeof(cmd));
+                       }
+                       
                }
 #else
                FD_ZERO(&rfds);
@@ -890,7 +913,7 @@ SWITCH_DECLARE(void) switch_console_loop(void)
                        fflush(stdout);
                        continue;
                }
-#endif
+
                memset(&cmd, 0, sizeof(cmd));
                for (x = 0; x < (sizeof(cmd) - 1); x++) {
                        int c = getchar();
@@ -911,6 +934,7 @@ SWITCH_DECLARE(void) switch_console_loop(void)
                if (cmd[0]) {
                        running = switch_console_process(cmd, 0);
                }
+#endif
        }
 }
 #endif
index f538be32712da1bb1ae87b7117a377ed61e16903..dac26e80e1a0cf5746e123bf72a1dfba159ee7d8 100644 (file)
@@ -1593,11 +1593,36 @@ SWITCH_DECLARE(int32_t) switch_core_session_ctl(switch_session_ctl_t cmd, int32_
                }
                break;
        case SCSC_SHUTDOWN:
+
+#ifdef _MSC_VER
+               {
+                       HANDLE shutdown_event;  
+                       char path[512];
+                       /* for windows we need the event to signal for shutting down a background FreeSWITCH */
+                       snprintf(path, sizeof(path), "Global\\Freeswitch.%d", getpid());
+
+                       /* open the event so we can signal it */
+                       shutdown_event = OpenEvent(EVENT_MODIFY_STATE, FALSE, path);
+
+               
+                       if (shutdown_event) {
+                               /* signal the event to shutdown */
+                               SetEvent(shutdown_event);
+                               /* cleanup */
+                               CloseHandle(shutdown_event);
+                       }
+               }
+#endif
+
+
                if (*val) {
                        switch_set_flag((&runtime), SCF_RESTART);
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Restarting\n");
                } else {
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Shutting down\n");
+#ifdef _MSC_VER
+                       fclose(stdin);
+#endif
                }
                runtime.running = 0;
                break;