gdb_server: Log both incoming and outgoing GDB packets
[fw/openocd] / src / helper / options.c
index 1cfa55376afb3a6d1cf9ad4296c958e77f499ceb..f996749ea88bace77de5e2b830edd3857cb9a6ea 100644 (file)
 
 #include <limits.h>
 #include <stdlib.h>
+#include <string.h>
 #if IS_DARWIN
 #include <libproc.h>
 #endif
+/* sys/sysctl.h is deprecated on Linux from glibc 2.30 */
+#ifndef __linux__
 #ifdef HAVE_SYS_SYSCTL_H
 #include <sys/sysctl.h>
 #endif
+#endif
+#if IS_WIN32 && !IS_CYGWIN
+#include <windows.h>
+#endif
 
 static int help_flag, version_flag;
 
@@ -48,7 +55,6 @@ static const struct option long_options[] = {
        {"search",              required_argument,              0,                              's'},
        {"log_output",  required_argument,              0,                              'l'},
        {"command",             required_argument,              0,                              'c'},
-       {"pipe",                no_argument,                    0,                              'p'},
        {0, 0, 0, 0}
 };
 
@@ -172,6 +178,63 @@ static char *find_relative_path(const char *from, const char *to)
        return relpath;
 }
 
+static void add_user_dirs(void)
+{
+       char *path;
+
+#if IS_WIN32
+       const char *appdata = getenv("APPDATA");
+
+       if (appdata) {
+               path = alloc_printf("%s/OpenOCD", appdata);
+               if (path) {
+                       /* Convert path separators to UNIX style, should work on Windows also. */
+                       for (char *p = path; *p; p++) {
+                               if (*p == '\\')
+                                       *p = '/';
+                       }
+                       add_script_search_dir(path);
+                       free(path);
+               }
+       }
+       /* WIN32 may also have HOME defined, particularly under Cygwin, so add those paths below too */
+#endif
+
+       const char *home = getenv("HOME");
+#if IS_DARWIN
+       if (home) {
+               path = alloc_printf("%s/Library/Preferences/org.openocd", home);
+               if (path) {
+                       add_script_search_dir(path);
+                       free(path);
+               }
+       }
+#endif
+       const char *xdg_config = getenv("XDG_CONFIG_HOME");
+
+       if (xdg_config) {
+               path = alloc_printf("%s/openocd", xdg_config);
+               if (path) {
+                       add_script_search_dir(path);
+                       free(path);
+               }
+       } else if (home) {
+               path = alloc_printf("%s/.config/openocd", home);
+               if (path) {
+                       add_script_search_dir(path);
+                       free(path);
+               }
+       }
+
+       if (home) {
+               path = alloc_printf("%s/.openocd", home);
+               if (path) {
+                       add_script_search_dir(path);
+                       free(path);
+               }
+       }
+}
+
 static void add_default_dirs(void)
 {
        char *path;
@@ -188,32 +251,11 @@ static void add_default_dirs(void)
         * listed last in the built-in search order, so the user can
         * override these scripts with site-specific customizations.
         */
-       const char *home = getenv("HOME");
-
-       if (home) {
-               path = alloc_printf("%s/.openocd", home);
-               if (path) {
-                       add_script_search_dir(path);
-                       free(path);
-               }
-       }
-
        path = getenv("OPENOCD_SCRIPTS");
-
        if (path)
                add_script_search_dir(path);
 
-#ifdef _WIN32
-       const char *appdata = getenv("APPDATA");
-
-       if (appdata) {
-               path = alloc_printf("%s/OpenOCD", appdata);
-               if (path) {
-                       add_script_search_dir(path);
-                       free(path);
-               }
-       }
-#endif
+       add_user_dirs();
 
        path = alloc_printf("%s/%s/%s", exepath, bin2data, "site");
        if (path) {
@@ -239,7 +281,7 @@ int parse_cmdline_args(struct command_context *cmd_ctx, int argc, char *argv[])
                /* getopt_long stores the option index here. */
                int option_index = 0;
 
-               c = getopt_long(argc, argv, "hvd::l:f:s:c:p", long_options, &option_index);
+               c = getopt_long(argc, argv, "hvd::l:f:s:c:", long_options, &option_index);
 
                /* Detect the end of the options. */
                if (c == -1)
@@ -266,31 +308,19 @@ int parse_cmdline_args(struct command_context *cmd_ctx, int argc, char *argv[])
                                break;
                        case 'd':               /* --debug | -d */
                        {
-                               char *command = alloc_printf("debug_level %s", optarg ? optarg : "3");
-                               int retval = command_run_line(cmd_ctx, command);
-                               free(command);
+                               int retval = command_run_linef(cmd_ctx, "debug_level %s", optarg ? optarg : "3");
                                if (retval != ERROR_OK)
                                        return retval;
                                break;
                        }
                        case 'l':               /* --log_output | -l */
-                               if (optarg) {
-                                       char *command = alloc_printf("log_output %s", optarg);
-                                       command_run_line(cmd_ctx, command);
-                                       free(command);
-                               }
+                               if (optarg)
+                                       command_run_linef(cmd_ctx, "log_output %s", optarg);
                                break;
                        case 'c':               /* --command | -c */
                                if (optarg)
                                    add_config_command(optarg);
                                break;
-                       case 'p':
-                               /* to replicate the old syntax this needs to be synchronous
-                                * otherwise the gdb stdin will overflow with the warning message */
-                               command_run_line(cmd_ctx, "gdb_port pipe; log_output openocd.log");
-                               LOG_WARNING("deprecated option: -p/--pipe. Use '-c \"gdb_port pipe; "
-                                               "log_output openocd.log\"' instead.");
-                               break;
                        default:  /* '?' */
                                /* getopt will emit an error message, all we have to do is bail. */
                                return ERROR_FAIL;