aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorMateusz Manowiecki <segmentation@fault.pl>2015-01-05 16:40:16 +0100
committerPaul Fertser <fercerpav@gmail.com>2015-03-09 06:25:45 +0000
commit5087a9554851cd7e1d33d13deb0f5d35b89369f6 (patch)
tree5b97ba8d8257778bd12f76a00c7245cc56ca18f7 /src/server
parentef0fa97a717e7f1d7af276f7d67897803c505d35 (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.c26
-rw-r--r--src/server/server.h1
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);