X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fserver%2Fserver.c;h=7e90d89fd2d6af7d1a3cc89b80a70186e84a6c6e;hb=72466de39931cbe872db367c878c5ed17a4b67f3;hp=7fbceb19a71fb3d32e899b506dfeb7ef3a9d2411;hpb=712165f4831afed3a1410579d2e708581e4356fb;p=openocd.git diff --git a/src/server/server.c b/src/server/server.c index 7fbceb19a7..7e90d89fd2 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -44,9 +44,13 @@ static struct service *services; -/* shutdown_openocd == 1: exit the main event loop, and quit the debugger */ +/* shutdown_openocd == 1: exit the main event loop, and quit the + * debugger; 2: quit with non-zero return code */ 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; @@ -496,7 +500,7 @@ int server_loop(struct command_context *command_context) #endif } - return ERROR_OK; + return shutdown_openocd != 2 ? ERROR_OK : ERROR_FAIL; } #ifdef _WIN32 @@ -505,12 +509,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 +539,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; } @@ -553,13 +560,26 @@ int server_init(struct command_context *cmd_ctx) int server_quit(void) { remove_services(); + target_quit(); #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) @@ -589,7 +609,14 @@ COMMAND_HANDLER(handle_shutdown_command) shutdown_openocd = 1; - return ERROR_OK; + if (CMD_ARGC == 1) { + if (!strcmp(CMD_ARGV[0], "error")) { + shutdown_openocd = 2; + return ERROR_FAIL; + } + } + + return ERROR_COMMAND_CLOSE_CONNECTION; } COMMAND_HANDLER(handle_poll_period_command)