Change return value on error.
[fw/openocd] / src / openocd.c
index 5f890dbe0fc231019a4c925b9c0fea3d211f306c..60cbf232a61d1c8e68f006a2d5c3dc2606791149 100644 (file)
@@ -31,7 +31,7 @@
 #include "openocd.h"
 #include <jtag/driver.h>
 #include <jtag/jtag.h>
-#include <jtag/transport.h>
+#include <transport/transport.h>
 #include <helper/ioutil.h>
 #include <helper/util.h>
 #include <helper/configuration.h>
 
 #include <server/server.h>
 #include <server/gdb_server.h>
-#include <server/httpd.h>
 
 #ifdef HAVE_STRINGS_H
 #include <strings.h>
 #endif
 
-
 #define OPENOCD_VERSION \
                "Open On-Chip Debugger " VERSION RELSTR " (" PKGBLDDATE ")"
 
@@ -63,15 +61,15 @@ static int jim_version_command(Jim_Interp *interp, int argc,
        const char *str = "";
        char * version_str;
        version_str = OPENOCD_VERSION;
-       
+
        if (argc == 2)
                str = Jim_GetString(argv[1], NULL);
 
        if (strcmp("git", str) == 0)
        {
                version_str = GITVERSION;
-       } 
-       
+       }
+
        Jim_SetResult(interp, Jim_NewStringObj(interp, version_str, -1));
 
        return JIM_OK;
@@ -197,6 +195,7 @@ static const struct command_registration openocd_command_handlers[] = {
                .handler = &handle_noinit_command,
                .mode = COMMAND_CONFIG,
                .help = "Prevent 'init' from being called at startup.",
+               .usage = ""
        },
        {
                .name = "init",
@@ -206,14 +205,14 @@ static const struct command_registration openocd_command_handlers[] = {
                        "Changes command mode from CONFIG to EXEC.  "
                        "Unless 'noinit' is called, this command is "
                        "called automatically at the end of startup.",
-
+               .usage = ""
        },
        {
                .name = "add_script_search_dir",
                .handler = &handle_add_script_search_dir_command,
                .mode = COMMAND_ANY,
                .help = "dir to search for config files and scripts",
-
+               .usage = "<directory>"
        },
        COMMAND_REGISTRATION_DONE
 };
@@ -237,7 +236,7 @@ struct command_context *setup_command_handler(Jim_Interp *interp)
        struct command_context *cmd_ctx = command_init(startup, interp);
 
        /* register subsystem commands */
-       typedef int (*command_registrant_t)(struct command_context *cmd_ctx);
+       typedef int (*command_registrant_t)(struct command_context *cmd_ctx_value);
        static const command_registrant_t command_registrants[] = {
                &openocd_register_commands,
                &server_register_commands,
@@ -271,31 +270,14 @@ struct command_context *setup_command_handler(Jim_Interp *interp)
        return cmd_ctx;
 }
 
-/* normally this is the main() function entry, but if OpenOCD is linked
- * into application, then this fn will not be invoked, but rather that
- * application will have it's own implementation of main(). */
-int openocd_main(int argc, char *argv[])
+/** 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;
 
-       /* initialize commandline interface */
-       struct command_context *cmd_ctx;
-
-       cmd_ctx = setup_command_handler(NULL);
-
-       if (util_init(cmd_ctx) != ERROR_OK)
-               return EXIT_FAILURE;
-
-       if (ioutil_init(cmd_ctx) != ERROR_OK)
-               return EXIT_FAILURE;
-
-       LOG_OUTPUT("For bug reports, read\n\t"
-               "http://openocd.berlios.de/doc/doxygen/bugs.html"
-               "\n");
-
-       command_context_mode(cmd_ctx, COMMAND_CONFIG);
-       command_set_output_handler(cmd_ctx, configuration_output_handler, NULL);
-
        if (parse_cmdline_args(cmd_ctx, argc, argv) != ERROR_OK)
                return EXIT_FAILURE;
 
@@ -306,9 +288,6 @@ int openocd_main(int argc, char *argv[])
        if (ret != ERROR_OK)
                return EXIT_FAILURE;
 
-       if (httpd_start(cmd_ctx) != ERROR_OK)
-               return EXIT_FAILURE;
-
        ret = server_init(cmd_ctx);
        if (ERROR_OK != ret)
                return EXIT_FAILURE;
@@ -317,16 +296,43 @@ int openocd_main(int argc, char *argv[])
        {
                ret = command_run_line(cmd_ctx, "init");
                if (ERROR_OK != ret)
-                       ret = EXIT_FAILURE;
+                       return EXIT_FAILURE;
        }
 
-       /* handle network connections */
-       if (ERROR_OK == ret)
-               server_loop(cmd_ctx);
+       server_loop(cmd_ctx);
 
        server_quit();
 
-       httpd_stop();
+       return ret;
+}
+
+/* normally this is the main() function entry, but if OpenOCD is linked
+ * into application, then this fn will not be invoked, but rather that
+ * application will have it's own implementation of main(). */
+int openocd_main(int argc, char *argv[])
+{
+       int ret;
+
+       /* initialize commandline interface */
+       struct command_context *cmd_ctx;
+
+       cmd_ctx = setup_command_handler(NULL);
+
+       if (util_init(cmd_ctx) != ERROR_OK)
+               return EXIT_FAILURE;
+
+       if (ioutil_init(cmd_ctx) != ERROR_OK)
+               return EXIT_FAILURE;
+
+       LOG_OUTPUT("For bug reports, read\n\t"
+               "http://openocd.sourceforge.net/doc/doxygen/bugs.html"
+               "\n");
+
+       command_context_mode(cmd_ctx, COMMAND_CONFIG);
+       command_set_output_handler(cmd_ctx, configuration_output_handler, NULL);
+
+       /* Start the executable meat that can evolve into thread in future. */
+       ret = openocd_thread(argc, argv, cmd_ctx);
 
        unregister_all_commands(cmd_ctx, NULL);