diff options
author | Mateusz Manowiecki <segmentation@fault.pl> | 2015-01-05 16:40:16 +0100 |
---|---|---|
committer | Paul Fertser <fercerpav@gmail.com> | 2015-03-09 06:25:45 +0000 |
commit | 5087a9554851cd7e1d33d13deb0f5d35b89369f6 (patch) | |
tree | 5b97ba8d8257778bd12f76a00c7245cc56ca18f7 /src/server | |
parent | ef0fa97a717e7f1d7af276f7d67897803c505d35 (diff) |
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 <segmentation@fault.pl>
Reviewed-on: http://openocd.zylin.com/2443
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/server.c | 26 | ||||
-rw-r--r-- | src/server/server.h | 1 |
2 files changed, 23 insertions, 4 deletions
diff --git a/src/server/server.c b/src/server/server.c index 9f9f2f1a..9832762f 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 b4449397..34c870aa 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); |