(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>
int ret;
if (parse_cmdline_args(cmd_ctx, argc, argv) != ERROR_OK)
int ret;
if (parse_cmdline_args(cmd_ctx, argc, argv) != ERROR_OK)
if (server_preinit() != ERROR_OK)
if (server_preinit() != ERROR_OK)
ret = parse_config_file(cmd_ctx);
if (ret != ERROR_OK)
ret = parse_config_file(cmd_ctx);
if (ret != ERROR_OK)
ret = server_init(cmd_ctx);
if (ERROR_OK != ret)
ret = server_init(cmd_ctx);
if (ERROR_OK != ret)
if (init_at_startup) {
ret = command_run_line(cmd_ctx, "init");
if (ERROR_OK != ret)
if (init_at_startup) {
ret = command_run_line(cmd_ctx, "init");
if (ERROR_OK != ret)
- server_quit();
-
- return ret;
}
/* normally this is the main() function entry, but if OpenOCD is linked
}
/* normally this is the main() function entry, but if OpenOCD is linked
+ if (ERROR_FAIL == ret)
+ return EXIT_FAILURE;
+ else if (ERROR_OK != ret)
+ exit_on_signal(ret);
+
/* shutdown_openocd == 1: exit the main event loop, and quit the debugger */
static int shutdown_openocd;
/* 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;
/* set the polling period to 100ms */
static int polling_period = 100;
shutdown_openocd = 1;
return TRUE;
}
shutdown_openocd = 1;
return TRUE;
}
void sig_handler(int sig)
{
void sig_handler(int sig)
{
+ /* store only first signal that hits us */
+ if (!last_signal)
+ last_signal = sig;
int server_preinit(void)
{
int server_preinit(void)
{
/* register ctrl-c handler */
SetConsoleCtrlHandler(ControlHandler, TRUE);
/* register ctrl-c handler */
SetConsoleCtrlHandler(ControlHandler, TRUE);
+ signal(SIGBREAK, sig_handler);
+#endif
signal(SIGINT, sig_handler);
signal(SIGTERM, sig_handler);
signal(SIGINT, sig_handler);
signal(SIGTERM, sig_handler);
- signal(SIGBREAK, sig_handler);
signal(SIGABRT, sig_handler);
signal(SIGABRT, sig_handler);
#ifdef _WIN32
WSACleanup();
SetConsoleCtrlHandler(ControlHandler, FALSE);
#ifdef _WIN32
WSACleanup();
SetConsoleCtrlHandler(ControlHandler, FALSE);
+#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)
}
int connection_write(struct connection *connection, const void *data, int len)
int server_preinit(void);
int server_init(struct command_context *cmd_ctx);
int server_quit(void);
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);
int server_loop(struct command_context *command_context);