Revision
15167
Author
anthm
Date
2009-10-16 10:48:40 -0500 (Fri, 16 Oct 2009)

Log Message

make windows restart while it's blocking on the console FSCORE-435 

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.

Modified Paths

Diff

Modified: freeswitch/trunk/src/switch_console.c (15166 => 15167)


--- freeswitch/trunk/src/switch_console.c	2009-10-15 20:54:34 UTC (rev 15166)
+++ freeswitch/trunk/src/switch_console.c	2009-10-16 15:48:40 UTC (rev 15167)
@@ -841,15 +841,16 @@
 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_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 (activity == 102) {
-			fflush(stdout);
-			continue;
+		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 (cmd[0]) {
+				running = switch_console_process(cmd, 0);
+				memset(cmd, 0, sizeof(cmd));
+			}
+			
 		}
 #else
 		FD_ZERO(&rfds);
@@ -890,7 +913,7 @@
 			fflush(stdout);
 			continue;
 		}
-#endif
+
 		memset(&cmd, 0, sizeof(cmd));
 		for (x = 0; x < (sizeof(cmd) - 1); x++) {
 			int c = getchar();
@@ -911,6 +934,7 @@
 		if (cmd[0]) {
 			running = switch_console_process(cmd, 0);
 		}
+#endif
 	}
 }
 #endif

Modified: freeswitch/trunk/src/switch_core.c (15166 => 15167)


--- freeswitch/trunk/src/switch_core.c	2009-10-15 20:54:34 UTC (rev 15166)
+++ freeswitch/trunk/src/switch_core.c	2009-10-16 15:48:40 UTC (rev 15167)
@@ -1593,11 +1593,36 @@
 		}
 		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;