Ctrl+C signals are a special case for Windows and can be handled by registering a handle through SetConsoleCtrlHandler() routine. This is only useful when we run it directly on console and not as services in the background.
Once we get a Ctrl+C signal, we call the cleanup functions and then exit. One thing to know here is that MinGW terminal handles Ctrl+C signal differently (and looks a little buggy. I see it exiting the handler midway with some sort of timeout). So this implementation is only useful when run on Windows terminal. Since we only use MinGW for compilation and eventually to run unit tests, it should be okay. (The unit tests would ideally use windows services and not expect Ctrl+C) Signed-off-by: Gurucharan Shetty <gshe...@nicira.com> --- lib/fatal-signal.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/fatal-signal.c b/lib/fatal-signal.c index 1e63d48..6b3dd20 100644 --- a/lib/fatal-signal.c +++ b/lib/fatal-signal.c @@ -66,6 +66,9 @@ static struct ovs_mutex mutex; static void atexit_handler(void); static void call_hooks(int sig_nr); +#ifdef _WIN32 +static BOOL WINAPI ConsoleHandlerRoutine(DWORD dwCtrlType); +#endif /* Initializes the fatal signal handling module. Calling this function is * optional, because calling any other function in the module will also @@ -91,6 +94,9 @@ fatal_signal_init(void) char *msg_buf = ovs_lasterror_to_string(); VLOG_FATAL("Failed to create a event (%s).", msg_buf); } + + /* Register a function to handle Ctrl+C. */ + SetConsoleCtrlHandler(ConsoleHandlerRoutine, true); #endif for (i = 0; i < ARRAY_SIZE(fatal_signals); i++) { @@ -235,6 +241,15 @@ call_hooks(int sig_nr) } } } + +#ifdef _WIN32 +BOOL WINAPI ConsoleHandlerRoutine(DWORD dwCtrlType) +{ + stored_sig_nr = SIGINT; + SetEvent(wevent); + return true; +} +#endif /* Files to delete on exit. */ static struct sset files = SSET_INITIALIZER(&files); -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev