From 5087a9554851cd7e1d33d13deb0f5d35b89369f6 Mon Sep 17 00:00:00 2001 From: Mateusz Manowiecki Date: Mon, 5 Jan 2015 16:40:16 +0100 Subject: [PATCH] Added system signal handling to Linux version (with http://www.cons.org/cracauer/sigint.html in mind) Change-Id: I15f559bc1122a408c3fb9338ba55c16fab3187e1 Signed-off-by: Mateusz Manowiecki Reviewed-on: http://openocd.zylin.com/2443 Tested-by: jenkins Reviewed-by: Paul Fertser --- src/openocd.c | 19 +++++++++++-------- src/server/server.c | 26 ++++++++++++++++++++++---- src/server/server.h | 1 + 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/openocd.c b/src/openocd.c index 758febb4df..b0dd21ab2c 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -277,30 +277,28 @@ static int openocd_thread(int argc, char *argv[], struct command_context *cmd_ct int ret; if (parse_cmdline_args(cmd_ctx, argc, argv) != ERROR_OK) - return EXIT_FAILURE; + return ERROR_FAIL; if (server_preinit() != ERROR_OK) - return EXIT_FAILURE; + return ERROR_FAIL; ret = parse_config_file(cmd_ctx); if (ret != ERROR_OK) - return EXIT_FAILURE; + return ERROR_FAIL; ret = server_init(cmd_ctx); if (ERROR_OK != ret) - return EXIT_FAILURE; + return ERROR_FAIL; if (init_at_startup) { ret = command_run_line(cmd_ctx, "init"); if (ERROR_OK != ret) - return EXIT_FAILURE; + return ERROR_FAIL; } server_loop(cmd_ctx); - server_quit(); - - return ret; + return server_quit(); } /* normally this is the main() function entry, but if OpenOCD is linked @@ -338,5 +336,10 @@ int openocd_main(int argc, char *argv[]) adapter_quit(); + if (ERROR_FAIL == ret) + return EXIT_FAILURE; + else if (ERROR_OK != ret) + exit_on_signal(ret); + return ret; } diff --git a/src/server/server.c b/src/server/server.c index 9f9f2f1aa6..9832762f64 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -47,6 +47,9 @@ static struct service *services; /* shutdown_openocd == 1: exit the main event loop, and quit the debugger */ static int shutdown_openocd; +/* store received signal to exit application by killing ourselves */ +static int last_signal; + /* set the polling period to 100ms */ static int polling_period = 100; @@ -505,12 +508,15 @@ BOOL WINAPI ControlHandler(DWORD dwCtrlType) shutdown_openocd = 1; return TRUE; } +#endif void sig_handler(int sig) { + /* store only first signal that hits us */ + if (!last_signal) + last_signal = sig; shutdown_openocd = 1; } -#endif int server_preinit(void) { @@ -532,11 +538,11 @@ int server_preinit(void) /* register ctrl-c handler */ SetConsoleCtrlHandler(ControlHandler, TRUE); + signal(SIGBREAK, sig_handler); +#endif signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); - signal(SIGBREAK, sig_handler); signal(SIGABRT, sig_handler); -#endif return ERROR_OK; } @@ -557,9 +563,21 @@ int server_quit(void) #ifdef _WIN32 WSACleanup(); SetConsoleCtrlHandler(ControlHandler, FALSE); -#endif return ERROR_OK; +#endif + + /* return signal number so we can kill ourselves */ + return last_signal; +} + +void exit_on_signal(int sig) +{ +#ifndef _WIN32 + /* bring back default system handler and kill yourself */ + signal(sig, SIG_DFL); + kill(getpid(), sig); +#endif } int connection_write(struct connection *connection, const void *data, int len) diff --git a/src/server/server.h b/src/server/server.h index b444939729..34c870aabc 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -78,6 +78,7 @@ int add_service(char *name, const char *port, int server_preinit(void); int server_init(struct command_context *cmd_ctx); int server_quit(void); +void exit_on_signal(int); int server_loop(struct command_context *command_context); -- 2.30.2