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;
;
*p = c;
- service->max_connections--;
+ if (service->max_connections != CONNECTION_LIMIT_UNLIMITED)
+ service->max_connections--;
return ERROR_OK;
}
*p = c->next;
free(c);
- service->max_connections++;
+ if (service->max_connections != CONNECTION_LIMIT_UNLIMITED)
+ service->max_connections++;
+
break;
}
/* handle new connections on listeners */
if ((service->fd != -1)
&& (FD_ISSET(service->fd, &read_fds))) {
- if (service->max_connections > 0)
+ if (service->max_connections != 0)
add_connection(service, command_context);
else {
if (service->type == CONNECTION_TCP) {
#endif
}
- return ERROR_OK;
+ return shutdown_openocd != 2 ? ERROR_OK : ERROR_FAIL;
}
#ifdef _WIN32
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)
{
/* 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;
}
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)
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)