+/** OpenOCD runtime meat that can become single-thread in future. It parse
+ * commandline, reads configuration, sets up the target and starts server loop.
+ * Commandline arguments are passed into this function from openocd_main().
+ */
+static int openocd_thread(int argc, char *argv[], struct command_context *cmd_ctx)
+{
+ int ret;
+
+ if (parse_cmdline_args(cmd_ctx, argc, argv) != ERROR_OK)
+ return ERROR_FAIL;
+
+ if (server_preinit() != ERROR_OK)
+ return ERROR_FAIL;
+
+ ret = parse_config_file(cmd_ctx);
+ if (ret == ERROR_COMMAND_CLOSE_CONNECTION) {
+ server_quit(); /* gdb server may be initialized by -c init */
+ return ERROR_OK;
+ } else if (ret != ERROR_OK) {
+ server_quit(); /* gdb server may be initialized by -c init */
+ return ERROR_FAIL;
+ }
+
+ ret = server_init(cmd_ctx);
+ if (ERROR_OK != ret)
+ return ERROR_FAIL;
+
+ if (init_at_startup) {
+ ret = command_run_line(cmd_ctx, "init");
+ if (ERROR_OK != ret) {
+ server_quit();
+ return ERROR_FAIL;
+ }
+ }
+
+ ret = server_loop(cmd_ctx);
+
+ int last_signal = server_quit();
+ if (last_signal != ERROR_OK)
+ return last_signal;
+
+ if (ret != ERROR_OK)
+ return ERROR_FAIL;
+ return ERROR_OK;
+}
+